用C/C++编写日志文件

问题描述 投票:0回答:7

我想用 C++ 写一个日志文件。我正在处理某些事物,因此我需要维护我处理的事物的属性日志,以便我可以恢复到此日志文件以查看我特别感兴趣的任何事物的属性...有人可以帮助我吗实现这一目标?

c++ file logging
7个回答
58
投票

标准的日志记录方法(根据我的经验)是使用 stdout 或 stderr 流。在 C++ 中要使用这些,您需要包含 iostream,并按如下方式使用:

#include <iostream>

int main(int argc, char* argv[])
{
  using std::cout;
  using std::cerr;
  using std::endl;

  cout << "Output message" << endl;
  cerr << "Error message" << endl;
}

然而,这只能实现打印到这些输出,这些输出通常最终到达终端。如果您想使用这些标准流方法(非常可读)输出到文件,那么您必须以某种方式重定向您的输出。实现此目的的一种方法是使用 cstdio 提供的

freopen
函数。它的作用是打开一个文件,并将给定的流移动到该文件。请参阅此处了解文档。一个例子是:

#include <iostream>
#include <cstdio>

int main(int argc, char* argv[])
{
  using namespace std;
  freopen( "output.txt", "w", stdout );
  freopen( "error.txt", "w", stderr );

  cout << "Output message" << endl;
  cerr << "Error message" << endl;
}

(我已经改为

using namespace std;
,只是为了简洁。)

您正在将标准输出流

stdout
(由
cout
使用)移动到 output.txt(在写入模式下),并且您将
stderr
(由
cerr
使用)移动到错误.txt 也处于写入模式。

希望这能起到作用。


34
投票

这非常方便;只需插入例如从程序中的任何位置调用的一些通用头文件(更好的方法是使用这些函数形成一个类)

inline string getCurrentDateTime( string s ){
    time_t now = time(0);
    struct tm  tstruct;
    char  buf[80];
    tstruct = *localtime(&now);
    if(s=="now")
        strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
    else if(s=="date")
        strftime(buf, sizeof(buf), "%Y-%m-%d", &tstruct);
    return string(buf);
};
inline void Logger( string logMsg ){

    string filePath = "/somedir/log_"+getCurrentDateTime("date")+".txt";
    string now = getCurrentDateTime("now");
    ofstream ofs(filePath.c_str(), std::ios_base::out | std::ios_base::app );
    ofs << now << '\t' << logMsg << '\n';
    ofs.close();
}

用途:

Logger("This is log message");
写入文件(或附加现有文件)

/somedir/log_2017-10-20.txt 

内容:

2017-10-20 09:50:59 This is log message

5
投票

您尝试做的事情太深入,无法提供有关堆栈溢出的完整解决方案。您可以做的是查看您选择的日志库的文档。就我而言,这是

Boost.Log
,一个用于 Boost C++ 库的日志库,可以在此处找到其文档。

我刚刚链接到的页面底部指出了

该库不是 Boost 库集合的官方部分 虽然已经审核通过,暂时接受。这 审核结果可在此处获得。

所以你可以随心所欲。


4
投票

为什么不使用众多可用的日志框架之一,例如 Apache log4cxx?我建议这样做,而不是尝试自己动手 - 为什么要重新发明轮子?


1
投票
#include<string>
#include <fstream>

inline std::string getCurrentDateTime( std::string s ){
    time_t now = time(0);
    struct tm  tstruct;
    char  buf[80];
    tstruct = *localtime(&now);
    if(s=="now")
        strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
    else if(s=="date")
        strftime(buf, sizeof(buf), "%Y-%m-%d", &tstruct);
    return  std::string(buf);
};

inline void Logger(std::string logMsg){
    std::string filePath = "./log_"+getCurrentDateTime("date")+".txt";
    std::string now = getCurrentDateTime("now");
    std::ofstream ofs(filePath.c_str(), std::ios_base::out | std::ios_base::app );
    ofs << now << '\t' << logMsg << '\n';
    ofs.close();
}

例如:

Logger("JAMLEE: ---------| start VT_SETMODE");

0
投票

您可能还想考虑https://github.com/johnwbyrd/logog。 它是一个面向性能的 C++ 日志系统。 但是,如果这对您的项目来说有点过于激烈,那么旧的 cerr 和 cout 就可以很好地解决这个问题。


0
投票

使用 C++ 编写程序,以日志文件(原始格式)进行编程,分析输入内容(日期、事件类型、消息等)和统计产品(类型名称、日期过滤... )

目标

  1. 充电器和日志文件(例如 syslog.txt)。 2.解析器检查额外的日期、类型(信息、警告、错误等)以及消息。 3.compter le nombre d'ocurence de chaque typere d'evénement 4.过滤日期、活动类型、消息中的主题

出席者

  • 附注:例如“信息:45,警告:7,错误:2 -研究的可能性(例如“afficher uniquement les log du 2024-12-31) -菜单控制台(1 = 统计数据,2 = 过滤器日期,3 = 过滤器类型等)

元素使用者 - 讲座(par ligne) -对日期、类型、消息进行额外的操作(解析)

  • 动态表格或 std::vector(en c++) 存放主菜 -结构(struct ou classe)代表日志(日期,类型,消息)

贝索因 -compilateur c/c++(clang ou GCC) -Connaissances de fichier(i/o) et parsing(extraction des sous-chaines) -过滤和压缩算法(哈希图或简单毛球)

规格补充 - 进行性能分析(临时错误等) -Gerer des regex pour la recherche de messages - 导出其他文件中的统计信息(CSV、JSON) -关闭交互模式或批处理模式(使用参数)

© www.soinside.com 2019 - 2024. All rights reserved.