log4cplus相关链接
GitHub:https://github.com/log4cplus/log4cplus
api文档:https://log4cplus.sourceforge.io/docs/html/index.html
CodeExamples:https://sourceforge.net/p/log4cplus/wiki/CodeExamples/
log4cplus是log4j的C++实现,提供的接口和使用逻辑与log4j基本保持一致,在了解log4cplus之前,先了解以下log4j的设计方法:一个著名的日志系统是怎么设计出来的?
可以参见 api文档
类功能Loggerlog4cplus的核心包Appender用于指定内容输出位置(如:控制台,文件、远程服务器等)。一个Logger可添加多个Appender,从而向多个位置输出日志。扩展此类可以实现自己的日志语句打印策略Layout用于指定日志输出的格式。每个Appender需要设置一个Layout。用Initializer类进行初始化 log4cplus::Initializer initializer;
创建Appender对象。
appender(new log4cplus::ConsoleAppender()) 创建 console 的appender对象
设置Appender的名称和输出格式(Layout)
setName函数设置appender名称;setLayout函数设置layout对象,可以直接new一个新的
获得一个Logger实例,并设置其日志输出等级阈值
getInstance函数获取实例; setLogLevel函数设置日志输出等级阈值
给Logger实例添加Appender
logger.addAppender(appender);
使用宏输出日志(宏的等级有6个,分别为:FATAL, ERROR, WARN, INFO, DEBUG, TRACE。FATAL宏的名为LOG4CPLUS_FATAL( ),ERROR的宏的名为LOG4CPLUS_ERROR( ),以此类推。具体使用方法见示例。)
注: 一个Logger实例被配置后,将一直存在于程序中,在程序的任何地方都可通过实例名称获取到这个Logger。
代码: OutputLogToConsole GitHub
#include <iostream> #include <log4cplus/log4cplus.h> #include <log4cplus/initializer.h> int main() { //第1步:用Initializer类进行初始化 log4cplus::Initializer initializer; //第2步:创建ConsoleAppender; //SharedAppenderPtr 指向一个Appender的指针,这里new 了一个 ConsoleAppender log4cplus::SharedAppenderPtr appender(new log4cplus::ConsoleAppender()); //第3步:设置Appender的名称和输出格式(SimpleLayout) // unique_ptr 智能指针 appender->setName(LOG4CPLUS_TEXT("console")); appender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout)); //第4步:获得一个Logger实例,并设置其日志输出等级阈值 log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test")); logger.setLogLevel(log4cplus::INFO_LOG_LEVEL); //第5步:为Logger实例添加ConsoleAppender logger.addAppender(appender); //第6步:使用宏将日志输出 LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world")); return 0; }输出:
INFO - Hello worldConsoleAppender 和 FileAppender
代码:OutputLogToFileAndConsle GitHub
#include <iostream> #include <log4cplus/log4cplus.h> #include <log4cplus/initializer.h> int main() { //第1步:用Initializer类进行初始化 log4cplus::Initializer initializer; //第2步:创建ConsoleAppender; //SharedAppenderPtr 指向一个Appender的指针,这里new 了一个 ConsoleAppender log4cplus::SharedAppenderPtr consoleAppender(new log4cplus::ConsoleAppender()); // std::ios_base::app 每次进行写入操作的时候都会重新定位到文件的末尾. log4cplus::SharedAppenderPtr fileAppender(new log4cplus::FileAppender(LOG4CPLUS_TEXT("./logs/log.txt"),std::ios_base::app,true,true)); //第3步:设置consoleAppender的名称和输出格式(SimpleLayout) fileAppender的名称和pattern格式(PatternLayout) // unique_ptr 智能指针 consoleAppender->setName(LOG4CPLUS_TEXT("console")); consoleAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout)); fileAppender->setName(LOG4CPLUS_TEXT("file")); // 参见 https://log4cplus.sourceforge.io/docs/html/classlog4cplus_1_1PatternLayout.html //2020/10/16 16:13:03,481.502 [140068134246208] INFO test - Hello world [/home/leacock/CLionProjects/Log4CplusDemo/OutputLogToFileAndConsle/main.cpp:33] // %D{%Y/%m/%d %H:%M:%S,%Q} 2020/10/16 16:13:03,481.502 时间 %D 表本地时间, 年/月/日/ 时:分:秒:毫秒 //[%t] [140068134246208] 输出生成日志事件的线程的线程id //%-5p INFO 输出日志事件的日志级别 %-5 如果名称小于5个字符长,则右侧加空格。 //%c test 用于输出记录日志的是哪个logger,这里 在getInstance(LOG4CPLUS_TEXT ("test"))设置了名称 //%m Hello world 输出与logger关联的应用程序提供消息。 //%l 等同于 "%F:%L" F:用于输出日志请求发出时的文件名 L:用于输出从何处发出日志请求的行号。 //%n 输出换行 log4cplus::tstring pattern = LOG4CPLUS_TEXT("%D{%Y/%m/%d %H:%M:%S,%Q} [%t] %-5p %c - %m [%l]%n"); fileAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::PatternLayout(pattern))); //第4步:获得一个Logger实例,并设置其日志输出等级阈值 log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test")); logger.setLogLevel(log4cplus::INFO_LOG_LEVEL); //第5步:为Logger实例添加ConsoleAppender 与 FileAppender logger.addAppender(consoleAppender); logger.addAppender(fileAppender); //第6步:使用宏将日志输出 LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world")); }输出:
ConsoleAppender 和 rollFileAppender
代码:OutputLogToRollFileAndConsle GitHub
#include <iostream> #include <log4cplus/log4cplus.h> #include <log4cplus/initializer.h> int main() { log4cplus::Initializer initializer; log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("./config/log.properties")); }log.properties 如下
# log4cplus.rootLogger = TINFO, consoleAppender, rollFileAppender log4cplus.rootLogger = TRACE, consoleAppender, rollFileAppender # 日志级别 appendes log4cplus.appender.consoleAppender = log4cplus::ConsoleAppender log4cplus.appender.consoleAppender.layout = log4cplus::PatternLayout log4cplus.appender.consoleAppender.layout.ConversionPattern = %D{%Y/%m/%d %H:%M:%S,%Q} %-5p %c [%l] - %m %n log4cplus.appender.rollFileAppender = log4cplus::RollingFileAppender # roll文件名 带路径 log4cplus.appender.rollFileAppender.File = ./logs/RollFileLogs/roll_file.log log4cplus.appender.rollFileAppender.MaxFileSize = 1MB log4cplus.appender.rollFileAppender.MaxBackupIndex = 100 # 如果文件夹不存在 true 可创建 log4cplus.appender.rollFileAppender.CreateDirs = true log4cplus.appender.rollFileAppender.ImmediateFlush = true log4cplus.appender.rollFileAppender.layout = log4cplus::PatternLayout log4cplus.appender.rollFileAppender.layout.ConversionPattern = %D{%Y/%m/%d %H:%M:%S,%Q} %-5p %c [%l] - %m %nCMakeLists.txt文件
cmake_minimum_required(VERSION 3.15) project(OutputLogToRollFileAndConsle) set(CMAKE_CXX_STANDARD 11) set(libraries log4cplus) # 将代码中config文件夹中数据拷贝到 执行目录 file(GLOB configFiles config/*) file (COPY ${configFiles} DESTINATION ${CMAKE_BINARY_DIR}/config) add_executable(${PROJECT_NAME} main.cpp) target_link_libraries(${PROJECT_NAME} ${libraries})输出: