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

nod*_*ddy 11 c++ logging file

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

Vol*_*orm 31

记录的标准方法(根据我的经验)是使用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;
}
Run Code Online (Sandbox Code Playgroud)

然而,这只能实现对那些通常最终到达终端的输出的打印.如果要使用这些标准流方法(可读性很强)输出到文件,则必须以某种方式重定向输出.一种方法是使用freopencstdio提供的函数.这样做是打开一个文件,并将给定的流移动到该文件.请参阅此处获取文档 一个例子是:

#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;
}
Run Code Online (Sandbox Code Playgroud)

(我using namespace std;为了简洁而改为那里.)

您正在将标准输出流stdout(由其使用cout)移动到output.txt(在写入模式下),并且您也在写入模式下移动stderr(由...使用cerr)到error.txt.

希望这可以解决问题.

  • 是否有选项将`std :: clog`和`std :: cerr`重定向到单独的文件中,因为两者似乎都写入了示例位置.像`freopen("log.txt","w",stdlog);`? (3认同)
  • 可以两者都保留吗?重定向到日志文件*和*输出到控制台? (3认同)
  • 我建议在std :: cout和std :: cerr上使用std :: clog。 (2认同)
  • 在您提到木c之前,我实际上从未听说过木log。我可以看到为什么stderr的缓冲版本可能有用-但是为什么要用它代替cout?两者怎么了? (2认同)

Str*_*oup 9

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

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();
}
Run Code Online (Sandbox Code Playgroud)

用法:Logger(“这是日志消息”); 写入文件(或追加现有文件)

/somedir/log_2017-10-20.txt 
Run Code Online (Sandbox Code Playgroud)

内容:

2017-10-20 09:50:59 This is log message
Run Code Online (Sandbox Code Playgroud)


小智 6

您尝试做的事情太深入了,无法在此网站上提供强制解决方案.您可以做的是查看您选择的日志库的文档.在我的例子中,这是Boost.Log一个用于Boost C++库的looging库,其文档可以在这里找到.

我在页面底部指出了我刚刚与之相关的内容

该库不是Boost图书馆馆藏的官方部分,尽管它已通过审核并暂时被接受.审查结果可在此处获得.

所以你要做的就是这样.


raz*_*ebe 4

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