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

配置

第一步

加入log4j-1.2.8.jar(可以选择log4j的更高版本)到lib下。

如果使用maven项目,也可以选择在pom.xml中新增依赖:

<!-- 加入log4j支持 -->

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.17</version>

</dependency>

第二步

在CLASSPATH下建立log4j.properties。内容如下(数字为行号):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

log4j.rootCategory=INFO, stdout , R

 
 

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

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

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

 
 

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

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

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

 
 

log4j.logger.com.neusoft=DEBUG

log4j.logger.com.opensymphony.oscache=ERROR

log4j.logger.net.sf.navigator=ERROR

log4j.logger.org.apache.commons=ERROR

log4j.logger.org.apache.struts=WARN

log4j.logger.org.displaytag=ERROR

log4j.logger.org.springframework=DEBUG

log4j.logger.com.ibatis.db=WARN

log4j.logger.org.apache.velocity=FATAL

 
 

log4j.logger.com.canoo.webtest=WARN

 
 

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

log4j.logger.org.hibernate=DEBUG

log4j.logger.org.logicalcobwebs=WARN

第三步

相应的修改其中属性,修改之前就必须知道这些都是干什么的,在第二部分讲解。

第四步

在要输出日志的类中加入相关语句:

定义属性:static Logger logger = Logger.getLogger(LogDemo.class); //LogDemo为相关的类

在相应的方法中:

if (logger.isDebugEnabled()){

logger.debug("System …..");

}

说明

、log4j.rootCategory=INFO, stdout , R

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

、log4j.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。

、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。

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

如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:

%m 输出代码中指定的消息;

%M 输出打印该条日志的方法名;

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;

%r 输出自应用启动到输出该log信息耗费的毫秒数;

%c 输出所属的类目,通常就是所在类的全名;

%t 输出产生该日志事件的线程名;

%n 输出一个回车换行符,Windows平台为"rn",Unix平台为"n";

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;

%l 输出日志事件的发生位置,及在代码中的行数;

[QC]是log信息的开头,可以为任意字符,一般为项目简称。

输出的信息

[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'

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

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

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

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

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

、log4j.appender.R.layout=org.apache.log4j.PatternLayout

行相同。

、log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

行相同。

、log4j.logger.com. neusoft =DEBUG

指定com.neusoft包下的所有类的等级为DEBUG。

可以把com.neusoft改为自己项目所用的包名。

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

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

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

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

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

这两句是struts的包。

、log4j.logger.org.displaytag=ERROR

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

、log4j.logger.org.springframework=DEBUG

此句为Spring的包。

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

、log4j.logger.org.hibernate=DEBUG

此两句是hibernate的包。

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

详解

定义配置文件

Log4j支持两种配置文件格式,一种是XML(标准通用标记语言下的一个应用)格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法:

①、配置根Logger

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

其语法为:

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

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

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

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

其语法为:

log4j.appender.appenderName = fully.qualified.name.of.appender.class

log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.optionN = valueN

这里的appenderName为在①里定义的,可任意起名。

其中,Log4j提供的appender有以下几种:

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(将日志信息以流格式发送到任意指定的地方)

例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender

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

③、配置日志信息的格式(布局)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函数的打印格式格式化日志信息,打印参数如下:

%m 输出代码中指定的消息;

%M 输出打印该条日志的方法名;

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;

%r 输出自应用启动到输出该log信息耗费的毫秒数;

%c 输出所属的类目,通常就是所在类的全名;

%t 输出产生该日志事件的线程名;

%n 输出一个回车换行符,Windows平台为"rn",Unix平台为"n";

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;

%l 输出日志事件的发生位置,及在代码中的行数。

运用在代码中

我们在需要输出日志信息的类中做如下的三个工作:

、导入所有需的commons-logging类:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员:

private final Log log = LogFactory.getLog(getClass());

LogFactory.getLog()方法的参数使用的是当前类的class。

、使用org.apache.commons.logging.Log类的成员方法输出日志信息:

if (log.isDebugEnabled()){

log.debug("111");

}

if (log.isInfoEnabled()){

log.info("222");

}

if (log.isWarnEnabled()){

log.warn("333");

}

if (log.isErrorEnabled()){

log.error("444");

}

if (log.isFatalEnabled()){

log.fatal("555");

}

2.3 如何应用记录器的层次

2.3.1 如何定义及获取不同层次的记录器

任何一个记录器的使用都有两个步骤:

1) 在配置文件中定义相应的记录器。

