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

时间:2011-09-13 10:32:59

标签: c++ file logging

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

6 个答案:

答案 0 :(得分:26)

标记的日志记录方法(根据我的经验)是使用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函数。这样做是打开一个文件,并将给定的流移动到该文件。有关文档,请参阅here。一个例子是:

#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)用于写入模式的error.txt。

希望这可以解决问题。

答案 1 :(得分:6)

这非常方便,只需插入例如从程序中的任何地方调用一些常见的头文件(更好的方法是形成具有这些函数的类)

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();
}

用法:记录器(&#34;这是日志消息&#34;); 写入文件(或附加现有文件)

/somedir/log_2017-10-20.txt 

内容:

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

答案 2 :(得分:5)

您尝试做的事情太过深入,无法在此网站上提供强制解决方案。您可以做的是查看您选择的日志库的文档。在我的情况下,那是Boost.Log,可以找到Boost C++ librarieshere文档的looging库here

我在页面底部指出了我刚刚与

相关联的内容
  

此库不是Boost库集合的官方部分   虽然它已通过审查并暂时被接受。该   审核结果可用{{3}}。

所以你要做的就是。

答案 3 :(得分:3)

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

答案 4 :(得分:0)

您也可以考虑http://www.logog.org。它是一个面向性能的C ++日志系统。但是,如果你的项目有点过于激烈,那么老的cerr和cout就可以正常工作。

答案 5 :(得分:-5)

非常感谢所有的回复...我认为我正在寻找的答案是,甚至UTF8中的日志文件的格式就像一个txt文件所以c在编写这种文件时没有问题用它提供的简单文件编写。