记录器在崩溃后没有将记录的信息存储到文件中
Logger Not Storing Recorded Information to File After a Crash
那么,如果记录器只在事情进展顺利时进行记录,那么它有什么用呢?
这是一个非常简单的东西,记录器,我想在扩展它之前进行测试:
//Logger.hclass Logger : boost::noncopyable
{
public:
static void write(std::string const& msg, int line, std::string const& file);
private:
Logger();
private:
static std::ofstream m_sOut;
};
#define LOG(msg) Logger::write(msg, __LINE__, __FILE__)
//Logger.cpp std::ofstream Logger::m_sOut("Logfile");
void Logger::write(const std::string &msg, int line, const std::string &file, Level level /* = Info */)
{
m_sOut << file << ": " << line << ": " << msg << "n";
}
恐怕这太简单了。如果我正常退出程序,它将按照预期输出到我的日志文件中。但是,如果发生崩溃,则没有输出。
我必须做些什么来确保它输出到日志,而不管崩溃吗?
我认为这取决于它何时崩溃。如果在日志输出期间是,那么所有的赌注都取消了。
首先,我要确保日志输出在每次调用后都被刷新,所以我在write()
中使用std::endl
而不是n
。你还必须验证这是否足够,或者你必须采取额外的步骤来确保你正在使用的流没有缓冲写。
编辑:正如在评论中指出的那样,在没有任何缓存/缓冲的情况下写到磁盘是缓慢和昂贵的。这是一种权衡——如果您绝对必须要求不能丢失任何日志信息,除非程序在日志语句期间崩溃,那么您可能必须这样做。我可能会稍微放松这个要求,只依靠std::endl
的行为,应该导致流被冲洗;这仍然会留下流下面的缓冲区,就像操作系统缓冲区一样,但是您有一个很好的机会,您不会丢失任何日志输出。
我认为这需要您的日志子系统至少在一个单独管理的进程中,并且您应该通过高带宽协议进行通信-例如共享内存。
在windows上,您可以使用SetUnhandledExceptionFilter来刷新日志文件
听起来像是写完后需要冲洗:
m_sOut.flush();
相关文章:
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 按字母顺序打印存储在字符数组中的信息
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- 对于存储另一个类所需信息的类,例如其构造,是否有设计模式?
- structtm是否将时区信息存储为其数据成员
- 将不同的模板化类存储在一个容器中,而不会丢失有关其类型的信息
- 合法的方式将destructor信息存储到void*
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 为什么C++不使用集中存储类型信息以实现高效的 RTTI
- (C++) 如何从要存储在结构数组中的二进制文件中读取.dat信息?
- 我应该如何存储从文件中获取的这些信息?
- 如何将循环中的信息存储到数组中
- 使用 fstream 对象将文件中的信息存储到变量中
- 数组的指针,该数组的每个元素的内存空间信息存储在哪里
- 将文件中的信息存储在类对象 (C++) 中
- 将switch语句中的信息存储到变量中
- 如何将*.css文件(文本文件)的内容与附加信息存储在新文件中?
- 将矩阵信息存储在STL矢量中.哪个是更好的矢量,哪个是矢量中的矢量
- 用于临时错误信息存储的实用工具类
- 记录器在崩溃后没有将记录的信息存储到文件中