log4cpp
Log4cpp 全功能开发指南 Log4cpp是C++领域最成熟的日志管理库之一,移植自Java生态的log4j,支持动态优先级控制、多输出源、自定义格式等功能。
一、核心组件
-
Category(日志类别) 管理日志分类和优先级过滤机制,采用树形继承结构,支持日志级别: DEBUG < INFO < WARN < ERROR < FATAL
-
Appender(输出源) 定义日志输出目标:
- FileAppender 文件输出
- RollingFileAppender 滚动文件(自动分割)
- ConsoleAppender 控制台输出
- SyslogAppender 系统日志
- Layout(布局) 控制日志格式:
// 典型Pattern格式 "%d [%p] %c: %m%n" // 对应:日期 [优先级] 类目: 消息+换行1
二、环境配置
Linux安装
wget https://sourceforge.net/projects/log4cpp/files/log4cpp-1.1.3.tar.gz
tar zxvf log4cpp-1.1.3.tar.gz
cd log4cpp && ./configure && make && make install
Windows编译
使用VS打开msvc6/log4cpp.sln
三、完整代码示例
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/RollingFileAppender.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/PropertyConfigurator.hh>
// 基础配置初始化
void initBasicLog() {
// 创建格式化器
PatternLayout* layout = new PatternLayout();
layout->setConversionPattern("%d{%Y-%m-%d %H:%M:%S.%l} [%p] %m%n");
// 控制台输出
Appender* consoleApp = new OstreamAppender("console", &std::cout);
consoleApp->setLayout(layout);
// 创建格式化器
PatternLayout* layout1 = new PatternLayout();
layout1->setConversionPattern("%d{%Y-%m-%d %H:%M:%S.%l} [%p] %m%n");
// 文件输出(自动滚动)
RollingFileAppender* fileApp = new RollingFileAppender("fileApp", "demo.log", 10*1024*1024, 5);
fileApp->setLayout(layout1);
// 配置主日志器
Category& root = Category::getRoot();
root.setPriority(Priority::DEBUG);
root.addAppender(consoleApp);
root.addAppender(fileApp);
}
// 配置文件加载
void initConfigLog() {
try {
log4cpp::PropertyConfigurator::configure("log4cpp.conf");
} catch(log4cpp::ConfigureFailure& f) {
std::cerr << "配置加载失败: " << f.what() << std::endl;
}
}
int main() {
// 初始化方式任选其一
initBasicLog(); // 代码初始化
// initConfigLog(); // 文件配置初始化
log4cpp::Category& logger = log4cpp::Category::getInstance("MainModule");
// 多级别日志记录
logger.debug(" 调试信息: 变量x=%d", 42);
logger.info(" 系统启动完成");
logger.warn(" 磁盘空间剩余10%%");
logger.error(" 数据库连接失败");
// NDC诊断上下文(多线程追踪)
log4cpp::NDC::push("RequestID:1001");
logger << log4cpp::Priority::INFO << "处理用户请求";
log4cpp::NDC::pop();
log4cpp::Category::shutdown();
return 0;
}
四、配置文件示例(log4cpp.conf )
定义输出源
log4cpp.appender.file=RollingFileAppender
log4cpp.appender.file.fileName=app.log
log4cpp.appender.file.maxFileSize=10485760
log4cpp.appender.file.maxBackupIndex=5
log4cpp.appender.file.layout=PatternLayout
log4cpp.appender.file.layout.conversionPattern=%d [%p] %c: %m%n
#### 设置日志级别和输出源
log4cpp.rootCategory=DEBUG, file
log4cpp.category.Network=INFO
五、高级功能
-
动态配置重载 通过PropertyConfigurator::watch()实现运行时配置更新
-
多线程安全 所有组件线程安全,支持高并发日志写入
-
自定义Appender 继承log4cpp::AppenderSkeleton实现自定义输出目标(如数据库)
-
日志过滤器 使用Filter实现基于内容的正则过滤
六、性能优化建议
生产环境建议使用RollingFileAppender限制日志大小 非调试阶段设置rootCategory=WARN减少IO消耗 避免高频次DEBUG日志影响程序性能