Limesn
Limesn
发布于 2026-09-17 / 1 阅读
0

第四章 日志log4cpp

1. 日志是干什么用的?

日志(Log)是记录程序运行状态、系统操作、异常信息等内容的记录文件。
主要作用包括:

  • 调试与排错(Debug):在程序出现问题时,通过日志定位错误发生的位置和上下文。
  • 系统监控:实时了解程序的运行状态(如CPU、内存、业务流程进度)。
  • 审计与安全:记录用户操作历史,用于事后追溯。
  • 数据分析:收集用户行为或系统性能数据用于后续分析。

2. log4cpp使用的时候如何编译运行?

以 Linux 环境下的 C++ 为例:

  • 安装:通常通过包管理器安装(如 sudo apt-get install liblog4cpp5-dev),或下载源码编译安装。
  • 编译:在编译自己的 C++ 代码时,必须链接 log4cpp 库和 pthread 库。
    g++ main.cpp -o app -llog4cpp -lpthread
    
  • 运行:如果 log4cpp 安装在非标准路径,运行时需要指定动态库路径:
    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
    ./app
    

3. log4cpp的几个组件都是什么?分别有什么作用?

log4cpp 的设计参考了 log4j,核心组件主要有四个:

  • Category(日志记录器):系统的核心入口。开发者通过它调用日志接口(如 info(), error())。它维护了日志的层级结构(树状结构),并决定日志是否被记录。
  • Appender(输出目的地/附加器):负责将日志输出到具体的地方。常见的有 ConsoleAppender(控制台)、FileAppender(文件)、RollingFileAppender(回滚文件)等。一个 Category 可以挂载多个 Appender。
  • Layout(格式化器/布局):负责决定日志在输出时的具体显示格式(如包含时间、级别、消息、行号等)。
  • Priority(优先级/日志级别):用于过滤日志。级别从低到高通常为:DEBUG < INFO < WARN < ERROR < FATAL。Category 会设定一个阈值,低于阈值的日志将被丢弃。

4. RollingFileAppender是什么?有什么作用?

  • 是什么:它是 FileAppender 的子类,是一种支持文件“回滚(Rolling)”的附加器。
  • 作用:解决日志文件无限增长导致磁盘爆满的问题。当正在写入的日志文件达到设定的大小(maxFileSize)时,它会自动将该文件重命名(例如 app.log 重命名为 app.log.1),并创建一个新的 app.log 继续写入。同时可以通过 maxBackupIndex 限制保留历史文件的数量,超出数量的最老文件会被删除。

5. 自定义输出格式时,%c %d %p %m %n分别表示什么意思?

在使用 PatternLayout 自定义格式时,这些占位符的含义如下:

  • %c:表示Category(记录器名称)
  • %d:表示日期和时间(可以带花括号指定格式,如 %d{%Y-%m-%d %H:%M:%S})。
  • %p:表示Priority(日志级别)(如 DEBUG, INFO, ERROR)。
  • %m:表示Message(日志消息内容)
  • %n:表示换行符(Newline)
  • (补充:常见还有 %F 文件名,%L 行号,%t 线程名,%r 程序启动以来的毫秒数。)

6. 用自己的语言描述日志产生到输出的过程,并用流程图描述

文字描述:

  1. 产生日志:开发者在代码中调用 Category 的日志记录方法(如 logger.info("hello"))。
  2. 级别过滤Category 首先检查这条日志的级别是否达到了它设定的阈值。如果级别太低(比如设定了 WARN,传入的是 INFO),直接丢弃;否则继续。
  3. 封装事件:将该日志的级别、消息、时间戳、线程等上下文信息封装成一个 LoggingEvent 对象。
  4. 分发处理Category 把这个事件分发给它绑定的所有 Appender
  5. 格式化:每个 Appender 调用绑定的 Layout,把 LoggingEvent 对象转换成指定格式的字符串。
  6. 输出目的地Appender 将格式化好的字符串写入对应的目的地(如终端控制台、磁盘文件或网络)。

流程图描述(Mermaid):

级别低于阈值
级别符合要求
用户代码调用日志接口
Category级别过滤
丢弃日志
创建LoggingEvent对象
分发给绑定的Appender
Layout格式化LoggingEvent
Appender输出到目的地
控制台 Console
文件 File / RollingFile
网络 / 其他