2011-09-13 105 views
6

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

+0

你指的是某种撤销/重做系统? – cyco130

+1

看看[在此](http://stackoverflow.com/questions/696321/best-logging-framework-for-native-c) – StevieG

+0

@ cyco130我认为OP意味着“引用回”而不是“回复回到“,而不是某种撤销/重做系统。 (“回复”这个词可能会花费太多的时间用git!) – RoG

回答

-4

非常感谢所有的答复......我认为我所寻找的答案是即使UTF8中的日志文件的格式就像一个txt文件,所以c在编写这些类型的文件时没有问题文件提供简单的文件写入。

2

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

24

日志的标准方法(以我的经验)是使用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

我会推荐std :: clog over std :: cout和std :: cerr。 –

+1

在你提到它之前,我从来没有听说过堵塞物。我可以看到为什么缓冲版本的stderr可能会有用 - 但为什么使用它代替cout?两者都有什么问题? – VolatileStorm

+1

技术上?没有。但这是进行正常记录的标准方式。就像cerr应该用于错误日志记录,而cout用于控制台输出。 说实话?我一个星期前才听说过。 –

5

您试图做的事情太深奥,以至于无法在此网站上提供强有力的解决方案。你可以做的是检查你选择的日志库的文档。在我的情况下,这是Boost.Log,这是一个用于Boost C++ libraries的looging库,可以找到它的文档here

它指出,在我刚刚链接到

这个库是不是加速的正式组成部分的页面底部库收集 虽然它已通过审查,并暂时接受。 评论结果可用here

因此,你会做什么。

0

您可能也想考虑http://www.logog.org。这是一个面向性能的C++日志记录系统。但是,如果对于您的项目来说这太过激烈,那么旧的cerr和cout就可以正常工作。

2

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

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

用法:记录器(“这是日志信息”); 写入一个文件(或追加现有文件)

/somedir/log_2017-10-20.txt 

与内容:

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