log4cxx使用说明

来源:互联网 发布:音频裁剪软件 编辑:程序博客网 时间:2024/05/21 10:31

在这之前需要完成编译dll的工作

1、用vs2010建立控制台程序

代码如下:

#include <iostream>
#include <log4cxx/logstring.h>
#include <log4cxx/logger.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>
#include <locale.h>
#include <log4cxx/basicconfigurator.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
int main(){
 //LoggerPtr logger(Logger::getLogger("LogTest1"));

 //BasicConfigurator::configure();
 //LOG4CXX_INFO(logger, "Hello ");
 //LOG4CXX_DEBUG(logger, "Log4Cxx");
 //printf("aaaaaaaaaaa");

 //加载log4cxx的配置文件,这里使用了属性文件
 PropertyConfigurator::configure("log4cxx.properties");

 //获得一个Logger,这里使用了RootLogger
 LoggerPtr rootLogger = Logger::getRootLogger();

 //发出INFO级别的输出请求
 //LOG4CXX_INFO(rootLogger, _T("日志系统启动了。。。。"));
   rootLogger->info("日志系统启动了。。。。"); //与上面那句话功能一样

 return 0;
}

/////////////////////////////////////////////////////////////////////////////////

输出内入如下:

目录结构如下:

 

目录结构如上:

    include:包含log4cxx的头文件信息

    libd:包含debug版本的lib和dll

    libr:包含release版本的lib和dll

    log4cxx.properties:log4cxx的配置文件

补充:

动态编译的log4xx目录与项目对应,中的lib中加上log4cxx.dll,与生成的exe目录相同。这是由于输出目录改变造成的。

还有修改以前的输出目录为Debug,一切正常

注意:log4cxx需要放在解决方案目录下。如果放在项目目录,会找不到。


配置方式如下:

 引入库文件和头文件

      

 

以上选择编译release和debug版本,配置方式是一样的

log4cxx.properties配置文件内容如下:

 # 设置root logger为DEBUG级别,使用了ca和fa两个Appender 
log4j.rootLogger=DEBUG, ca, fa
 
#对Appender fa进行设置:
# 这是一个文件类型的Appender,
# 其输出文件(File)为./output.log,
# 输出方式(Append)为覆盖方式,
# 输出格式(layout)为PatternLayout
log4j.appender.fa=org.apache.log4j.FileAppender 
log4j.appender.fa.File=./output.log
log4j.appender.fa.Append=true
log4j.appender.fa.layout=org.apache.log4j.PatternLayout 
log4j.appender.fa.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n
 
#对Appender ca进行设置:
# 这是一个控制台类型的Appender
#  输出格式(layout)为PatternLayout
log4j.appender.ca=org.apache.log4j.ConsoleAppender 
log4j.appender.ca.layout=org.apache.log4j.PatternLayout 
log4j.appender.ca.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n

log4cxx体系结构

 

1、核心类

Log4cxx有三个关键组件,它们是loggers, appenders和layouts。
Logger是log4cxx的核心类,只要执行日志操作;looger有层次结构,最顶层为RootLogger;logger是有级别的。每个logger可以附加多个Appender。Appender代表了日志输出的目标,如输出到文件、控制台等等。对于每一种appender,都可以通过layout进行格式设置。
2、配置类
此外在使用中还会用到的类有BasicConfigurator、PropertyConfigurator和DOMConfigurator等,用于对log4cxx进行配置。其中:
BasicConfigurator提供了一种简单配置,包括使用ConsoleAppder作为root appender和PatternLayout作为缺省布局。
PropertyConfigurator使用properties文件作为配置方式。
DOMConfigurator则使用xml文件作为配置方式。
 
总结:
 
                在项目中是否使用日志,以及如何使用日志,对开发者来说都是一个需要做出的技术选择,这通常会牵扯到系统的性能,使用日志的目的等问题。我们使用日志的方式,有些是这个行业积累了多年的经验,有些则纯粹关乎个人的喜好。
1)何时使用日志
通常情况下,日志的作用在于调试和审计,如果你的项目对此有特殊需求,即可考虑使用日志。
对于调试,通常用于IDE调试器无法达到的地方。一些常见的场景包括:
分布式组件的调试。在服务器端的组件,需要通过客户端的调用来验证其工作是否正确,此时利用日志的输出作为辅助工具对错误进行诊断。
链接库调试。在无法跟踪进外部库中的情况下,这种方法非常有效。
生产环境下的调试。生产环境通常是指产品在客户处处于正式运行的状态,在出现问题时,开发者常常不在现场,借助日志的输出进行错误判断就是一个非常有效的手段。
对于审计应用,则需要视特定的情况而定,程序级的记录能力,无疑可以作为业务级审计手段的有效补充。
无论是在哪种场景下,log4cxx都是可以胜任工作的,这取决于它的灵活的配置能力及多种类型的输出方式。
2)性能问题
关闭日志,通过配置文件设置日志的关闭和打开
使用宏代替logger的输出命令
选择性输出日志。建立logger的层次结构,根据级别选择性输出
输出目标。尽可能减少输出目标
选择合适的输出格式。使用SimpleLayout将达到与std::cout相当的速度。
3)其它
使用类的全限定名对logger命名

 

 

如果在SDI或者MDI程序中,可以如下步骤使用log4cxxx:
1.在CXXXApp类的头文件里加入以下几行:
#include <log4cxx/logger.h>
#include <log4cxx/propertyconfigurator.h>
using namespace log4cxx;
2.在CXXXApp类中增加public的成员变量:
LoggerPtr rootLogger;
3.在CXXXApp::InitInstance()的最底下增加如下代码:
    PropertyConfigurator::configure("log4cxx.properties");
    rootLogger = Logger::getRootLogger();
4.以后就可以这样输入日志记录了:
    ((CXXXApp *)AfxGetApp())->rootLogger->info("On OA Manage!");
0 0