一直以来都是拷贝别人的log4j配置文件,却没去弄清楚配置文件各个配置的含义,今天结合网上的资料总结了下。
log4j简单介绍
Log4j是
Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX
Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
官网下载地址:http://logging.apache.org/log4j/1.2/download.html
官网下载地址: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.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.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.DailyRollingFileAppender
log4j.appender.D.File = log/logTest2.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.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.DailyRollingFileAppender
log4j.appender.E.File =log/errorTest2.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
建立log文件夹来存放日志。
运行后,控制台打印如下:
再看看log文件夹,新生成了.log文件
对应文件的内容:
现在,我们 更改下log4j配置文件中的一部分如下:
即改为以html格式输出。输出结果如下:
生成新文件:
打开:
再看看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.xxx
log4j.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.xxx
log4j.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,那么在后面就要一个一个分别配置了。
下面附上网上复制过来的以xml方式配置的log4j.xml代码并自己附上部分注释:
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的配置方式,基本应该能看懂