C++ 开源Log工具--log4cxx安装部署与使用
2015-08-22 18:30
274 查看
一. 简述
我之前有一片讲解log4cxx的编译我问题,这一篇,我就来讲解log4xx的使用。下面那个文件包是我自己编译出来的,如果不想编译可以直接使用。
1. log4cxx文件包:http://download.csdn.net/detail/u013354805/9036007
二. 建立工程:
1. 属性=>配置属性=>选VC++目录=>包含目录=>添加".\log4cxx\include"; 2. 属性=>配置属性=>选VC++目录=>库目录=>添加".\log4cxx\lib"; 3. 属性=>配置属性=>选链接器=>输入=>附件依赖项=>添加"log4cxx.lib"; |
1.优先级
Logger的语法: log4j.rootLogger = [ level ] , appenderName, appenderName, … 其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,可以控制到应用程序中相应级别的日志信息的开关。比如这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName名字任意,用来标示日志信息输出到哪里,可以同时指定多个。 |
Appender的语法: log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.option = valueN 其中,Log4j提供的appender有以下几种: org.apache.log4j.ConsoleAppender 控制台 org.apache.log4j.FileAppender 文件 org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件 org.apache.log4j.RollingFileAppender 文件大小到达指定尺寸的时候产生一个新的文件 org.apache.log4j.WriterAppender 将日志信息以流格式发送到任意指定的地方 |
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.option = valueN Log4j提供的Layout有以下几种: org.apache.log4j.HTMLLayout 以HTML表格形式布局 org.apache.log4j.PatternLayout 可以灵活地指定布局模式 org.apache.log4j.SimpleLayout 包含日志信息的级别和信息字符串 org.apache.log4j.TTCCLayout 包含日志产生的时间、线程、类别等等信息 Log4j采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出2008年11月14日 15:16:17,890 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。 |
四. 实例
1. log4cxx.properties log4cxx配置文件:#默认输出到文件 log4j.rootLogger=INFO,fa,ca #设置日志对象 log4j.logger.console=INFO,ca log4j.logger.file=INFO,fa log4j.additivity.file=false #************************** #控制台,同时也会输出到默认输出对象 #************************** log4j.appender.ca=org.apache.log4j.ConsoleAppender log4j.appender.ca.layout=org.apache.log4j.PatternLayout log4j.appender.ca.layout.ConversionPattern=[%-5p][%d] : %m%n #************************** #文件 #************************** log4j.appender.fa=org.apache.log4j.DailyRollingFileAppender log4j.appender.fa.File=./log/today.log log4j.appender.fa.Append=fasle log4j.appender.fa.MaxFileSize=10MB log4j.appender.fa.MaxBackupIndex=1000 log4j.appender.fa.DatePattern=yyyy-MM-dd log4j.appender.fa.layout=org.apache.log4j.PatternLayout log4j.appender.fa.layout.ConversionPattern=[%-5p][%d] : %m%n上面是我常用的一个配置,总共有两个输出对象fa和ca,分别表示输出到文件和输出到控制台。我又配置了三个代码中需要的对象,分别是:
rootLogger 默认对象,引用了fa和ca,即输出到控制台和文件;
file 只引用到fa,输出到文件,但file多了一项配置log4j.additivity.file=false,这是不向默认对象(rootLogger)输出,因此信息只能输出到文件;
console 只引用到ca,输出到控制台,但additivity的默认值是true,也就是信息除了输出到ca外,还会输出到rootLogger,因此控制台会有两次的信息输出和一次的文件输出。
2. 在代码使用:
1. 代码1:
#include <log4cxx/logger.h> #include <log4cxx/basicconfigurator.h> #include <log4cxx/propertyconfigurator.h> #include <log4cxx/helpers/exception.h> #include <iostream> int main() { log4cxx::PropertyConfigurator::configureAndWatch("log4cxx.properties"); log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger("ca")); LOG4CXX_DEBUG(logger, "this is log4cxx test"); return 0; }2. 代码2:
static log4cxx::LoggerPtr logger1= log4cxx::Logger::getLogger("console"); static log4cxx::LoggerPtr logger2= log4cxx::Logger::getLogger("file"); static log4cxx::LoggerPtr logger3= log4cxx::Logger::getLogger("socket");logger1:对应的是配置中的console对象。
logger2:对应的是配置中的file对象。
logger3:在配置中找不到socket对象,因此他的信息会输出到rootLogger,因为所有未配置的对象会默认输出到rootLogger。
相关文章推荐
- C语言线性表的实现
- C/C++中关于typedef的用法总结
- c++中字符串和字符数组
- [C++11 并发编程] 09 - 在初始化阶段保护共享数据
- [leetcode]Remove Duplicates from Sorted Array C语言
- 阿里题目总结——阿里巴巴2010搜索研发C++工程师笔试卷
- [leetcode]Remove Element C语言
- 静态链接和动态链接
- 小议C和C++中的const类型限定符
- poj1595 Prime Cuts (素数筛选)
- C++中substr函数的用法
- c++Map容器 详解
- C语言数组指针指针数组
- [leetcode]Rotate Array C语言
- C语言的System使用
- C++中的随机数
- POJ C++程序设计 编程题#1 编程作业—运算符重载
- Effective C++ 条款12 复制对象时勿忘其每一个部分
- POJ C++程序设计 编程题#1 编程作业—运算符重载
- C/C++面试笔试题目汇总