使用Log4j进行日志操作.docx
- 文档编号:9582529
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:29
- 大小:870.98KB
使用Log4j进行日志操作.docx
《使用Log4j进行日志操作.docx》由会员分享,可在线阅读,更多相关《使用Log4j进行日志操作.docx(29页珍藏版)》请在冰点文库上搜索。
使用Log4j进行日志操作
使用Log4j进行日志操作
一、Log4j简介
(1)概述
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接字服务器、NT的事件记录器、UNIXSyslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
最令人感兴趣的就是,这些只需要通过一个属性配置文件来灵活地进行配置,而不需要修改应用的代码。
因为目前在Java中最有名的Log方式,首推是Log4j,另外JDK1.4中也提供了LoggingAPI。
Log4j是在jakartaapache项目下开发的一个开源的日志记录工具。
(2)应用的目的
当你在开发程序的时候,调试(debugging)和日志(logging)都是非常重要的工作。
在应用中使用日志主要有三个目的
●监视代码中的变量的变化情况,把数据周期性地记录到文件中供其它应用进行统计分析工作
●跟踪代码运行的轨迹,作为日后审计的依据
●担当集成开发环境中的调试器,向文件或者控制台打印代码的调试信息
而实现这些应用的常规方式是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。
(3)优点
●采用Log4j进行日志操作的整个过程相当简单明了,与直接使用System.out.println语句进行日志信息输出的方式相比,基本上没有增加代码量,同时能够清楚地理解每一条日志信息的重要程度。
●通过控制配置文件,我们还可以灵活地修改日志信息的格式,输出目的地等等方面,而单纯依靠System.out.println语句,显然需要做更多的工作。
(4)与System.out.println()的对比
●log4j提供分级方法在程序中嵌入日志记录语句。
日志信息具有多种输出格式和多个输出级别。
程序开发环境中的日志记录是由嵌入在程序中以输出一些对开发人员有用信息的语句所组成。
例如,跟踪语句(trace),结构转储和常见的System.out.println或printf调试语句。
●使用一个专门的日志记录包,可以减轻对成千上万的System.out.println语句的维护成本
因为日志记录可以通过配置脚本在运行时得以控制。
log4j维护嵌入在程序代码中的日志记录语句,通过属性配置文件可以快速地规范日志记录的处理过程。
(5)log4j的其它特性
●log4j已经被移植到C,C++,C#,Perl,Python,Ruby,Eiffel几种语言。
●log4j有三种主要的组件:
记录器(Loggers),存放器(Appenders),布局(Layouts)
这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。
综合使用这三个组件可以轻松的记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。
记录器(记录器可不关心log数据存放的事,应该是存放器的事)。
●log4j允许程序员定义多个记录器,每个记录器有自己的名字。
有一个记录器叫根记录器,它永远存在并且是类别等级的起始,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法取得它,而一般记录器通过Logger.getLogger(Stringname)方法。
记录器使用点式标记来进行命名并且也具有继承的特性。
●记录器还有一个重要的属性,就是级别。
(这好理解,就象一个家庭中,成员间存在辈份关系,但不同的成员的身高可能不一样,且身高与辈份无关)程序员可以给不同的记录器赋以不同的级别,如果某个成员没有被明确级别,就自动继承最近的一个有级别长辈的级别值。
二、下载并安置Log4j的*.jar包
(1)http:
//jakarta.apache.org/log4j/docs/download.html下载log4j发行版并将该*.jar包添加到CLASSPATH环境变量中。
(2)Logger类的基本方法
packageorg.apache.log4j;
publicclassLogger
{
//Creation&retrievalmethods:
publicstaticLoggergetRootLogger();
publicstaticLoggergetLogger(Stringname);
//printingmethods:
publicvoiddebug(Objectmessage);
publicvoidinfo(Objectmessage);
publicvoidwarn(Objectmessage);
publicvoiderror(Objectmessage);
publicvoidfatal(Objectmessage);
//genericprintingmethod:
publicvoidlog(Levell,Objectmessage);
}
三、Apache的Log4j的编程实现
下面看一下在JCreator中实现log4j的例子。
1、打开或者新建一个Java程序
(1)
(2)内容如下,详细代码请见源程序
publicclassUserLog4jWithJCreate
{
publicUserLog4jWithJCreate()
{
}
publicstaticvoidmain(String[]args)
{
UserLog4jWithJCreatemainObj=newUserLog4jWithJCreate();
}
}
2、在程序所在的目录下新建一个配置文件log4j.properties
(1)
(2)文件的内容如下
#configrootlogger
log4j.rootLogger=INFO,system.out
log4j.appender.system.out=org.apache.log4j.ConsoleAppender
log4j.appender.system.out.layout=org.apache.log4j.PatternLayout
log4j.appender.system.out.layout.ConversionPattern=this4j-->%5p{%F:
%L}-%m%n
#configthisProject.filelogger
log4j.logger.thisProject.file=INFO,thisProject.file.out
log4j.appender.thisProject.file.out=org.apache.log4j.DailyRollingFileAppender
log4j.appender.thisProject.file.out.File=logContentFile.log
log4j.appender.thisProject.file.out.layout=org.apache.log4j.PatternLayout
3、在JCreator中引入Log4j的apacheJar包log4j-1.2.8.jar到本程序中
4、编程该程序以使用Log4j
(1)引入与log4j相关的包
importorg.apache.log4j.PropertyConfigurator;
importorg.apache.log4j.Logger;
(2)读其配置文件
PropertyConfigurator.configure("log4j.properties");
(3)获得总的输出对象并向控制台输出信息
LoggerloggerConsole=Logger.getRootLogger();
loggerConsole.info("这是在JCreator中向控制台输出的一般信息文字");
loggerConsole.warn("这是在JCreator中向控制台输出的警告类别的信息文字");
(4)获得文件输出对象并向文件中输出信息
LoggerloggerFile=Logger.getLogger("thisProject.file");
loggerFile.warn("这是在JCreator中向指定的log文件中输出的警告类别的信息文字");
(5)最后总的程序为
importorg.apache.log4j.PropertyConfigurator;
importorg.apache.log4j.Logger;
publicclassUserLog4jWithJCreate
{
publicUserLog4jWithJCreate()
{
PropertyConfigurator.configure("log4j.properties");
LoggerloggerConsole=Logger.getRootLogger();
loggerConsole.info("这是在JCreator中向控制台输出的一般信息文字");
loggerConsole.warn("这是在JCreator中向控制台输出的警告类别的信息文字");
LoggerloggerFile=Logger.getLogger("thisProject.file");
loggerFile.warn("这是在JCreator中向指定的log文件中输出的警告类别的信息文字");
}
publicstaticvoidmain(String[]args)
{
UserLog4jWithJCreatemainObj=newUserLog4jWithJCreate();
}
}
5、执行该Java程序
(1)观看其控制台上的输出,并注意其输出的信息格式
(2)观看其磁盘文件的输出
有了这样一个直观的例子感受,我们就可以进一步的讨论。
四、log信息的级别
(1)五个log信息的级别
Loggers组件在此系统中被分为五个级别:
DEBUG、INFO、WARN、ERROR和FATAL。
这五个级别是有顺序的,DEBUG 如果一条log信息的级别,大于等于记录器的级别值,那么记录器就会记录它,否则则不记录。 staticLevelDEBUG: DEBUGLevel指出细粒度信息事件对调试应用程序是非常有帮助的。 staticLevelINFO: INFOlevel表明消息在粗粒度级别上突出强调应用程序的运行过程。 staticLevelWARN: WARNlevel表明会出现潜在错误的情形。 staticLevelERROR: ERRORlevel指出虽然发生错误事件,但仍然不影响系统的继续运行。 staticLevelFATAL: FATALlevel指出每个严重的错误事件将会导致应用程序的退出。 另外,还有两个可用的特别的日志记录级别: (以下描述来自log4jAPIhttp: //jakarta.apache.org/log4j/docs/api/index.html): staticLevelALL: ALLLevel是最低等级的,用于打开所有日志记录。 staticLevelOFF: OFFLevel是最高等级的,用于关闭所有日志记录。 (2)下面给出参考示例来说明级别的应用 //获得一个名称为“thisProject.file”的parentlogger实例 Loggerparentlogger=Logger.getLogger("thisProject.file"); //设置其级别为Level.INFO,一般并不需要在代码中设置,可以在属性配置文件中进行设置 parentlogger.setLevel(Level.INFO); //再获得一个名称为“thisProject.file.Son”的sonlogger实例 Loggersonlogger=Logger.getLogger("thisProject.file.Son"); //由于warn级别大于Info级别,因此可以产生出log信息 parentlogger.warn("由于warn级别大于Info级别,因此可以产生出log信息"); //下面的输出将被禁止,因为parentlogger实例的级别在前面已经设置为Level.INFO,但由于DEBUG parentlogger.debug("下面的输出将被禁止,因为parentlogger实例的级别在前面已经设置为Level.INFO"); //命名为“thisProject.file.Son”的实例sonlogger会继承命名为“thisProject.file”实例parentlogger的级别。 因此,下面这个请求可用,因为INFO>=INFO sonlogger.info("下面这个请求可用,因为INFO>=INFO"); //下面这个请求不可用,因为DEBUG sonlogger.debug("下面这个请求不可用,因为DEBUG (3)日志记录器(Logger)的级别继承关系 日志记录器(Logger)将只输出那些级别高于或等于它的级别的信息。 如果没有设置日志记录器(Logger)的级别,那么它将会继承最近的祖先的级别。 因此,如果在包thisProject.file.Son中创建一个日志记录器(Logger)并且没有设置级别,那它将会继承在包thisProject.file中创建的日志记录器(Logger)的级别。 如果在thisProject.file中没有创建日志记录器(Logger)的话,那么在thisProject.file.Son中创建的日志记录器(Logger)将继承root日志记录器(Logger)的级别,root日志记录器(Logger)经常被实例化而可用,它的级别为DEBUG。 五、Log4j组件构成 Log4j由三个重要的组件构成: 日志信息的产生器、日志信息的输出目的地、日志信息的输出格式。 ●日志信息的的产生器Logger: 它主要负责生成日志并能够按照优先级进行输出(级别从高到低有ERROR、WARN、INFO、DEBUG,分别用来指定这条日志信息的重要程度); ●日志信息的输出目的地Appender: 它指定了日志将打印到控制台还是文件中等不同的目的地; ●而日志信息的输出格式Layout: 它控制了日志信息的显示内容的格式。 六、通过定义属性配置文件来定义log4j的产生方式 其实也可以完全不使用属性配置文件,而是在代码中配置Log4j环境。 但是,使用配置文件将使应用程序更加灵活。 Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java属性文件(键=值)。 Log4J的配置文件(ConfigurationFile)就是用来设置记录器的级别、存放器和布局的,它可按key=value格式的设置或xml格式的设置信息。 通过配置,可以创建出Log4J的运行环境。 在配置文件中主要指定Rootlogger的级别并且和一个appender相绑定,同时再指定appender的属性,最后再为appender指定一个layout。 下面我们介绍使用Java特性文件做为配置文件的方法: (1)配置根Logger或者其它Logger,其语法为: log4j.rootLogger=[level],appenderName,appenderName,… 其中,level是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。 Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。 通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。 比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指定日志信息输出到哪个地方。 您可以同时指定多个输出目的地。 如输出目的地为控制台: log4j.rootLogger=INFO,system.out 如果为log4j.rootLogger=WARN,则意味着只有WARN,ERROR,FATAL被输出,而DEBUG,INFO将被屏蔽掉。 如输出目的地为文件: log4j.logger.thisProject.file=INFO,thisProject.file.out 也可以为某个日志记录器同时指定多个目的地 log4j.rootLogger=INFO,system.out,thisProject.file.out (2)再配置该日志记录器的日志信息输出目的地Appender Log4j日志系统允许把日志信息输出到不同的目的地,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。 ●Log4j中定义的日志信息输出目的地,有下面的各种形式 ✓ConsoleAppender: 使用用户指定的布局(layout)输出日志事件到System.out或者System.err。 默认的目标是System.out。 ✓DailyRollingFileAppender扩展FileAppender,每天产生一个日志文件,因此多个日志文件可以以一个用户选定的频率进行循环日志记录。 ✓FileAppender把日志事件写入一个文件 ✓RollingFileAppender扩展FileAppender备份容量达到一定大小的日志文件。 ✓WriterAppender根据用户的选择把日志事件写入到Writer或者OutputStream。 ✓SMTPAppender当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件。 ✓SocketAppender给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。 ✓SocketHubAppender给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。 ✓SyslogAppender给远程异步日志记录的后台精灵程序(daemon)发送消息。 ✓TelnetAppender一个专用于向只读网络套接字发送消息的log4jappender。 ●其语法为 log4j.appender.appenderName=fully.qualified.name.of.appender.class 如: log4j.appender.system.out=org.apache.log4j.ConsoleAppender 如: log4j.appender.thisProject.file.out=org.apache.log4j.DailyRollingFileAppender (3)配置日志信息的格式(布局) 有时用户希望根据自己的喜好格式化自己的日志输出。 Log4j可以在Appenders的后面附加Layouts来完成这个功能。 Layouts提供了四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。 其语法为: log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class 布局负责格式化输出的log信息。 log4j的PatternLayout可以让程序以类似C语言printf的格式化模板来定义格式。 其中,Log4j提供的layout可以为下面的几种: org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 如: log4j.appender.system.out.layout=org.apache.log4j.PatternLayout log4j.appender.system.out.layout.ConversionPattern=this4j-->%5p{%F: %L}-%m%n 如: log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-ddHH: mm: ss}[%c]-[%p]%m%n 七、在程序中使用Log4j (1)第一步: 配置Log4j环境 其语法为: ●BasicConfigurator.configure() 自动快速地使用缺省Log4j环境。 ●PropertyConfigurator.configure(StringconfigFilename) 读取使用Java的属性文件编写的配置文件,该参数是一个完整的路径名称,指向一个包含Log4J配置信息的属性文件。 ●DOMConfigurator.configure(Stringfilename) 读取XML形式的配置文件。 如: PropertyConfigurator.configure("log4j.properties"); 注意: 也可以不用调用PropertyConfigurator.configure(),而是让Log4J自己在模块的CLASSPATH中寻找一个叫Log4J.properties的属性文件。 查找属性文件的操作在Logger.getLogger()函数第一次被调用时执行。 (2)第二步: 就是获取日志记录器,这个记录器将负责控制日志信息。 其语法为: publicstaticLoggergetLogger(Stringname), 通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。 在对Logger实例进行命名时,没有限制,可以取任意自己感兴趣的名字。 但一般取本类的名字作为Name。 比如: LoggerloggerConsole=Logger.getRootLogger(); 如: LoggerloggerFile=Logger.getLogger("thisProject.file"); (3)第三步: 插入记录信息(格式化日志信息) 当上面的两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下: Logger.debug(Objectmessage
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 Log4j 进行 日志 操作