cpp-doc-log4cplus使用

介绍

log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统,受Apache Software License保护,作者是Tad E. Smith。
log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将日志划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期。你可以选择将日志输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载git项目或到sourceforge下载
git clone --recurse-submodules https://github.com/log4cplus/log4cplus.git
wget https://nchc.dl.sourceforge.net/project/log4cplus/log4cplus-stable/2.0.6/log4cplus-2.0.6.tar.xz

# 生成makefile 文件
# 如果需要指定安装路径可使用--prefix参数, 否则将缺省安装到/usr/local目录下。另外,如果需要单线程版本可通过参数-enable-threads=no指定, 否则默认将安装多线程版本。
#./configure --prefix=/where/to/install -–enable-threads=no
./configure --enable-static

# 构建
make

# 安装
make install

Git 地址:https://github.com/log4cplus/log4cplus

api地址:https://log4cplus.sourceforge.io/docs/api/2.0.x/

sourceforge地址:https://sourceforge.net/p/log4cplus/wiki/Home/#download

Filter

过滤器,过滤输出消息。

日志级别:

  • NOT_SET_LOG_LEVEL ( -1) 接受缺省的LogLevel,如果有父logger则继承它的LogLevel
  • ALL_LOG_LEVEL (0) 开放所有log信息输出
  • TRACE_LOG_LEVEL (0) 开放trace信息输出(即ALL_LOG_LEVEL)
  • DEBUG_LOG_LEVEL(10000) 开放debug信息输出
  • INFO_LOG_LEVEL (20000) 开放info信息输出
  • WARN_LOG_LEVEL (30000) 开放warning信息输出
  • ERROR_LOG_LEVEL(40000) 开放error信息输出
  • FATAL_LOG_LEVEL (50000) 开放fatal信息输出
  • OFF_LOG_LEVEL (60000) 关闭所有log信息输出

log4cplus支持编译时候和运行时刻利用日志级别进行输出过滤。编译时刻通过如下的预定义变量进行过滤:

1
2
3
4
5
6
#define LOG4CPLUS_DISABLE_FATAL
#define LOG4CPLUS_DISABLE_WARN
#define LOG4CPLUS_DISABLE_ERROR
#define LOG4CPLUS_DISABLE_INFO
#define LOG4CPLUS_DISABLE_DEBUG
#define LOG4CPLUS_DISABLE_TRACE

Layout

布局器,控制输出消息的格式。

SimpleLayout

一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个”-“,如果初始化时没有将布局器附加到挂接器,则默认使用SimpleLayout。

PatternLayout

一种有词法分析功能的模式布局器,类似于C语言的printf()函数,能够对预定义的转换标识符(conversion specifiers)进行解析,转换成特定格式输出。

PatterLayout支持的转换标识符主要包括:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1"%%",转义为%, 即,std::string pattern = "%%" 时输出"%"
2"%c",输出logger名称,比如std::string pattern ="%c" 时输出: "test_logger.subtest", 也可以控制logger名称的显示层次,比如"%c{1}"时输出"test_logger",其中数字表示层次。
3"%D",显示本地时间,当std::string pattern ="%D" 时输出:"2004-10-16 18:55:45",%d显示标准时间,所以当std::string pattern ="%d" 时输出 "2004-10-16 10:55:45" (因为北京时间位于东8区,差8个小时)。
可以通过%d{...}定义更详细的显示格式,比如%d{%H:%M:%s}表示要显示小时:分钟:秒。大括号中可显示的预定义标识符如下:
%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"
4"%F",输出当前记录器所在的文件名称,比如std::string pattern ="%F" 时输出: "main.cpp"
5"%L",输出当前记录器所在的文件行号,比如std::string pattern ="%L" 时输出: "51"
6"%l",输出当前记录器所在的文件名称和行号,比如std::string pattern ="%L" 时输出"main.cpp:51"
7"%m",输出原始信息,比如std::string pattern ="%m" 时输出: "teststr",即上述代码中LOG4CPLUS_DEBUG的第二个参数,这种实现机制可以确保原始信息被嵌入到带格式的信息中。
8"%n",换行符,没什么好解释的。
9"%p",输出LogLevel,比如std::string pattern ="%p" 时输出: "DEBUG"
10"%t",输出记录器所在的线程ID,比如std::string pattern ="%t" 时输出: "1075298944"
11"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分,关于NDC方面的详细介绍会在下文中提到。
12)格式对齐,比如std::string pattern ="%-10m"时表示左对齐,宽度是10,此时会输出"teststr ",当然其它的控制字符也可以相同的方式来使用,比如"%-12d""%-5p"等等。

