C++ 记录器在崩溃后未将记录的信息存储到文件中

C++ 记录器在崩溃后未将记录的信息存储到文件中,c++,logging,C++,Logging,好吧,如果一个记录者只在事情进展顺利时保存记录,那它又有什么用呢 这是一件非常简单的事情,记录器,我想在扩展它之前测试它: //记录器.h class Logger : boost::noncopyable { public: static void write(std::string const& msg, int line, std::string const& file); private: Logger(); private: stat

好吧,如果一个记录者只在事情进展顺利时保存记录,那它又有什么用呢

这是一件非常简单的事情,记录器,我想在扩展它之前测试它:

//记录器.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";
}
std::of流记录器::m_sOut(“日志文件”);
void Logger::write(const std::string&msg,int行,const std::string&file,Level Level/*=Info*/)
{

m_sOut在windows上,您可以使用刷新日志文件。

听起来您需要在写入后刷新:

m_sOut.flush();

我会说,这取决于它崩溃的时间。如果是在日志输出过程中,那么所有的赌注都没有了

首先,我要确保每次调用后都会刷新日志输出,因此我会在
write()
中使用
std::endl
而不是
\n
。您还必须验证这是否足够,或者是否必须采取其他步骤来确保正在使用的流没有缓冲区写入


编辑:正如评论中指出的那样,在没有任何缓存/缓冲的情况下写入磁盘既慢又昂贵。这是一种折衷——如果你绝对必须有这样的要求,除非程序在log语句中崩溃,否则你不能丢失任何日志信息,那么你可能必须这样做。我可能会放松这一要求记住一点,仅仅依靠
std::endl
的行为就会导致流被刷新;这仍然会使流下面的缓冲区像操作系统缓冲区一样就位,但您很有可能不会丢失任何日志输出。

我认为这要求您的日志子系统至少处于separa中不受管理的进程,您应该通过高带宽协议(如共享内存)与进行通信。

每次调用后刷新(如通过标记文件\u标记\u写入\u)非常昂贵且缓慢,请尽可能避免。@ruslik,你是对的,这不是一个便宜的选择,但这取决于当涉及到日志记录的可靠性时,要求有多严格。我想说的是,通过以惰性方式使用fflush(来自未处理的异常过滤器)这个问题是以最小的努力和不牺牲速度来解决的。如果它真的是安全的(如@Preet所建议的,使用单独的过程),那么整个架构都应该改变。