博客
关于我
stderr 和 rotate log
阅读量:477 次
发布时间:2019-03-06

本文共 2239 字,大约阅读时间需要 7 分钟。

日志轮转库的实现

在程序开发中,日志功能是非常重要的。对于开源日志库如 log4j 到 C++ 的 log4cpp,各大公司也都有自己的日志库实现。这些日志库通常支持分离的线程和缓存机制,以减少日志写入操作对程序性能的影响,特别是在不能阻塞的场景下。

文件轮转日志库的实现

为了满足普通项目中对日志功能的需求,我实现了一个文件轮转日志库。这个日志库支持将日志内容轮转到多个文件中,每次文件满写时换新文件,并对旧文件进行编号。例如,日志文件可能按照 my.log, my.log.1, my.log.2 等形式轮转。

核心功能实现

该日志库的核心功能包括:

  • 日志级别控制:支持 DEBUG, INFO, WARN, ERROR, ALERT 等级别。
  • 文件轮转:当文件达到预设大小或文件数量限制时,自动换新文件。
  • 文件锁机制:避免多个进程同时写入同一文件导致的数据竞争。
  • 代码实现如下:

    #ifndef ROTATE_LOG_INC
    #define ROTATE_LOG_INC
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    namespace rotate_log { enum { DEBUG = 0, INFO, WARN, ERROR, ALERT }; class RotateLog { public: RotateLog(); ~RotateLog(); int init(char* basename, int file_size, int file_num, int level = DEBUG); int set_level(int level); int get_level() const; int close(); int reopen(); bool is_too_big(); int check(); int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len); int manage_log(); int shift_file(char* basename, int num); }; #define ROTATE_LOG(log, level, format, ...) \ do { \ if (log.level >= level) { \ log.check(); \ fprintf(log.file_, "%s[%d][%s][%d]: " format "\n", #level, __FILE__, __LINE__); \ } \ } while (0) #define ROTATE_LOG_TO_FILE(log, basename, file_size, file_num) } #endif

    标准错误日志库的实现

    除了文件轮转日志库,还实现了一个基于标准错误输出的日志库。这种日志库可以将标准错误输出重定向到文件中,并支持轮转。代码实现如下:

    #ifndef STDERR_LOG_INC
    #define STDERR_LOG_INC
    #include
    #include
    namespace stderr_log {
    enum {
    DEBUG = 0,
    INFO,
    WARN,
    ERROR,
    ALERT
    };
    int __attribute__((weak)) g_log_level = 0;
    int __attribute__((weak)) g_log_pid = getpid();
    void set_level(int level);
    int get_level() const;
    void set_pid(pid_t pid);
    #define STDERR_LOG(level, format, ...) \
    do { \
    if (stderr_log::level >= stderr_log::g_log_level) { \
    fprintf(stderr, "[%s][%d][%s][%d]: " format "\n", #level, __FILE__, __LINE__, __VA_ARGS__); \
    } \
    } while (0)
    }
    #endif

    日志轮转策略

    程序何时检测日志是否需要轮转,主要取决于具体应用的需求。为了保证高效性,我采取了“策略于机制分离”的原则。在 CGI 程序中,通常在处理每个请求前进行日志检测。

    日志轮转的实现可以灵活配置,支持基于文件大小或文件数量的轮转策略。这种灵活性使得日志管理更加高效,能够适应不同应用场景的需求。

    通过以上日志轮转库的实现,可以轻松管理程序的日志输出,确保日志的高效写入和管理。

    转载地址:http://igtbz.baihongyu.com/

    你可能感兴趣的文章
    mysql8.0新特性-自增变量的持久化
    查看>>
    Mysql8.0注意url变更写法
    查看>>
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>
    Mysql: 对换(替换)两条记录的同一个字段值
    查看>>
    mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
    查看>>
    MYSQL:基础——3N范式的表结构设计
    查看>>
    MYSQL:基础——触发器
    查看>>
    Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
    查看>>
    mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
    查看>>
    mysqldump 参数--lock-tables浅析
    查看>>
    mysqldump 导出中文乱码
    查看>>
    mysqldump 导出数据库中每张表的前n条
    查看>>