log4j配置详解

来源:互联网 发布:数控火焰切割手动编程 编辑:程序博客网 时间:2024/06/06 10:43

一直以来都是拷贝别人的log4j配置文件,却没去弄清楚配置文件各个配置的含义,今天结合网上的资料总结了下。

log4j简单介绍
    Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
     官网下载地址:http://logging.apache.org/log4j/1.2/download.html
     Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)。
     其中:
     日志记录器(Loggers):控制要输出哪些日志记录语句,对日志信息进行级别限制。
     输出端(Appenders):日志目的地,把格式化好的日志信息输出到指定的地方去,可以指定多个。
     日志格式化器(Layout):日志格式化器,用来把程序员的logging request格式化成字符串。

  • log4j的日志级别
日志级别:ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF,不区分大小写。官方推荐只使用中间四种级别。
分别是:DEBUG<INFO<WARN<ERROR
日志级别用来指定这条日志信息的重要程度,Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
OFF是关闭输出日志信息,ALL是输出所有日志信息。

先来看一个简单的例子

package com.log4j.test;import org.apache.log4j.BasicConfigurator;import org.apache.log4j.Level;import org.apache.log4j.Logger;public class log4jTest1 {    public static void main(String[] args) {        Logger logger=Logger.getLogger(log4jTest1.class);        //使用默认的配置信息,不需要写log4j.properties        BasicConfigurator.configure();        //设置日志输出级别为info,这将覆盖配置文件中设置的级别        logger.setLevel(Level.INFO);        //下面的消息将被输出        logger.info("this is an info");        logger.warn("this is a warn");        logger.error("this is an error");        logger.fatal("this is a fatal");    }
这个例子只是使用log4j默认的基本配置,输出后控制台打印如下:



其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(log4j.properties)(键=值)。
下面看另一个例子:

package com.log4j.test;import org.apache.log4j.Logger;public class log4jTest2 {     private static Logger logger = Logger.getLogger(log4jTest2.class);     public static void main(String[] args) {        // System.out.println("This is println message.");        // 记录debug级别的信息        logger.debug("This is debug message.");        // 记录info级别的信息        logger.info("This is info message.");        // 记录error级别的信息        logger.error("This is error message.");    }}

log4j.properties文件内容如下:

### 设置###log4j.rootLogger = debug,stdout,D,E### 输出信息到控制台 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 输出DEBUG 级别以上的日志到=log/log.log ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = log/logTest2.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUGlog4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### 输出ERROR 级别以上的日志到=log/error.log ###log4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File =log/errorTest2.loglog4j.appender.E.Append = truelog4j.appender.E.Threshold = ERRORlog4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n


建立log文件夹来存放日志。
运行后,控制台打印如下:
再看看log文件夹,新生成了.log文件

对应文件的内容:


现在,我们更改下log4j配置文件中的一部分如下:

即改为以html格式输出。输出结果如下:
生成新文件:
打开:


配置文件详细参数解释:
下面再来详细说说log4j.properties文件里各个参数的意思:
(1)rootLogger
全局配置。
格式:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
level是指日志记录的优先级,其值可以是上面说过的级别中的任一个(OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL)一般建议用使用四个中的一个(ERROR、WARN、INFO、DEBUG)。
下面是log4j对日志级别的定义:
public final static int OFF_INT = Integer.MAX_VALUE;public final static int FATAL_INT = 50000;public final static int ERROR_INT = 40000;public final static int WARN_INT  = 30000;public final static int INFO_INT  = 20000;public final static int DEBUG_INT = 10000;//public final static int FINE_INT = DEBUG_INT;public final static int ALL_INT = Integer.MIN_VALUE;
appenderName是指日志输出的地方,可以同时指定多个。分别给它们命个别名即可,具体输出路径在之后会具体配置。
rootLogger默认是对整个工程生效。

(2)配置日志输出的具体参数
语法格式:
log4j.appender.appenderName = org.apache.log4j.xxxlog4j.appender.appenderName.option1 = value1…log4j.appender.appenderName.option = valueN
其中,log4j.appender.appenderName中的appenderName就是rootLogger中设置的名称,要在rootLogger里能找到。
log4j提供的appender有如下几种:
org.apache.log4j.ConsoleAppender(控制台),org.apache.log4j.FileAppender(文件),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
option1是指针对不同的输出配置的选项(以下所有appenderName记得自己替换 )
1)ConsoleAppende选项:
log4j.appender.appenderName.Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。log4j.appender.appenderName.ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。log4j.appender.appenderName.Target=System.err:默认值是System.out。
2)FileAppender选项:
log4j.appender.appenderName.Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。log4j.appender.appenderName.ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。log4j.appender.appenderName.Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。log4j.appender.appenderName.File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
3)DailyRollingFileAppender选项:
log4j.appender.appenderName.Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。log4j.appender.appenderName.ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。log4j.appender.appenderName.Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。log4j.appender.appenderName.File=D:/logs/logging.log4j:指定当前消息输出到logging.log4j文件中。log4j.appender.appenderName.DatePattern='.'yyyy-MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为logging.log4j,前一个月的日志文件名为logging.log4j.yyyy-MM。另外,也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:1)'.'yyyy-MM:每月2)'.'yyyy-ww:每周3)'.'yyyy-MM-dd:每天4)'.'yyyy-MM-dd-a:每天两次5)'.'yyyy-MM-dd-HH:每小时6)'.'yyyy-MM-dd-HH-mm:每分钟
4)RollingFileAppender选项:
log4j.appender.appenderName.Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。log4j.appender.appenderName.ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。log4j.appender.appenderName.Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。log4j.appender.appenderName.File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。log4j.appender.appenderName.MaxFileSize=100KB:后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中。log4j.appender.appenderName.MaxBackupIndex=2:指定可以产生的滚动文件的最大数,例如,设为2则可以产生logging.log4j.1,                       logging.log4j.2两个滚动文件和一个logging.log4j文件。

