使用现有日志记录库(C ++)限制日志大小

时间:2019-04-20 11:24:05

标签: c++

作为C ++的初学者,我发现自己尝试使用ezlogger库限制日志文件大小时遇到​​问题:http://axter.com/ezlogger/

我的看法是: 1)每n秒检查一次日志文件大小 2)如果大小太大,请开始记录到第二个文件(事先清除它),然后每n秒在文件之间切换一次。

我做了1。我通过更改日志记录库使用的符号链接作为日志记录输出文件位置来解决2(该应用程序在Linux上运行)。但是,该库似乎保留了对原始文件的引用,并且在更改链接后从未开始登录到新文件。

我之所以决定采用这种方式,是因为我不想接触图书馆。对于有经验的程序员,以某种方式修改库以启用切换日志文件可能更有意义。但是,由于所有的静态变量和方法以及包含实际代码的hpp文件,我都无法理解,也不知道从哪里开始。

因此,我想我正在寻找有关当前方法的意见,以帮助其正常工作和/或就如何以不同的方式/更好地进行操作提供建议。

谢谢。

编辑:我正在处理一个已有的较旧项目,该项目已经使用ezlogger,因此,如果可能的话,我希望避免使用其他库。

1 个答案:

答案 0 :(得分:1)

按照建议使用logrotate(如果使用的是unix之类的系统),或者修改日志库。您提到的那些静态变量似乎位于get_log_stream()中。修改将需要检查每个get_log_stream调用的当前日志文件的大小。如果大小超过字节数,则重新打开流。我认为该日志记录库不是线程安全的,因此可能并非如此,因此您不必担心它。但是,如果您的应用程序是多线程的,请记下它。

get_log_stream的修改如下(其伪代码):

// ...    

if (logfile_is_open) {
    if (logfile.tellp() > 1024*1024*10 /*10MB*/) {
        logfile.close();
        logfile.clear(); //clears flags
        // TODO: update FileName accordingly, ie. add a count to it.
        // TODO: remove older log files, etc.
        logfile.open(FileName.c_str(), std::ios_base::out);
    }
}

// Below is old code.

if (logfile_is_open) return logfile;
return std::cout;