TTCCLayout

是在PatternLayout基础上发展的一种缺省的带格式输出的布局器, 其格式由时间,线程ID,Logger和NDC 组成(consists of time, thread, Logger and nested diagnostic context information, hence the name

Appender

输出器,与布局器和过滤器紧密配合,将特定格式的消息过滤后输出到所挂接的设备终端如屏幕,文件等等)。

ConsoleAppender

输出日志到控制台

FileAppender

输出日志到文件

RollingFileAppender

RollingFileAppender类可以根据你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,除了定义每个记录文件的大小之外,你还要确定在RollingFileAppender类对象构造时最多需要多少个这样的记录文件(maxBackupIndex+1),当存储的文件数目超过maxBackupIndex+1时,会删除最早生成的文件,保证整个文件数目等于maxBackupIndex+1。然后继续记录。

DailyRollingFileAppender

DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续log信息会另存到新文件中,这里的频度包括:MONTHLY(每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每两天)、HOURLY(每时)、MINUTELY(每分)

SocketAppender

C/S方式的日志记录,用于支持重定日志向到远程服务器。

Logger

记录器,保存并跟踪对象日志信息变更的实体,当你需要对一个对象进行记录时,就需要生成一个logger。

Hierarchy

分类器,层次化的树型结构,用于对被记录信息的分类,层次中每一个节点维护一个logger的所有信息。

Loglevel

优先权,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。

配置

恶心点,只要打印日志,rootLogger 一定会被执行。。如果没必要,推荐只使用rootLogger

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

log4cplus.rootLogger=INFO,STDOUT,R
log4cplus.logger.test=WARN
log4cplus.logger.test.log_1=WARN # 没有特定执行,额外执行 STDOUT,R
log4cplus.logger.test.log_2=WARN # 没有特定执行,额外执行 STDOUT,R
log4cplus.logger.test.log_3=WARN, R3,R4 # 指定执行R3,R4,额外执行 STDOUT,R

log4cplus.appender.STDOUT=log4cplus::ConsoleAppender
log4cplus.appender.STDOUT.layout=log4cplus::PatternLayout
log4cplus.appender.STDOUT.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S} [%l] %-5p %c{2} %%%x%% - %m [%l]@@@@@@@%n



log4cplus.appender.R=log4cplus::RollingFileAppender
log4cplus.appender.R.File=output.log
#log4cplus.appender.R.MaxFileSize=5MB
log4cplus.appender.R.MaxFileSize=500KB
log4cplus.appender.R.MaxBackupIndex=5
log4cplus.appender.R.layout=log4cplus::TTCCLayout

log4cplus.appender.R3=log4cplus::RollingFileAppender
log4cplus.appender.R3.File=log_3.log
log4cplus.appender.R3.MaxFileSize=500KB
log4cplus.appender.R3.MaxBackupIndex=5
#log4cplus.appender.R3.layout=log4cplus::TTCCLayout
log4cplus.appender.R3.layout=log4cplus::PatternLayout
log4cplus.appender.R3.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p %c{2} - %m%n

log4cplus.appender.R4=log4cplus::DailyRollingFileAppender
log4cplus.appender.R4.File=log_3.log
log4cplus.appender.R4.Schedule = DAILY
log4cplus.appender.R4.MaxFileSize=500KB
log4cplus.appender.R4.MaxBackupIndex=5
log4cplus.appender.R4.Append = true
log4cplus.appender.R4.ImmediateFlush = true
log4cplus.appender.R4.layout=log4cplus::PatternLayout
log4cplus.appender.R4.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p %c{2} - %m%n

例子:hello world

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/initializer.h>

int
main()
{
// Initialization and deinitialization.
log4cplus::Initializer initializer;

log4cplus::BasicConfigurator config;
config.configure();

log4cplus::Logger logger = log4cplus::Logger::getInstance(
LOG4CPLUS_TEXT("main"));
LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));
return 0;
}

参考

文章1 https://www.cnblogs.com/keepsimple/archive/2013/05/10/3071309.html