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文档
类 | 功能 |
---|---|
Logger | log4cplus的核心包 |
Appender | 用于指定内容输出位置(如:控制台,文件、远程服务器等)。一个Logger可添加多个Appender,从而向多个位置输出日志。扩展此类可以实现自己的日志语句打印策略 |
Layout | 用于指定日志输出的格式。每个Appender需要设置一个Layout。 |
Appendder
Log4cplus::Appendder的继承图:
Log4cplus::Layout的继承图:
Log4cplus基本使用步骤
-
用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。
使用与示例
例1:将日志输出到控制台
#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 world
例2:将日志输出到控制台并写入文件
ConsoleAppender 和 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"));
}
输出:
例3:使用配置文件将日志输出到控制台并写入文件
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 %n
CMakeLists.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})
输出: