【转】开源日志库<log4cplus+VS2008使用>整理
来源:互联网 发布:平价水乳 知乎 编辑:程序博客网 时间:2024/05/17 13:42
本文出自 “碧海笙箫” 博客,请务必保留此出处http://pyhcx.blog.51cto.com/713166/143549
一.简介
二.下载
可从网站[url]http://log4cplus.sourceforge.net[/url]上去下载 log4cplus 1.0.3 rc9,具体地址[url]http://downloads.sourceforge.net/log4cplus/log4cplus-1.0.3-rc9.tar.bz2?use_mirror=nchc[/url],同时附件也带有这个库。
三.配置环境
1. 将库解压到C:\log4cplus下面,使用VS2008打开.\msvc8\log4cplus.sln,编译log4cplus_static(Debug_Unicode+Release_Unicode),并将生成的Lib(log4cplusUS.lib+log4cplusUSD.lib)复制到.\Lib目录下。
2. 将.\Include和.\Lib分别添加到VS2008的搜索路径下。
3. 在我们的工程中,添加预定义 LOG4CPLUS_STATIC。
3. 只需要包含相应的头文件和链接相应的库就可以正常的使用log4cplus进行日志的管理了。
4.注意编译的库和使用的程序,使用的CRT方式的一致,如下所示:
5. 另外还可以使用动态链接的方式去使用log4cplus,这里不介绍了。
四.log4cplus框架
1.log4cplus基本元素
Layouts :控制输出消息的格式。
Appenders :输出位置。
Logger :日志对象。
Priorities :优先权,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。
2.log4cplus基本结构
3. 使用步骤:
a.) 生成Appender对象。
b.) 生成Layout对象,并绑定到Appender。(可选)
c.) 生成Logger对象。
d.) 设置Logger优先级。(可选)
e.) 将需要关联Logger的Appender添加到Logger上。
f.) 使用Logger输出信息,所有大于设定的优先级的信息,并在所有挂接在该Logger对象上的Appender上以相应的Layout设定的格式显示出来。
五.log4cplus内容介绍
1. Logger对象
Logger对象具有层次结构,按名称区分,如下代码:
Logger test = Logger::getInstance("test");
Logger subtest = Logger::getInstance("test.subtest");
对象subtest是test的子对象。
2. 优先级
log4cplus优先级有低到高:
NOT_SET_LOG_LEVEL :接受缺省的LogLevel,如果有父logger则继承它的LogLevel
ALL_LOG_LEVEL :开放所有log信息输出
TRACE_LOG_LEVEL :开放trace信息输出(即ALL_LOG_LEVEL)
DEBUG_LOG_LEVEL :开放debug信息输出
INFO_LOG_LEVEL :开放info信息输出
WARN_LOG_LEVEL :开放warning信息输出
ERROR_LOG_LEVEL :开放error信息输出
FATAL_LOG_LEVEL :开放fatal信息输出
OFF_LOG_LEVEL :关闭所有log信息输出
各个logger可以通过setLogLevel设置自己的优先级,当某个logger的LogLevel设置成NOT_SET_LOG_LEVEL时,该logger会继承父logger的优先级,另外,如果定义了重名的多个logger, 对其中任何一个的修改都会同时改变其它logger。
3.Layout格式输出
1.) SimpleLayout
是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个"-"。
2.) TTCCLayout
其格式由时间,线程ID,Logger和NDC 组成。
3.) PatternLayout
是一种有词法分析功能的模式布局器,类似正则表达式。以“%”作为开头的特殊预定义标识符,将产生特殊的格式信息。
(1)"%%",转义为% 。
(2)"%c",输出logger名称,如test.subtest 。也可以控制logger名称的显示层次,比如"%c{1}"时输出"test",其中数字表示层次。
(3)"%D",显示本地时间,比如:"2004-10-16 18:55:45",%d显示标准时间。 可以通过%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",输出当前记录器所在的文件名称,比如"main.cpp"
(5)"%L",输出当前记录器所在的文件行号,比如"51"
(6)"%l",输出当前记录器所在的文件名称和行号,比如"main.cpp:51"
(7)"%m",输出原始信息。
(8)"%n",换行符。
(9)"%p",输出LogLevel,比如"DEBUG"
(10)"%t",输出记录器所在的线程ID,比如 "1075298944"
(11)"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分。
(12)格式对齐,比如"%-10m"时表示左对齐,宽度是10,当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等。
4.) Appender输出位置
(1)控制台输出
ConsoleAppender
(2)文件输出
FileAppender / RollingFileAppender / DailyRollingFileAppender .
FileAppender :
实现了基本的文件操作功能,构造函数如下:
FileAppender(filename,mode,immediateFlush);
<filename > 文件名
<mode> 文件类型,可选择的文件类型包括app,ate,binary,in,out,trunc。缺省是trunc,表示将先前文件删除。
<immediateFlush> 缓冲刷新标志.
RollingFileAppender:
RollingFileAppender(filename,maxFileSize,maxBackupIndex,immediateFlush)
filename : 文件名
maxFileSize : 文件的最大尺寸
maxBackupIndex : 最大记录文件数
immediateFlush : 缓冲刷新标志
可以根据你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,除了定义每个记录文件的大小之外,你还要确定在RollingFileAppender类对象构造时最多需要多少个这样的记录文件(maxBackupIndex+1),当存储的文件数目超过maxBackupIndex+1时,会删除最早生成的文件,保证整个文件数目等于maxBackupIndex+1 。
DailyRollingFileAppender:
DailyRollingFileAppender(filename, schedule,immediateFlush, maxBackupIndex)
filename : 文件名
schedule : 存储频度
immediateFlush : 缓冲刷新标志
maxBackupIndex : 最大记录文件数
DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续log信息会另存到新文件中,这里的频度包括:MONTHLY,WEEKLY,DAILY,TWICE_DAILY,HOURLY,MINUTELY。
六.测试代码
1. 一个基本框架的例子
//Include .h file
#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/layout.h>
using namespace log4cplus;
using namespace log4cplus::helpers;
// Link Lib
#ifndef _DEBUG
#pragma comment(lib,"log4cplusUS.lib")
#else
#pragma comment(lib,"log4cplusUSD.lib")
#endif
int _tmain(int argc, _TCHAR* argv[])
{
// 定义一个控制台的Appender
SharedAppenderPtr pConsoleAppender(new ConsoleAppender());
// 定义一个简单的Layout,并绑定到Appender
auto_ptr<Layout> pSimpleLayout(new SimpleLayout());
pConsoleAppender->setLayout(pSimpleLayout);
// 定义Logger,并设置优先级
Logger pTestLogger = Logger::getInstance(_T("LoggerName"));
pTestLogger.setLogLevel(WARN_LOG_LEVEL);
// 将需要关联Logger的Appender添加到Logger上
pTestLogger.addAppender(pConsoleAppender);
// 输出日志信息
LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message...");
return 0;
}
运行结果,在控制台输出:
WARN - This is a <Warn> log message...
2.一个精简模式的例子
int _tmain(int argc, _TCHAR* argv[])
{
// 定义一个控制台的Appender
SharedAppenderPtr pConsoleAppender(new ConsoleAppender());
// 定义Logger
Logger pTestLogger = Logger::getInstance(_T("LoggerName"));
// 将需要关联Logger的Appender添加到Logger上
pTestLogger.addAppender(pConsoleAppender);
// 输出日志信息
LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message...");
return 0;
}
运行结果,在控制台输出:
WARN - This is a <Warn> log message...
3.输出更多的信息内容
int _tmain(int argc, _TCHAR* argv[])
{
// 定义一个控制台的Appender
SharedAppenderPtr pConsoleAppender(new ConsoleAppender());
// 定义Logger
Logger pTestLogger = Logger::getInstance(_T("LoggerName"));
// 将需要关联Logger的Appender添加到Logger上
pTestLogger.addAppender(pConsoleAppender);
int n = 6 ;
TCHAR *p = _T("TestString") ;
// 输出日志信息
LOG4CPLUS_WARN(pTestLogger,"This is a <Warn> log message..."<<n<<" "<<p);
return 0;
}
运行结果,在控制台输出:
WARN - This is a <Warn> log message...6 TestString
4.输出到日志文件
int _tmain(int argc, _TCHAR* argv[])
{
// 定义一个文件Appender
SharedAppenderPtr pFileAppender(new FileAppender(_T("d:\\testlog.log")));
// 定义Logger
Logger pTestLogger = Logger::getInstance(_T("LoggerName"));
// 将需要关联Logger的Appender添加到Logger上
pTestLogger.addAppender(pFileAppender);
// 输出日志信息
LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message...");
return 0;
}
运行结果,在文件 d:\\testlog.log 中 输出:
WARN - This is a <Warn> log message...
5.使用更多的格式控制
int _tmain(int argc, _TCHAR* argv[])
{
// 定义1个控制台的Appender,3个文件Appender
SharedAppenderPtr pConsoleAppender(new ConsoleAppender());
SharedAppenderPtr pFileAppender1(new FileAppender(_T("d:\\testlog1.log")));
SharedAppenderPtr pFileAppender2(new FileAppender(_T("d:\\testlog2.log")));
SharedAppenderPtr pFileAppender3(new FileAppender(_T("d:\\testlog3.log")));
// 定义一个简单的Layout,并绑定到 pFileAppender1
auto_ptr<Layout> pSimpleLayout(new SimpleLayout());
pFileAppender1->setLayout(pSimpleLayout);
// 定义一个TTCLayout,并绑定到 pFileAppender2
auto_ptr<Layout> pTTCLayout(new TTCCLayout());
pFileAppender2->setLayout(pTTCLayout);
// 定义一个PatternLayout,并绑定到 pFileAppender3
auto_ptr<Layout> pPatternLayout(new PatternLayout(_T("%d{%m/%d/%y %H:%M:%S} - %m [%l]%n")));
pFileAppender3->setLayout(pPatternLayout);
// 定义Logger
Logger pTestLogger = Logger::getInstance(_T("LoggerName"));
// 将需要关联Logger的Appender添加到Logger上
pTestLogger.addAppender(pConsoleAppender);
pTestLogger.addAppender(pFileAppender1);
pTestLogger.addAppender(pFileAppender2);
pTestLogger.addAppender(pFileAppender3);
// 输出日志信息
LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message...");
return 0;
}
输出结果:
在控制台输出:
WARN - This is a <Warn> log message...
在 d:\testlog1.log 中输出:
WARN - This is a <Warn> log message...
在 d:\testlog2.log 中输出:
03-30-09 15:07:50,234 [1188] WARN LoggerName <> - This is a <Warn> log message...
在 d:\testlog3.log 中输出:
03/30/09 07:07:50 - This is a <Warn> log message... [e:\study\testcode\vs2008\testlog4cplus\testlog4cplus\testlog4cplus.cpp:121]
七.把设置移到配置文件中
log4cplus通过PropertyConfigurator类实现了基于脚本配置的功能,通过脚本可以完成对logger、appender和layout的配置。
配置步骤:
1.配置Appender名称
枚举:
log4cplus.appender.AppenderName1=log4cplus::ConsoleAppender
log4cplus.appender.AppenderName2=log4cplus::FileAppender
log4cplus.appender.AppenderName3=log4cplus::RollingFileAppender
log4cplus.appender.AppenderName4=log4cplus::DailyRollingFileAppender
log4cplus.appender.AppenderName5=log4cplus::SocketAppender
2.配置Layout
可以选择不设置、TTCCLayout、或PatternLayout
设置TTCCLayout如下所示:
log4cplus.appender.AppenderName.layout=log4cplus::TTCCLayout
设置PatternLayout如下所示:
log4cplus.appender.AppenderName.layout=log4cplus::PatternLayout
log4cplus.appender.append_1.layout.ConversionPattern=
%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n
3.配置Filter
可选择的Filter: LogLevelMatchFilter,LogLevelRangeFilter和StringMatchFilter.
对LogLevelMatchFilter来说,过滤条件包括LogLevelToMatch和AcceptOnMatch,只有当log信息的LogLevel值与LogLevelToMatch相同,且AcceptOnMatch为true时才会匹配。
对LogLevelRangeFilter来说,过滤条件包括LogLevelMin、LogLevelMax和AcceptOnMatch,只有当log信息的LogLevel在LogLevelMin、LogLevelMax之间同时AcceptOnMatch为true时才会匹配。
对StringMatchFilter来说,过滤条件包括StringToMatch和AcceptOnMatch,只有当log信息的LogLevel值与StringToMatch对应的LogLevel值与相同,且AcceptOnMatch为true时会匹配。
4.配置Logger
对于RootLogger,如:
log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ...
对于non-root logger来说:
log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, ...
5.加载配置
PropertyConfigurator::doConfigure("cfg_filename");
6.举例:
a.) 对Appender对象进行配置,包括设置Appende名称,Layout和Filter及相关参数。
设置Appender名称及参数,如:
log4cplus.appender.AppenderName=log4cplus::FileAppender
log4cplus.appender.AppenderName.File=d:\testlog.log
设置Layout及参数,如:
log4cplus.appender.AppenderName.layout=log4cplus::PatternLayout
log4cplus.appender.AppenderName.layout.ConversionPattern=
%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n
设置Filter及参数,如:
log4cplus.appender.AppenderName.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.AppenderName.filters.1.LogLevelMin=DEBUG
log4cplus.appender.AppenderName.filters.1.LogLevelMax=INFO
log4cplus.appender.AppenderName.filters.1.AcceptOnMatch=true
log4cplus.appender.AppenderName.filters.2=log4cplus::spi::DenyAllFilter
b.) 设置Logger对象
log4cplus.rootLogger=TRACE,AppenderName1,AppenderName2
c.) 将以上配置保存到文件中,比如:d:\log4clpus.cfg 中,并如何使用:
int _tmain(int argc, _TCHAR* argv[])
{
PropertyConfigurator::doConfigure(_T("d:\\log4cplus.cfg"));
Logger logger = Logger::getRoot();
LOG4CPLUS_DEBUG(logger, "This is a DEBUG message");
LOG4CPLUS_INFO(logger, "This is a INFO message");
LOG4CPLUS_WARN(logger, "This is a WARN message");
LOG4CPLUS_ERROR(logger, "This is a ERROR message");
LOG4CPLUS_FATAL(logger, "This is a FATAL message");
return 0;
}
0
上一篇:【转】Java命令行运行参数说明大全(偷来的)
下一篇:Opera邮件客户端设置
相关热门文章
- 新书《开源安全运维平台OSSIM...
- mysqldump备份所有数据库,恢...
- 核心交易系统数据库应用程序绑...
- 开源负载均衡LVS随机自启动异...
- 追踪源码揪出mysql崩溃的真凶...
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- 【转】开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>整理
- 开源日志库<log4cplus+VS2008使用>
- log4cplus开源日志库使用
- 常用JQuery插件整理 <转>
- 在Linux上的使用开源C++日志库---log4cplus (转)
- 使用C++日志库log4cplus
- c++开源日志库log4cplus
- c++开源日志库log4cplus
- C++开源日志库log4cplus
- jdk环境变量配置:java.lang.NoClassDefFoundError
- 两种方式调试JNI中DLL(动态链接库)
- VS2015编译openjpeg(32/64位)
- 解决斜杠符号被转义的问题
- 【转】Java命令行运行参数说明大全(偷来的)
- 【转】开源日志库<log4cplus+VS2008使用>整理
- Opera邮件客户端设置
- 图像处理(七)导向滤波磨皮
- Thunderbird使用163邮箱smtp设置方法
- Redis学习笔记6--Redis事务
- 【转】深入理解JDBC Scrollable ResultSet
- hashmap与hashtable的区别,以及实现hashmap的同步操
- 第三方支付宝支付
- 【转】MySQL命令大全
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
瑞士是哪里
瑞士的首都
瑞士在哪里
瑞士风景
瑞士货币
法国瑞士
瑞士品牌
瑞士移民
瑞士糖
德国瑞士
瑞士大学
瑞士气温
瑞士化妆品
瑞士滑雪
瑞士游记
瑞士两天游
瑞士日内瓦
瑞士表行
瑞士钟表
瑞士欧米茄手表有限公司
瑞士手表排名分级
欧米茄瑞士手表
瑞士银行开户条件
周轶君瑞士丈夫
瑞士旅游5天需要多少钱
瑞士首都是哪个城市
瑞士美度手表什么档次
瑞士好玩的地方
瑞士留学条件
瑞士留学签证
瑞士留学费用一览表
瑞士留学费用
瑞士旅游攻略
瑞士属于哪个洲
瑞士用什么语言
瑞士英文怎么写
去瑞士旅游要多少钱
瑞士语言是什么
瑞士的首都是哪里
瑞士阿尔卑斯山
瑞士著名景点