在配置文件中定义记录器的格式有两种

? 定义根记录器的格式为

log4j.rootLogger = [ level ], appendName1, appendName2, …appendNameN

? 定义一个非根记录器的格式为

log4j.logger.loggerName1 = [ level ], appendName1,…appendNameN

……

log4j.logger.loggerNameM = [ level ], appendName1, …appendNameN

我们可以定义任意个非根记录器。

2) 在代码中调用Logger类的取得记录器方法取得相应的记录器对象。

要取得根记录器对象可通过Logger.getRootLogger()函数,要取得非根记录器可通过Logger.getLogger()函数。

理论知道就讲到这里,纸上得来终觉浅,下面,我们来小小演练一下。

例4-a:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

package TestLog4j;

import org.apache.log4j.Logger;

import org.apache.log4j.PropertyConfigurator;

import org.apache.log4j.Priority;

import TestLog4j.TestLog4j2.TestLog4j2;

public class TestLog4j

{

static Logger logger = Logger.getLogger(TestLog4j.class.getName()); //(2)

public TestLog4j(){}

public static void main(String[] args)

{

//同时输出到控制台和一个文件的实例并实现了Logger的继承

PropertyConfigurator.configure("F:\\nepalon\\log4j2.properties");

logger.debug("Start of the main() in TestLog4j");

logger.info("Just testing a log message with priority set to INFO");

logger.warn("Just testing a log message with priority set to WARN");

logger.error("Just testing a log message with priority set to ERROR");

logger.fatal("Just testing a log message with priority set to FATAL");

logger.log(Priority.WARN, "Testing a log message use a alternate form");

logger.debug(TestLog4j.class.getName());

TestLog4j2 testLog4j2 = new TestLog4j2(); //(1)

testLog4j2.testLog();

}

}

在类TestLog4j中我们调用了另一个类TestLog4j2,下面看一下类TestLog4j2的代码。

例4-b:

package TestLog4j.TestLog4j2;

import org.apache.log4j.Logger;

import org.apache.log4j.PropertyConfigurator;

import org.apache.log4j.Priority;

public class TestLog4j2

{

static Logger logger = Logger.getLogger(TestLog4j2.class.getName()); //(1)

public TestLog4j2(){}

public void testLog()

{

//同时输出到控制台和一个文件的实例

PropertyConfigurator.configure("F:\\nepalon\\log4j2.properties");

logger.debug("2Start of the main()");

logger.info("2Just testing a log message with priority set to INFO");

logger.warn("2Just testing a log message with priority set to WARN");

logger.error("2Just testing a log message with priority set to ERROR");

logger.fatal("2Just testing a log message with priority set to FATAL");

logger.log(Priority.DEBUG, "Testing a log message use a alternate form");

logger.debug("2End of the main()");

}

}

最后我们来看一下配置文件。

例4-c:

log4j2.properties文件内容

#1区

#### Use two appenders, one to log to console, another to log to a file

log4j.rootLogger = debug, stdout,R

#2区

#Print only messages of priority WARN or higher for your category

log4j.logger.TestLog4j= , R

log4j.logger.TestLog4j.TestLog4j2=WARN

#3区

#### First appender writes to console

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

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

# Pattern to output the caller's file name and line number.

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

#4区

#### Second appender writes to a file

log4j.appender.R=org.apache.log4j.RollingFileAppender

log4j.appender.R.File=F:\\nepalon\\classes\\TestLog4j\\example.log

# Control the maximum log file size

log4j.appender.R.MaxFileSize=100KB

# Archive log files (one backup file here)

log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

先看一下运行结果。

在控制台中的结果为:

DEBUG [main] (?:?) - Start of the main() in TestLog4j

INFO [main] (?:?) - Just testing a log message with priority set to INFO

WARN [main] (?:?) - Just testing a log message with priority set to WARN

ERROR [main] (?:?) - Just testing a log message with priority set to ERROR

