我想用c ++编写一个日志文件。 我正在处理某些事情,因此我需要维护我处理的事物的属性的日志,以便我可以恢复到这个日志文件,以查看特别感兴趣的任何事物的属性。 有人可以帮助我实现这个目标吗?
答案 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++ libraries的here文档的looging库here。
我在页面底部指出了我刚刚与
相关联的内容此库不是Boost库集合的官方部分 虽然它已通过审查并暂时被接受。该 审核结果可用{{3}}。
所以你要做的就是。
答案 3 :(得分:3)
为什么不使用许多可用的日志框架之一,例如Apache log4cxx?我会建议这样做,而不是试图自己动手 - 为什么重新发明轮子?
答案 4 :(得分:0)
您也可以考虑http://www.logog.org。它是一个面向性能的C ++日志系统。但是,如果你的项目有点过于激烈,那么老的cerr和cout就可以正常工作。
答案 5 :(得分:-5)
非常感谢所有的回复...我认为我正在寻找的答案是,甚至UTF8中的日志文件的格式就像一个txt文件所以c在编写这种文件时没有问题用它提供的简单文件编写。