log4cplus主要包括layout、appender、loglevel等;实现了5个等级的信息:DEBUG、INFO、WARNING、ERROR和FATAL。
Layouts :布局器,控制输出消息的格式.
Categories :分类器,层次化(hierarchy)的结构,用于对被记录信息的分类,层次中每一个节点维护一个logger的所有信息。
1
![]()
//Include .h file
2
![]()
#include <log4cplus/logger.h>
3
![]()
#include <log4cplus/fileappender.h>
4
![]()
#include <log4cplus/consoleappender.h>
5
![]()
#include <log4cplus/layout.h>
6
![]()
#include <string>
7
![]()
#include <memory>
8
![]()
using namespace log4cplus;
9
![]()
using namespace log4cplus::helpers;
10
![]()
int main()
11

{
12
![]()
//FileAppender(const log4cplus::tstring& filename, L
13
![]()
// OG4CPLUS_OPEN_MODE_TYPE mode = LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc,
14
![]()
// bool immediateFlush = true);
15
![]()
//filename : 文件名
16
![]()
//mode : 文件类型,可选择的文件类型包括app、ate、binary、in、out、trunc标志,缺省是trunc,表示将先前文件删除。
17
![]()
//immediateFlush :缓冲刷新标志,如果为true表示每向文件写一条记录就刷新一次缓存,否则直到FileAppender
18
![]()
// 被关闭或文件缓存已满才更新文件,一般是要设置true的,比如你往文件写的过程中出了错误(如程序非正常退出),
19
![]()
// 即使文件没有正常关闭也可以保证程序终止时刻之前的所有记录都会被正常保存。
20
![]()
// 定义一个文件Appender
21
![]()
SharedAppenderPtr pFileAppender(new FileAppender(("testlog.log")));
22
23
![]()
//log4cplus::RollingFileAppender::RollingFileAppender(const log4cplus::tstring& filename,
24
![]()
// long maxFileSize,
25
![]()
// int maxBackupIndex,
26
![]()
// bool immediateFlush)
27
![]()
//filename : 文件名
28
![]()
//maxFileSize : 文件的最大尺寸
29
![]()
//maxBackupIndex : 最大记录文件数
30
![]()
//immediateFlush : 缓冲刷新标志
31
![]()
//RollingFileAppender类可以根据你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,
32
![]()
//除了定义每个记录文件的大小之外,你还要确定在RollingFileAppender类对象构造时最多需要多少个这样的记录文件(maxBackupIndex+1),
33
![]()
//当存储的文件数目超过maxBackupIndex+1时,会删除最早生成的文件,保证整个文件数目等于maxBackupIndex+1。然后继续记录
34
![]()
//SharedAppenderPtr pFileAppender(new RollingFileAppender("testlog.log", 5*1024, 5));
35
36
37
![]()
//DailyRollingFileAppender::DailyRollingFileAppender(const log4cplus::tstring& filename,
38
![]()
// DailyRollingFileSchedule schedule,
39
![]()
// bool immediateFlush,
40
![]()
// int maxBackupIndex)
41
![]()
//DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续log信息会另存到新文件中
42
![]()
//,这里的频度包括:MONTHLY(每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每两天)、HOURLY(每时)、MINUTELY(每分)。
43
![]()
//maxBackupIndex的含义同上,
44
![]()
//下面代码运行后会以分钟为单位,分别生成名为Test.log.2004-10-17-03-03、
45
![]()
//Test.log.2004-10-17-03-04和Test.log.2004-10-17-03-05这样的文件;如果超过了就另存。
46
![]()
//SharedAppenderPtr pFileAppender(new DailyRollingFileAppender("test.log", MINUTELY, true, 5));
47
48
49
![]()
pFileAppender->setName("LoggerName");
50
51
52
53
![]()
//"%%",转义为%, 即,std::string pattern = "%%" 时输出: "%"
54
![]()
//"%c",输出logger名称,比如std::string pattern ="%c" 时输出: "test_logger.subtest",
55
![]()
// 也可以控制logger名称的显示层次,比如"%c{1}"时输出"test_logger",其中数字表示层次
56
![]()
//
57
![]()
//"%D",显示本地时间,当std::string pattern ="%D" 时输出:"2004-10-16 18:55:45",
58
![]()
// %d显示标准时间,所以当std::string pattern ="%d" 时输出 "2004-10-16 10:55:45" (因为我们是东8区,差8个小时啊)。
59
![]()
// 可以通过%d{

}定义更详细的显示格式,比如%d{%H:%M:%s}表示要显示小时:分钟:秒。大括号中可显示的
60
![]()
// 预定义标识符如下:
61
![]()
//%a -- 表示礼拜几,英文缩写形式,比如"Fri"
62
![]()
//%A -- 表示礼拜几,比如"Friday"
63
![]()
//%b -- 表示几月份,英文缩写形式,比如"Oct"
64
![]()
//%B -- 表示几月份,"October"
65
![]()
//%c -- 标准的日期+时间格式,如 "Sat Oct 16 18:56:19 2004"
66
![]()
//%d -- 表示今天是这个月的几号(1-31)"16"
67
![]()
//%H -- 表示当前时刻是几时(0-23),如 "18"
68
![]()
//%I -- 表示当前时刻是几时(1-12),如 "6"
69
![]()
//%j -- 表示今天是哪一天(1-366),如 "290"
70
![]()
//%m -- 表示本月是哪一月(1-12),如 "10"
71
![]()
//%M -- 表示当前时刻是哪一分钟(0-59),如 "59"
72
![]()
//%p -- 表示现在是上午还是下午, AM or PM
73
![]()
//%q -- 表示当前时刻中毫秒部分(0-999),如 "237"
74
![]()
//%Q -- 表示当前时刻中带小数的毫秒部分(0-999.999),如 "430.732"%S -- 表示当前时刻的多少秒(0-59),如 "32"
75
![]()
//%U -- 表示本周是今年的第几个礼拜,以周日为第一天开始计算(0-53),如 "41"
76
![]()
//%w -- 表示礼拜几,(0-6, 礼拜天为0),如 "6"
77
![]()
//%W -- 表示本周是今年的第几个礼拜,以周一为第一天开始计算(0-53
78
![]()
//
79
![]()
//"%F",输出当前记录器所在的文件名称
80
![]()
//"%L",输出当前记录器所在的文件行号"
81
![]()
//"%l",输出当前记录器所在的文件名称和行号
82
![]()
//"%m",输出原始信息,以确保原始信息被嵌入到带格式的信息中。
83
![]()
//"%n",换行符,没什么好解释的
84
![]()
//"%p",输出LogLevel,比如std::string pattern ="%p" 时输出:"DEBUG"ï
85
![]()
//"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,
86
![]()
// NDC可以用对不同源的log信息(同时地)交叉输出进行区分,关于NDC方面的详细介绍会在下文中提到。
87
![]()
//格式对齐,比如std::string pattern ="%-10m"时表示左对齐,宽度是10,此时会输出"teststr ",
88
![]()
//当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等
89
![]()
std::auto_ptr<Layout> pPatternLayout(new PatternLayout(("%p:%D -%m [%l]%n")));
90
![]()
pFileAppender->setLayout(pPatternLayout);
91
92
![]()
// 定义Logger
93
![]()
Logger pTestLogger = Logger::getInstance(("LoggerName"));
94
95
![]()
// 将需要关联Logger的Appender添加到Logger上
96
![]()
pTestLogger.addAppender(pFileAppender);
97
98
![]()
// 输出日志信息
99
![]()
//LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message

");
100
![]()
//LOG4CPLUS_DEBUG(pTestLogger, "This is a <Warn> log message

");
101
![]()
pTestLogger.setLogLevel(TRACE_LOG_LEVEL);
102
103
![]()
LOG4CPLUS_TRACE(pTestLogger, "printMessages()");
104
![]()
LOG4CPLUS_DEBUG(pTestLogger, "This is a DEBUG message");
105
![]()
LOG4CPLUS_INFO(pTestLogger, "This is a INFO message");
106
![]()
LOG4CPLUS_WARN(pTestLogger, "This is a WARN message");
107
![]()
LOG4CPLUS_ERROR(pTestLogger, "This is a ERROR message");
108
![]()
LOG4CPLUS_FATAL(pTestLogger, "This is a FATAL message");
109
110
![]()
return 1;
111
![]()
}
112