FATAL [main] (?:?) - Just testing a log message with priority set to FATAL

WARN [main] (?:?) - Testing a log message use a alternate form

DEBUG [main] (?:?) - TestLog4j.TestLog4j

WARN [main] (?:?) - 2Just testing a log message with priority set to WARN

ERROR [main] (?:?) - 2Just testing a log message with priority set to ERROR

FATAL [main] (?:?) - 2Just testing a log message with priority set to FATAL

输出文件的结果为:

2003-12-19 04:19:44:DEBUG main TestLog4j.TestLog4j - Start of the main() in TestLog4j

2003-12-19 04:19:44:INFO main TestLog4j.TestLog4j - Just testing a log message with priority set to INFO

2003-12-19 04:19:44:WARN main TestLog4j.TestLog4j - Just testing a log message with priority set to WARN

2003-12-19 04:19:44:ERROR main TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR

2003-12-19 04:19:44:FATAL main TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL

2003-12-19 04:19:44:WARN main TestLog4j.TestLog4j - Testing a log message use a alternate form

2003-12-19 04:19:44:DEBUG main TestLog4j.TestLog4j - TestLog4j.TestLog4j

2003-12-19 04:19:44:WARN main TestLog4j.TestLog4j2.TestLog4j2 - 2Just testing a log message with priority set to WARN

2003-12-19 04:19:44:ERROR main TestLog4j.TestLog4j2.TestLog4j2 - 2Just testing a log message with priority set to ERROR

2003-12-19 04:19:44:FATAL main TestLog4j.TestLog4j2.TestLog4j2 - 2Just testing a log message with priority set to FATAL

首先,先来看一下配置文件都有些什么东西。

区中定义了一个根记录器。这个根记录器具有DEBUG级别并有一个名称为stdout的输出端appender。

2) 2区中的内容是这一节的重点,也是应用到记录器层次的地方,但其实也只有两句,充分体现了log4j的简单性。在这里,我们定义了两个名称分别为TestLog4j和TestLog4j.TestLog4j2设计器。

? 在定义TestLog4j记录器时没有指定级别,所以它的级别继承自它的父记录器,即根记录器,所以它的级别也为DEBUG。在定义TestLog4j记录器时又定义了一个名称为R的输出端,所以它的输出端有两个,一个从根记录器继承而来的名为stdout的输出端,另一个为在此定义的名为R的输出端。在此需要注意的是,在定义记录器时必须先定义记录器的级别,然后才是记录器的输出端。如果只想定义输出端而不定义级别,则虽然级别可以为空,但逗号分隔符不能省略。如定义TestLog4j记录器的做法。

? 在定义TestLog4j.TestLog4j2记录器时又指定了它的级别,由于一个记录器的级别只能有一个,所以新指定的级别将覆写掉它的父记录器的级别(这就象Java中的多态)。我们没有定义TestLog4j.TestLog4j2记录器的输出端,所以它的输出端将从它的父记录器中继承而来。它的父记录器为TestLog4j记录器,所以它和TestLog4j记录器一样具有两个名称分别为 stdout和R的输出端。

区和4区分别设置了两个输出端的参数值。

接下来,回到我们的代码,看一下是如何取得记录器,在取记录器时又发生了什么。

)中,语句Logger.getLogger()中的参数TestLog4j.class.getName()的值为 TestLog4j. TestLog4j,所以此语句的结果是取得一个名为TestLog4j. TestLog4j的记录器的对象。但在配置文件中并没有定义这样的记录器,所以最终将返回与所需的名称TestLog4j. TestLog4j最接近的记录器对象,即名为TestLog4j的记录器的对象。

)的原理与例4-a中的代码(2)相似,期望取得的是名为TestLog4j.TestLog4j2. TestLog4j2的记录器对象,但最终返回的是TestLog4j.TestLog4j2记录器的对象。

 

 

 

本文出自:https://baike.baidu.com/item/log4j/480673?fr=aladdin#1

