`
freewxy
  • 浏览: 342678 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

log4j的使用与详细分析

 
阅读更多

一、什么是log4j?  http://logging.apache.org/log4j/(官方网站)

Log4jApache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

二、为什么使用log4j?

1javaSystem.out.println(message) 太长,每次输入太麻烦,用log4j可以log.debug(message),相对比较短
2
、信息输出来源不确定,由于有太多的System.out.println()来自不同的class和方法,有时候都不知道这些"FlagMsg"是哪里来的,只好用"classA", "methodB"来区分,用了log4j,每个消息会自动附上发生的时间和来源,便于区分,比如,在你的class里面用log.info("I am form here") 便产生如下log:
[2011-08-04 20:34:42,828] INFO  testpkg.pkg1.TestLog run() – I am from here
3
、自动添加/删除调试信息:开发的时候需要调试信息,安装到运行环境中又要删除部分调试信息(这可是体力活),一旦出错进行后期维护又需要调试信息了,可是这些调试信息已经从源代码中删掉了,又要再加,再删除,如此往复。有了log4j,所有信息分为不同级别,DEBUG<INFO<WARN<ERROR<FATAL 开发/调试时候需要DEBUG以上的信息,正式运行环境中需要INFO以上的信息,通过更改配置文件即可随时调整,无须再删除/添加了。

4
、多日志目标。有条信息,即想要输出到屏幕,又想要写文件,还要发送邮件(比如严重的系统错误),在程序中,仍然是一句log.error(msg)搞定,至于log发送到什么地方,全由配置文件来决定,开发者不要关心文件如何写,邮件如何发的问题,留给log4j去解决把。
5
、超强的免维护rolling filelog功能,如果开发个服务器应用,有什么问题往log里面写,万一几个月忘了清理log文件,弄不好log把硬盘撑满了。log4j提供超强的rolling file,可以指定log文件为 xxx.log ,大小500k,循环5个,如果超过了这个大小,则自动变成xxx.log.1 xxx.log.2 ... xxx.log.5 最老的log文件就自动删除,永远也不要担心log文件把硬盘撑爆了。
(以上理由同样适用于java se 1.4以上自带的logging
6
用户众多,性能超群,数量众多的应用服务器比如jboss, springframework等等都使用了log4j,再次证明了它的价值。
7
apache logging还提供了log4net log4cxx等,大部分功能都与log4j兼容如果你使用多种语言开发,可以因此受益。省去每种语言都学习一套类库。

 

三、如何使用log4j?

1、  在官网上下载到dom4j-1.2.X.jar包,并将其加入到项目projectlib下。

2、在projectsrc目录下建立一个名字为log4j.properties的配置文件:

  根据自己需要配置属性(下面会详细介绍配置信息内容) 

4 、在需要输出日志的类中加入相关的代码:

   

定义属性:


 static Logger logger = Logger.getLogger(PointDipatchTest.class.getName());

    在相应的方法中用如下代码代替system.out.println(“message”)

  if(logger.isInfoEnabled())
		    logger.info(message);
  } 

  

至此,四步完成对log4j的配置与使用!

四、log4j.properties配置文件中各属性揭秘:

1log4j.rootCategory=INFO, stdout , R

 此句为将等级为INFO的日志信息输出到stdoutR这两个目的地,stdoutR的定义在下面的代码,可以任意起名。等级可分为OFFFATALERRORWARNINFODEBUGALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERRORlog信息,而DEBUG信息不会被显示,具体讲解可参照第五部分定义配置文件中的logger

2log4j.appender.stdout=org.apache.log4j.ConsoleAppender

 此句为定义名为stdout的输出端是哪种类型,可以是 org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)



 

具体讲解可参照第五部分定义配置文件中的Appender

 

3 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

 此句为定义名为stdout的输出端的layout是哪种类型,可以是 org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)



 

具体讲解可参照第五部分定义配置文件中的Layout

 

4 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

  如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。 [QC]是log信息的开头,可以为任意字符,一般为项目简称。



 

具体讲解可参照第五部分定义配置文件中的格式化日志信息。

 

5 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

 此句与第3行一样。定义名为R的输出端的类型为每天产生一个日志文件。

6 log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log

 此句为定义名为R的输出端的文件名为D:\\Tomcat 5.5\\logs\\qc.log可以自行修改。

7 log4j.appender.R.layout=org.apache.log4j.PatternLayout与第4行相同。

8 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n 与第5行相同。

9 log4j.logger.com. neusoft =DEBUG

指定com.neusoft包下的所有类的等级为DEBUG。可以把com.neusoft改为自己项目所用的包名。

10 log4j.logger.com.opensymphony.oscache=ERROR

11 log4j.logger.net.sf.navigator=ERROR

 这两句是把这两个包下出现的错误的等级设为ERROR,如果项目中没有配置EHCache,则不需要这两句。

12log4j.logger.org.apache.commons=ERROR

13 log4j.logger.org.apache.struts=WARN

这两句是struts的包。

14 log4j.logger.org.displaytag=ERROR

 这句是displaytag的包。(QC问题列表页面所用)

15 log4j.logger.org.springframework=DEBUG

 此句为Spring的包。

16 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

17 log4j.logger.org.hibernate=DEBUG

此两句是hibernate的包。

 以上这些包的设置可根据项目的实际情况而自行定制。

 

五、log4j的详细组成:

 

--Log4J组件的超

  Log4J提供了一个root Logger,它是所有Logger组件的祖先”,它永远存在,且不能通过名字检索或引用,通过Logger.getRootLogger()方法取得它。配置root Logger代码: log4j.rootLogger=INFO,console




 


 

 

--LOG4J组件的继承性
可在配置文件中方便地配置存在继承关系的Logger组件,凡是在符号“.”后面的组件都会成为在符号“.”前面的Logger组件的子类。例如: log4j.apache.myLogger=WARN log4j.apache.myLogger.mySonLogger=,file



 

 

 Logger继承关系示例图
  root Logger:
日志级别=INFO  appender清单=console
  myLogger:
日志级别=WARN     appender清单
=null
  mySonLogger:
日志级别=null  appender清单
=file


 这三个Logger组件实际日志级别和Appender如下表:

  Logger
组件          日志级别          Appender清单
  root Logger          INFO             console
  myLogger           WARN             console(
继承)
  mySonLogger          WARN(
继承)           fileconsole(继承

--LOG4J主要由三大组件组成

  三大组件定义配置文件

  Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)
1、记录器(Logger):决定什么日志信息应该被输出、什么日志信息应该被忽略;

  Logger组件是LOG4J的核心组件,它代表了Log4J的日志记录器,它能够对日志信息进行分类筛选。它由org.apache.log4j.Logger类实现
Logger
组件提供的方法: package org.apache.log4j; public class Logger { // Creation & retrieval methods: public static Logger getRootLogger(); public static Logger getLogger(String name); // printing methods: public void debug(Object message); public void info(Object message); public void warn(Object message); public void error(Object message); public void fatal(Object message); // generic printing method public void log(Priority p, Object message); }



 

在配置文件中配置Logger组件:可在Log4J配置文件中配置自己的Logger组件,示例: log4j.logger.myLogger=WARN


 

 


  以上代码定义了一个Logger组件,名称为myLogger,日志级别为WARN 

 2、存放器(Appender): 指定日志信息应该输出到什么地方, 这些地方可以是控制台、文件、网络设备
3
、布局管理器(Layout): 指定日志信息的输出格式

组件之间的关系:
 
一个Logger可以有多个Appender,也就是说日志信息可以同时输出到多个设备上,每个Appender对应一种Layout

 1、配置根Logger

 Logger 负责处理日志记录的大部分操作。

 其语法为:

 log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFFFATALERRORWARNINFODEBUGALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERRORWARNINFODEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。

  

2、配置日志信息输出目的地 Appender

Appender 负责控制日志记录操作的输出。

 其语法为:这里的appenderName为在上面提到的,可任意起名。

log4j.appender.appenderName=fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1  … log4j.appender.appenderName.optionN = valueN  


 

 其中,Log4j提供的appender有以下几种:例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender

org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。 org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)


 

 定义一个名为stdout的输出目的地,ConsoleAppender为控制台。

3、配置日志信息的格式(布局)Layout

 Layout 负责格式化Appender的输出。

 其语法为:

log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1  … log4j.appender.appenderName.layout.optionN = valueN


 

 其中,Log4j提供的layout有以下几种:  格式化日志信息

org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)


 

 

  Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:日志级别
    
记录器还有一个重要的属性,就是级别。(就象一个家庭中,成员间存在辈份关系,但不同的成员的身高可能不一样,且身高与辈份无关)程序员可以给不同的记录器赋以不同的级别,如果某个成员没有被明确值,就自动继承最近的一个有级别长辈的级别值。根记录器总有级别值。

 日志级别种类一共有五种,级别由高到低依次是:fatalerrorwarninfodebug。获得Logger

实例后,我们可调用以下方法之一输出日志信息:

 

%m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。


 

 

注意:以上方法只有当它的级别大于或等于Logger组件配置的日志级别时才调用。以前面我们配置的myLogger为例,它的日志级别为WARN, 那么在程序中,它的warn()error()fatal()方法会被执行。对于log()方法,只有当它的参数Priority指定的日志级别大于或等于WARN时,它才会被执行。


 
为什么需要对日志进行分级?
   
在写程序的时候,为了调试程序,我们会在很多出错的地方输出大量的日志信息。当程序调试完,不需要这些信息时,将程序中这些输出日志信息代码删除吗?这样费时费力,对于大型程序几乎不可行。通过对日志分级,假如不想输出WARN级别的日志信息,则Logger组件的级别调高即可,省时省心。

 

Tips:

如果你用eclipse,有个免费的插件叫做log4e,可以自动帮你生成if(logger.isDebugEnabled()) {}这些代码,自动生成private static final Logger logger = org.apache.log4j.Logger.getLogger(本类名字.class);的定义,而且可以自动帮你把文件里的System.out.println()都替换成logger.debug(),减少你自己手写的部分,还是很方便的。

1
2
分享到:
评论

相关推荐

    Log4j2简介及与Log4j效率对比

    与Log4j 1.x相比,Log4j2在设计上进行了重大改进,并解决了Logback等其他日志框架中存在的某些体系结构问题。 #### 特性概述 1. **审计功能**:Log4j2设计时考虑到了审计需求,这意味着即使在配置更新过程中,它也...

    log4j简单使用

    描述中的"NULL"意味着没有额外的具体信息,但我们通常可以从Log4j的使用上下文中了解到,它广泛用于调试、性能分析和系统监控,通过输出详细的运行时信息帮助开发者理解程序状态和追踪问题。 **标签解析** "源码...

    Log4j详解,详细讲解log4j的使用,和原理

    Log4j 详解 Log4j 是一款功能强大的日志记录工具,广泛应用于 Java 应用程序中。它可以帮助开发人员调试和分析程序,记录程序的运行情况,并提供了灵活的配置方式来控制日志的输出。 Log4j 的概念 Log4j 中有三个...

    log4j使用详解log4j使用详解

    ### Log4j 使用详解 #### 一、Log4j简介 Log4j 是 Apache 的一个开源项目,通过使用 Log4j,开发者能够控制日志信息的输出等级及去向,从而更加灵活地处理日志信息。它具有强大的功能,简单的配置,并且能够支持...

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    Log4j、Log4j2和Fastjson的安全性问题在过去曾引起广泛关注,例如Log4j2的CVE-2021-44228(也被称为Log4Shell漏洞),这是一个远程代码执行漏洞,影响了许多使用Log4j2的系统。这个插件可能就是为了检测和利用这些...

    log4j的使用详细解析

    Log4j是一款广泛使用的Java日志记录框架,它允许开发者以高效且灵活的方式来记录应用程序的日志信息。在本文中,我们将深入探讨Log4j的使用方法,包括配置文件的设置、根配置、输出目的地以及日志信息的格式。 首先...

    log4j-API-最新稳定版本log4j-1.2.17

    这表明我们可以从这个文件中获取Log4j 1.2 API的详细使用指南和参考文档。 **Log4j API知识点** 1. **日志级别**:Log4j API支持多个日志级别,如DEBUG、INFO、WARN、ERROR和FATAL。这些级别允许开发者根据需要...

    如何使用Log4j如何使用Log4j

    #### 四、使用Log4j记录日志 1. **引入Log对象**: ```java protected final Log log = LogFactory.getLog(getClass()); ``` 在Java类中,需要引入Log对象以便记录日志信息。 2. **记录日志信息**: ```...

    log4j-2.18.0

    Log4Shell漏洞的核心在于log4j2的Lookup功能,该功能允许在日志消息中动态解析变量。攻击者可以利用此功能,将恶意的JNDI链接注入到日志记录中,当log4j2尝试解析这些链接时,就会执行攻击者控制的代码。由于很多...

    log4j使用jar包和log4j.properties配置文件

    本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j是一个开源的日志组件,支持多种输出格式,如控制台、文件、数据库等。它的核心概念包括Logger、...

    最详细的Log4j使用教程

    Log4j是一个广泛使用的Java日志框架,由ApacheJakarta项目开发。它为开发者提供了灵活且功能丰富的日志记录机制,使应用程序中的日志管理变得简单。本教程将深入介绍如何使用Log4j进行日志记录,包括配置、基本用法...

    log4j-api-2.17.1.jar和log4j-core-2.17.1.jar

    本文将详细探讨Log4j2中的两个关键组件:log4j-api-2.17.1.jar和log4j-core-2.17.1.jar。 首先,log4j-api-2.17.1.jar是Log4j2的核心API库,它定义了日志记录的接口和抽象类,为应用程序提供了一套编程模型。这些...

    log4j-2.17.1的jar包,导入即可使用

    Log4j是Java编程语言中广泛使用的日志记录框架,特别是在企业级应用和大型系统中。这个"**log4j-2.17.1**"的版本是该框架的一个更新,提供了修复的安全漏洞和性能优化。以下是关于Log4j 2.17.1的一些关键知识点: 1...

    log4j-1.2.15.jar

    本文将详细解析Log4j 1.2.15.jar这个版本的核心概念、使用方法以及重要特性。 一、Log4j简介 Log4j是由Apache软件基金会开发的一个开源日志组件,主要为Java应用程序提供日志服务。它的设计理念是让日志输出变得...

    log4j.rar log4j使用方法

    - **log4j使用方法.doc**:这是一个文档文件,很可能包含关于如何在实际项目中配置和使用log4j的详细步骤和示例代码。 - **log4j.rar**:这个压缩文件可能是log4j的库文件,或者包含了额外的示例项目、配置文件和...

    Log4J完整说明和配置

    ### Log4J完整说明与配置解析 #### 一、Log4J简介 Log4J是Apache的一个开源项目,用于提供灵活的日志记录功能。通过它,开发者能够控制日志信息的输出级别、输出目的地(控制台、文件等)、格式化方式等。本文将...

    log4j使用jar文件

    Log4j是一款广泛使用的Java日志记录框架,它允许开发者以灵活的方式控制应用程序的日志输出。这个框架的主要目的是提供一种简单、高效的日志记录机制,帮助开发者调试代码、追踪问题,以及收集运行时信息。在Java...

    log4j-1.2.16下载

    本文将详细解析Log4j的1.2.16版本,探讨其核心组件,并提供实际应用中的指导。 一、Log4j概述 Log4j是一个基于Java的日志API,它的设计目标是提供一个灵活且高效的日志记录系统,支持多种输出格式,如控制台、文件...

    log4j实用配置扩展

    #### 四、log4j的核心组件 log4j的核心组件主要包括**Loggers(记录器)**、**Appenders(输出源)**和**Layouts(布局)**。 1. **Loggers (记录器)**:负责生成日志信息,并决定是否发送日志信息到Appenders。记录器...

    新版本与旧版本log4j.jar包下载,附使用说明----.zip

    **IDEA与log4j**: IntelliJ IDEA(简称IDEA)是一款流行的Java集成开发环境,它支持将log4j集成到项目中,通过配置pom.xml或build.gradle文件添加依赖,或者手动将log4j.jar添加到项目的类路径下,以便在IDEA中直接...

Global site tag (gtag.js) - Google Analytics