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