linux下的log4cplus应用
Layouts :布局器,控制输出消息的格式.
Appenders :挂接器,与布局器紧密配合,将特定格式的消息输出到所挂接的设备终端
(如屏幕,文件等等)。
Logger :记录器,保存并跟踪对象日志信息变更的实体,当你需要对一个对象进行
记录时,就需要生成一个logger。
Categories :分类器,层次化(hierarchy)的结构,用于对被记录信息的分类,层次中每一个节点维护一个logger的所有信息。
使用log4cplus有六个基本步骤:
1. 实例化一个appender对象
2. 实例化一个layout对象
3. 将layout对象绑定(attach)到appender对象
4. 实例化一个logger对象,调用静态函数:log4cplus::Logger::getInstance("logger_name")
5. 将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出(屏幕)appender对象会绑定到logger
6. 设置logger的优先级,如省略此步骤,各种有限级的消息都将被记录
下面的例子说明如何将日志写到文件中,在编译是要加上-llog4cplus -lthread
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
#include <log4cplus/logger.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/layout.h>
#include <memory>
#include <string>
using namespace log4cplus;
using namespace log4cplus::helpers;
using namespace std;
int main()
{
// 定义一个控制台的Appender
SharedAppenderPtr pConsoleAppender(new ConsoleAppender());
// 定义一个简单的Layout,并绑定到Appender
auto_ptr<Layout> pSimpleLayout(new SimpleLayout());
pConsoleAppender->setLayout(pSimpleLayout);
// 定义Logger,并设置优先级
Logger pTestLogger = Logger::getInstance(("LoggerName"));
pTestLogger.setLogLevel(WARN_LOG_LEVEL);
// 将需要关联Logger的Appender添加到Logger上
pTestLogger.addAppender(pConsoleAppender);
// 输出日志信息
LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message...");
return 0;
}