【问题标题】:Circular file logging循环文件记录
【发布时间】:2012-07-02 10:27:20
【问题描述】:

我想知道是否有任何 C 的记录器库,可以进行循环文件记录?

我目前正在研究 log4C,但找不到足够的文档可以说它会进行循环日志记录。

如果有人这样做过。请告诉我。

谢谢

【问题讨论】:

    标签: c logging


    【解决方案1】:

    这是一个例子

    这是一个精简版。在我们的中,我们使用 vargs 并在调用 log_it 之前对其进行格式化。


    typedef const char* c_str;
    FILE* log_fp = 0;
    const int max_log_size = 4 * 1024 * 1024;
    const int max_no = 5;
    c_str prefix = "logs_";
    c_str postfix = ".txt";
    
    void log_it( c_str str )
        {
        char file1[100], file2[100];
    
        if( ! log_fp )
            {
            sprintf( file1 "%s%d%s", prefix, 0, postfix );
            log_fp = fopen( file1, "a" );
            }
    
        if( log_fp )
            {
            if( ftell( log_fp ) > max_log_size )
                {
                fclose( log_fp );
                log_fp = 0;
    
                for( int i = (max_no - 1); i >= 0; i-- )
                    {
                    sprintf( file1 "%s%d%s", prefix, i, postfix );
                    sprintf( file1 "%s%d%s", prefix, i+1, postfix );
                    rename( file1, file2 );
                    }
    
                sprintf( file1 "%s%d%s", prefix, 0, postfix );
                log_fp = fopen( file1, "a" );
                }
    
            fputs( str, log_fp );
            fflush( log_fp );
            }
        }
    

    希望对你有帮助。

    戴夫

    【讨论】:

    • 那是滚动日志而不是循环日志。还有 log_fp = 0;应该可能是 log_fp = -1;但这并不重要,因为它总是会被覆盖。
    • 事实上,如果 log_fp = fopen(file1, "a");曾经返回 0 作为文件描述符。
    • 我认为你混淆了 open(2) 和 fopen(3)
    • 我认为使用静态 int 和 mod 任何人都应该能够将其更改为循环日志记录。
    • 此外,此代码可以通过多种方式进行改进。但是如果应该帮助某人开始自己做;)
    【解决方案2】:

    您确定要循环记录吗?我认为滚动日志会更好。

    循环记录:记录到 log.1 然后 log.2 然后 log.3 然后 log.4 然后返回 log.1

    滚动日志记录:有四个日志文件,其中 log.1 始终是最新的,而 log.2,3,4 是较旧的日志条目?

    【讨论】:

    • 为什么不呢?在开发环境上运行时,您可能会很快耗尽磁盘空间,从而产生大量日志。在我的工作场所,由于大量进程和调试输出,我们使用滚动日志
    • 他要求循环日志,我认为他可能应该想要滚动日志。我不明白你为什么问“为什么不?”。
    【解决方案3】:

    似乎Log4C 在这一点上没有得到很好的记录。他们确实指向 Log4J 页面,其中提到了“滚动”日志,这可能是您想要的吗?这可能只是术语混淆的问题。

    【讨论】:

      猜你喜欢
      • 2019-07-28
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 2012-12-30
      相关资源
      最近更新 更多