...
| 代码块 |
|---|
#include <log4cpp/Category.hh>
#include <log4cpp/Appender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/Layout.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/PropertyConfigurator.hh>
int main() {
// 日志类别
log4cpp::Category &root_logger = log4cpp::Category::getRoot(); // 获取root日志器,root日志器名称默认为空
log4cpp::Category &file_logger = log4cpp::Category::getInstance("file_logger"); // 获取指定名称为file_logger的日志器
// 日志输出地
log4cpp::Appender *coutAppender = new log4cpp::OstreamAppender("cout", &std::cout); // 输出到终端
log4cpp::FileAppender *fileAppender = new log4cpp::FileAppender("file", "./log.txt"); // 输出到文件
// 日志格式
log4cpp::PatternLayout *coutPattern = new log4cpp::PatternLayout();
coutPattern->setConversionPattern("[%d{%Y-%m-%d %H:%M:%S:%l}] %p %m%n"); // 格式:[年:月:日 时:分:秒:毫秒] 日志级别 日志内容
log4cpp::PatternLayout *filePattern = new log4cpp::PatternLayout();
filePattern->setConversionPattern("[%d{%Y-%m-%d %H:%M:%S:%l}] %R %c %p %m%n"); // 格式:[年:月:日 时:分:秒:毫秒] UTC秒数 日志器名称 日志级别 日志内容
// 绑定日志器和appender,设置日志器的输出级别
coutAppender->setLayout(coutPattern);
root_logger.addAppender(coutAppender);
root_logger.setPriority(log4cpp::Priority::INFO);
fileAppender->setLayout(filePattern);
file_logger.addAppender(fileAppender);
file_logger.setPriority(log4cpp::Priority::ERROR);
// 支持c风格的日志打印和流式的日志打印
root_logger.debug("debug msg");
root_logger.debugStream() << "debug msg by stream";
root_logger.info("info msg");
root_logger.infoStream() << "info msg by stream";
root_logger.error("error msg");
root_logger.errorStream() << "err msg by stream";
file_logger.debug("debug msg");
file_logger.debugStream() << "debug msg by stream";
file_logger.info("info msg");
file_logger.infoStream() << "info msg by stream";
file_logger.error("error msg");
file_logger.errorStream() << "err msg by stream";
return 0;
} |
上面的代码在终端输出如下:
| 代码块 |
|---|
[2021-06-25 09:33:59:734] INFO info msg
[2021-06-25 09:33:59:734] INFO info msg by stream
[2021-06-25 09:33:59:734] ERROR error msg
[2021-06-25 09:33:59:734] ERROR err msg by stream
[2021-06-25 09:33:59:734] ERROR error msg
[2021-06-25 09:33:59:734] ERROR err msg by stream |
日志文件内容如下:
| 代码块 | ||
|---|---|---|
| ||
[2021-06-25 09:33:59:734] 1624584839 file_logger ERROR error msg
[2021-06-25 09:33:59:734] 1624584839 file_logger ERROR err msg by stream |
对于log4cpp总结如下:
1. Category对应日志器类,使用 log4cpp::Category::getInstance() 获取指定名称的日志器实例,如果两个日志器名称相同,那么对应同一个日志器实例。
2. 使用Category的的setPriority()方法设置日志器的日志级别,日志级别使用log4cpp::Priority枚举值来表示。
3. 使用Appender来表示日志输出地,Appender可以细分为OstreamAppender和FileAppender等不同类型,一个Category可以有多个Appender,通过addAppender()方法为Category新增Appender。
4. 使用PatternLayout来表示日志的格式,通过字符串来表示,比如%d表示时间,后面可用{}指定具体的时间格式,%R表示UTC秒数,%c表示日志器名称,%p表示日志级别,%m表示日志消息等
5. PatternLayout和Appender绑定,Priority和Category绑定,也就是Appender不具备日志级别判断功能。
...