Log4j配置和解释的更多相关文章

  1. Log4j配置具体解释

    #配置Logger #--log4j.rootLogger=[level], appenderName1, appenderName2, ... #level分为: # FATAL : 0 # ERR ...

  2. Log4J日志配置具体解释

    一.Log4j简单介绍 Log4j有三个基本的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综 ...

  3. 使用log4j配置不同文件输出不同内容

    敲代码中很不注意写日志,虽然明白很重要.今天碰到记录日志,需要根据内容分别输出到不同的文件. 参考几篇文章: 感觉最详细:http://blog.csdn.net/azheng270/article/ ...

  4. 简要log4j配置

    若排版紊乱可查看我的个人博客原文地址 1. 配置效果 下面的log4j日志配置最终能达到的效果是对于全局日志可以根据级别输入到对应级别的日志文件中,注意低级别的日志文件会同时包含高级别的日志信息,例如 ...

  5. Spring+mybatis+struts框架整合的配置具体解释

    学了非常久的spring+mybatis+struts.一直都是单个的用他们,或者是两两组合用过,今天总算整合到一起了,配置起来有点麻烦.可是配置完一次之后.就轻松多了,那么框架整合配置具体解释例如以 ...

  6. log4j 配置

    给java项目添加log4j日志: 1.下载log4j jar包,放入lib目录, 导入项目中 2.创建log4j.properties 文件  目录 Src 3.在需要使用输出的类中使用 priva ...

  7. log4j配置日志文件log4j.appender.R.File相对路径方法

    方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...

  8. paip.Log4j配置不起作用的解决

    paip.Log4j配置不起作用的解决 1.jar包里的log4j配置 看累挂jar,真的有个" webservices-rt.jar\com\sun\org\apache\xml\inte ...

  9. Flume学习 & Kafka & Storm 等 & Log4J 配置

    正在学习这篇文章: http://blog.csdn.net/ymh198816/article/details/51998085 和工作中接触的电商.订单.分析,可以结合起来. 开宗明义,这幅图片: ...

随机推荐

  1. liunx redis集群添加密码

    第一种方法: 修改每个节点redis.conf配置文件: masterauth 123456 requirepass 123456 各个节点的密码都必须一致,否则Redirected就会失败 重新启动 ...

  2. docker 进阶

    docker 常用命令: docker  pull hub.c.163.com/library/mysql:latest  #这是从网址下载下来mysql镜像 docker run  -d -p 88 ...

  3. echarts移动端中例子总结。

    接下来我总结一下我常用到的几个移动端echarts小例子: 第一步:我先引入自己想要的库 第二步: 给echarts给了一个窗口(有大小的窗口) 第三步: 开始引入你想要的图形的options 我做的 ...

  4. 《XXX重大技术需求征集系统》的可用性和可修改性战术分析

    在网站的界面完整有效的呈现在最终用户面前前,其中经历的每一环节出现问题都会导致网站页面不可访问.原因如,如DNS被劫持.网站交换机失效,硬盘损坏,网卡松掉,机房停电等都可能导致网站不可用(网站故障)情 ...

  5. WIN10在安装mysql时,出现“The security settings could not be applied to the database because the connection has failed with the following error. Error Nr. 1045

    解决方法:1, 首先卸载MySQL2, 再根据这个目录 C:\ProgramData,将MySQL删除.3, 重新安装MySQL 就好了(电脑不用重启)

  6. EsayUi中常用的属性和方法总结

    文章转载自http://www.jb51.net/article/26077.htm 详细了解请查看官方文档 属性分为CSS片段和JS片段 CSS类定义:1.div easyui-window     ...

  7. loadrunner之java user脚本开发

    脚本开发环境: loadrunner11.0 jdk1.6.32_x86_32 脚本开发 1.选择JavaVuser协议 2.配置java环境(Vuser--RunTime Settings) 3.开 ...

  8. BSUIR Open Finals

    A. Game with chocolates 因为差值必须是$P$的幂,故首先可以$O(\log n)$枚举出先手第一步所有取法,判断之后的游戏是否先手必败. 对于判断,首先特判非法的情况,并假设$ ...

  9. Hibernate 对象关系映射文件

    简介: POJO 类和关系型数据库之间的映射可以用一个 XML 文档来定义 通过 POJO 类的数据库映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据 ...

  10. How to change Eclipse loading image

    Eclipse IDE has many customize components, the splash welcome image (purple color loading image) is ...