(3)配置日志信息的格式(布局):
语法格式:
log4j.appender.appenderName.layout = org.aoache.log4j.xxxlog4j.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(包含日志产生的时间、线程、类别等等信息)
其中:
1)HTMLLayout选项如下:
log4j.appender.appenderName.layout.LocationInfo=true:输出java文件名称和行号,默认值是false。log4j.appender.appenderName.layout.Title=My Logging: 默认值是Log4J Log Messages
2)PatternLayout选项如下:
log4j.appender.appenderName.layout.ConversionPattern=%m%n:设定以怎样的格式显示消息。
对于上面的ConversionPattern格式符号,可以按如下格式配置自己需要的:
%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。%r:输出自应用程序启动到输出该log信息耗费的毫秒数。%t:输出产生该日志事件的线程名。%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。%c:输出日志信息所属的类目,通常就是所在类的全名。%M:输出产生日志信息的方法名。%F:输出日志消息产生时所在的文件名称。%L::输出代码中的行号。%m::输出代码中指定的具体日志信息。%n:输出一个回车换行符,Windows平台为"rn",Unix平台为"n"。%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。%%:输出一个"%"字符。
另,类似c语言,log4j在打印输出是可以自己控制格式,比如-3d%,表示输出的长度占3个位置,且左对齐,log4j也支持类似的,如下:
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。2)%-20c:"-"号表示左对齐。3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。
到这里,再回过头来看看一开始的log4j配置文件,对照参数解释,大概就能清楚知道每个配置是什么用途的了。
如文件里:
log4j.rootLogger=debug,stdout,D,E
表示配置了4个appdername,那么在后面就要一个一个分别配置了。

log4j的基本使用
1、获取记录器
一般常用的是下面两种获取方式:
public static Logger getLogger( String name); //name一般为类名static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ); //里面的参数一般是类名.class
2、读取配置文件
方法:
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
不写上面的方法之一默认是读取src下的log4j.properties
3、记录日志信息
  Logger.debug ( Object message ) ;  Logger.info ( Object message ) ;  Logger.warn ( Object message ) ;  Logger.error ( Object message ) ;
简单的例子就是本文开头的那个。这里不再举例。
当然,在java代码里也可以判断日志的级别:
// 记录debug级别的信息if (logger.isDebugEnabled()) {    logger.debug("This is debug message");}// 记录info级别的信息if (logger.isInfoEnabled()) {    logger.info("This is info message");}// 记录error级别的信息logger.error("This is error message.");

下面附上网上复制过来的以xml方式配置的log4j.xml代码并自己附上部分注释:
<?xml version="1.0" encoding="UTF-8"?>     <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">     <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >         <appender name="myConsole" class="org.apache.log4j.ConsoleAppender"> <!--name指appender名,class指输出方式-->            <layout class="org.apache.log4j.PatternLayout">     <!--配置布局-->            <param name="ConversionPattern"                        value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />             </layout>             <!--过滤器设置输出的级别-->             <filter class="org.apache.log4j.varia.LevelRangeFilter">                 <param name="levelMin" value="debug" />                 <param name="levelMax" value="warn" />                 <param name="AcceptOnMatch" value="true" />             </filter>         </appender>         <appender name="myFile" class="org.apache.log4j.RollingFileAppender">                <param name="File" value="D:/output.log" /><!-- 设置日志输出文件名 -->             <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->             <param name="Append" value="true" />             <param name="MaxBackupIndex" value="10" />             <layout class="org.apache.log4j.PatternLayout">                 <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />             </layout>         </appender>         <appender name="activexAppender" class="org.apache.log4j.DailyRollingFileAppender">             <param name="File" value="E:/activex.log" />               <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />               <layout class="org.apache.log4j.PatternLayout">              <param name="ConversionPattern"                   value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" />             </layout>           </appender>         <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->         <logger name="com.runway.bssp.activeXdemo" additivity="false">             <priority value ="info"/>               <appender-ref ref="activexAppender" />           </logger>         <!-- 根logger的设置-->         <root>             <priority value ="debug"/>  <!--全局的级别,没有配置的以全局为准-->           <appender-ref ref="myConsole"/>             <appender-ref ref="myFile"/>            </root>     </log4j:configuration>
其中:
<priority value ="debug"/>
<appender-ref ref="myConsole"/>     
 <appender-ref ref="myFile"/>
就相当于:
log4j.rootLogger =debug , myConsole , myFile
其余的对照的peoperties的配置方式,基本应该能看懂




0 0
原创粉丝点击