记录器在崩溃后没有将记录的信息存储到文件中

Logger Not Storing Recorded Information to File After a Crash

本文关键字:信息 存储 文件 记录 崩溃 记录器      更新时间:2023-10-16

那么,如果记录器只在事情进展顺利时进行记录,那么它有什么用呢?

这是一个非常简单的东西,记录器,我想在扩展它之前进行测试:

//Logger.h

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