我想用C++编写日志文件。 我正在处理某些事情,因此我需要维护我处理的事物的属性的日志,以便我可以恢复到此日志文件以查看任何特别感兴趣的属性.. 有人可以帮助我在实现这个?在c/C++中编写日志文件
回答
非常感谢所有的答复......我认为我所寻找的答案是即使UTF8中的日志文件的格式就像一个txt文件,所以c在编写这些类型的文件时没有问题文件提供简单的文件写入。
为什么不使用许多可用的日志框架之一,如Apache log4cxx?我会提出这个建议,而不是试图推出自己的 - 为什么重新发明轮子?
日志的标准方法(以我的经验)是使用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并且在写入模式下。
希望这可以做到。
我会推荐std :: clog over std :: cout和std :: cerr。 –
在你提到它之前,我从来没有听说过堵塞物。我可以看到为什么缓冲版本的stderr可能会有用 - 但为什么使用它代替cout?两者都有什么问题? – VolatileStorm
技术上?没有。但这是进行正常记录的标准方式。就像cerr应该用于错误日志记录,而cout用于控制台输出。 说实话?我一个星期前才听说过。 –
您试图做的事情太深奥,以至于无法在此网站上提供强有力的解决方案。你可以做的是检查你选择的日志库的文档。在我的情况下,这是Boost.Log
,这是一个用于Boost C++ libraries的looging库,可以找到它的文档here。
它指出,在我刚刚链接到
这个库是不是加速的正式组成部分的页面底部库收集 虽然它已通过审查,并暂时接受。 评论结果可用here。
因此,你会做什么。
您可能也想考虑http://www.logog.org。这是一个面向性能的C++日志记录系统。但是,如果对于您的项目来说这太过激烈,那么旧的cerr和cout就可以正常工作。
这是非常方便,只需插入例如一些常见的头文件从程序的任何地方被调用(更好的方法是,以形成具有这些功能的一个类)
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
- 1. 为php程序编写日志文件
- 2. 编写一个查询日志文件
- 3. 使用Java EE编写日志文件
- 4. 使用Powerpoint编写日志文件
- 5. 如何编写c#日志文件?
- 6. 如何在文件中写入日志?
- 7. 如何在日志文件log4j中只写入INFO日志?
- 8. 在azure blob存储中编写应用程序日志文件
- 9. 如何使用android在日志文件中编写异常?
- 10. 无法在Linux中使用PHP编写日志文件
- 11. 如何在Objective C中编写日志文件?
- 12. 写入日志文件
- 13. powershell写入日志文件
- 14. C#写入日志文件
- 15. 写并发日志文件
- 16. Log4j不写日志文件
- 17. 写一个日志文件
- 18. 将日志写入文件
- 19. Scrapy日志记录:配置日志重写日志文件
- 20. 日志无法写入日志文件,但写的classpath 安慰
- 21. 将日志消息写入日志文件中openscript
- 22. Glassfish LDAP日志记录正在填写日志文件
- 23. Log4j 2日志正在写入Log4j日志文件
- 24. 在日志文件上的读写
- 25. 写入日志文件在Flex 4.6
- 26. log4j日志正在写入catalina.out文件
- 27. 在哪里写日志文件?
- 28. 如何编写事件日志类别
- 29. 使用python 2.7.9编写日志文件中的消息格式
- 30. 查找CC攻击的IP通过日志文件
你指的是某种撤销/重做系统? – cyco130
看看[在此](http://stackoverflow.com/questions/696321/best-logging-framework-for-native-c) – StevieG
@ cyco130我认为OP意味着“引用回”而不是“回复回到“,而不是某种撤销/重做系统。 (“回复”这个词可能会花费太多的时间用git!) – RoG