Log4cplus 介绍及使用
一、基本的类
类 | 功能 |
---|---|
Logger | 记录日志的句柄。 |
Appender | 用于指定内容输出位置(如:控制台,文件、远程服务器等)。一个Logger可添加多个Appender,从而向多个位置输出日志。 |
Layout | 用于指定日志输出的格式。每个Appender需要设置一个Layout。 |
Logger —— Appender —— Layout的关系图:
二、Log4cplus支持的Appender的类型
上图是Appender的继承关系,其中Log4cplus::Appnder是各种Appender的父类。从图中,我们可以获得log4cplus所支持的Appender的类型。
三、Log4cplus支持的Layout的类型
上图是Layout的继承关系,其中Log4cplus::Layout是各种Layout的父类。从图中,我们可以得知Layout的类型有3种,分别为PatternLayout、SimpleLayout和TTCCLayout。其中的PatternLayout可以让用户自定义输出格式。
四、Log4cplus的基本使用步骤:
创建Appender对象。
设置Appender的名称和输出格式(Layout)
获得一个Logger实例,并设置其日志输出等级阈值
给Logger实例添加Appender
使用宏输出日志(宏的等级有6个,分别为:FATAL, ERROR, WARN, INFO, DEBUG, TRACE。FATAL宏的名为LOG4CPLUS_FATAL( ),ERROR的宏的名为LOG4CPLUS_ERROR( ),以此类推。具体使用方法见示例。)
注:一个Logger实例被配置后,将一直存在于程序中,在程序的任何地方都可通过实例名称获取到这个Logger,不用重新配置。
五、示例
之后的内容将通过示例来展示log4cplus的基本使用方法。
例1:将日志输出到控制台并写入文件
# include <log4cplus/log4cplus.h>
int main()
{
//用Initializer类进行初始化
log4cplus::Initializer initializer;
//第1步:创建ConsoleAppender和FileAppender(参数app表示内容追加到文件)
log4cplus::SharedAppenderPtr consoleAppender(new log4cplus::ConsoleAppender);
log4cplus::SharedAppenderPtr fileAppender(new log4cplus::FileAppender(
LOG4CPLUS_TEXT("log.txt"),
std::ios_base::app
)
);
//第2步:设置Appender的名称和输出格式
//ConsoleAppender使用SimpleLayout
//FileAppender使用PatternLayout
consoleAppender->setName(LOG4CPLUS_TEXT("console"));
consoleAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout()));
fileAppender->setName(LOG4CPLUS_TEXT("file"));
log4cplus::tstring pattern = LOG4CPLUS_TEXT("%D{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p %c - %m [%l]%n");
fileAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::PatternLayout(pattern)));
//第3步:获得一个Logger实例,并设置其日志输出等级阈值
log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);
//第4步:为Logger实例添加ConsoleAppender和FileAppender
logger.addAppender(consoleAppender);
logger.addAppender(fileAppender);
//第5步:使用宏将日志输出
LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));
return 0;
}
运行结果:控制台输出 “INFO - Hello world”,同时,在目录中生成名称为 “log.txt” 的文件,文件内容为 “12/10/18 09:57:22,288.442 [12040] INFO test - Hello world [..\logtest\main.cpp:25]”
例3:将日志发送到日志服务器:
# include <log4cplus/log4cplus.h>
int main()
{
//用Initializer类进行初始化
log4cplus::Initializer initializer;
//第1步:创建SocketAppender
log4cplus::SharedAppenderPtr appender(new log4cplus::SocketAppender(
LOG4CPLUS_TEXT("localhost"),
32015, LOG4CPLUS_TEXT("test")));
//第2步:设置Appender的名称,SocketAppender不需要设置输出格式
appender->setName(LOG4CPLUS_TEXT("logserver"));
//第3步:获得一个Logger实例,并设置其日志输出等级阈值
log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);
//第4步:为Logger实例添加Appender
logger.addAppender(appender);
//第5步:使用宏将日志输出
LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));
return 0;
}
例3的结果可以通过搭建一个日志服务器来查看,服务器的示例可以参考:simpleserver目录下的loggingserver.cxx
日志输出格式化
符号 | 说明 |
---|---|
%% | 转义为% |
%c | 输出logger名称,例如std::string pattern =”%c” 时输出: “cc.gmem”, 也可以控制logger名称的显示层次,如”%c{1}”时输出”gmem”, 其中数字表示层次 |
%D | 显示本地时间,当std::string pattern =”%D” 时输出:”2011-11-16 11:00:00” |
%d | 显示标准时间,可以通过%d{…}定义更详细的显示格式,{}中可显示的预定义标识符如下: |
%a – 表示礼拜几,英文缩写形式,比如”Fri” | |
%A – 表示礼拜几,比如”Friday” | |
%b – 表示几月份,英文缩写形式,比如”Oct” | |
%B – 表示几月份,”October” | |
%c – 标准的日期+时间格式,如 “Sat Oct 16 18:56:19 2004” | |
%d – 表示今天是这个月的几号(1-31)”16” | |
%H – 表示当前时刻是几时(0-23),如 “18” | |
%I – 表示当前时刻是几时(1-12),如 “6” | |
%j – 表示今天是哪一天(1-366),如 “290” | |
%m – 表示本月是哪一月(1-12),如 “10” | |
%M – 表示当前时刻是哪一分钟(0-59),如 “59” | |
%p – 表示现在是上午还是下午, AM or PM | |
%q – 表示当前时刻中毫秒部分(0-999),如 “237” | |
%Q – 表示当前时刻中带小数的毫秒部分(0-999.999),如 “430.732” | |
%S – 表示当前时刻的多少秒(0-59),如 “32” | |
%U – 表示本周是今年的第几个礼拜,以周日为第一天开始计算(0-53),如 “41” | |
%w – 表示礼拜几,(0-6, 礼拜天为0),如 “6” | |
%W – 表示本周是今年的第几个礼拜,以周一为第一天开始计算(0-53),如 “41” | |
%x – 标准的日期格式,如 “10/16/04” | |
%X – 标准的时间格式,如 “19:02:34” | |
%y – 两位数的年份(0-99),如 “04” | |
%Y – 四位数的年份,如 “2004” | |
%Z – 时区名,比如 “GMT” | |
%F | 输出当前记录器所在的文件名称 |
%L | 输出当前记录器所在的文件行号 |
%l | 输出当前记录器所在的文件名称和行号 |
%m | 输出原始日志信息 |
%n | 换行符 |
%p | 输出LogLevel |
%t | 输出记录器所在的线程ID |
%x | 嵌套诊断上下文NDC |
文章转载自https://blog.csdn.net/u014695839/article/details/84937769 培培哥的CSDN博客
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment