`
liyixing1
  • 浏览: 943911 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

配置文件

阅读更多
log4j的配置支持xml和属性文件两种。在前面的文章中说过BasicConfigurator.configure()可以加载默认配置。

例子
/**
*

* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-9 下午10:26:14
*/

package com.cgodo.log4j.test;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;

/**
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-9 下午10:26:14
*/

public class Test1 {

/**
* 描述:
*
* @param args
* @author liyixing 2011-7-9
*/
final static Logger logger = Logger.getLogger(Test1.class);

public static void main(String[] args) {
// Set up a simple configuration that logs on the console.

//这里输出的时候,显示一堆警告(log4j的警告信息)
logger.info("Entering application.");
BasicConfigurator.configure();
//初始化配置之后,就不会再有警告了。可以看出,配置不一定要在创建logger之前
logger.info("Entering application.");
Foo foo = new Foo();
foo.doIt();
logger.info("Exiting application.");
}

}


package chapter3;
import org.apache.log4j.Logger;
public class Foo {
static final Logger logger = Logger.getLogger(Foo.class);
public void doIt() {
logger.debug("Did it again!");
}
}

调用后getLogger方法后,它加载的配置如图



配置文件-属性配置文件
修改为一个使用属性文件配置的简单例子
/**
*

* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-9 下午10:26:14
*/

package com.cgodo.log4j.test;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-9 下午10:26:14
*/

public class Test1 {

/**
* 描述:
*
* @param args
* @author liyixing 2011-7-9
*/
final static Logger logger = Logger.getLogger(Test1.class);

public static void main(String[] args) {
PropertyConfigurator.configure("log4jtest1.properties");
logger.info("Entering application.");
Foo foo = new Foo();
foo.doIt();
logger.info("Exiting application.");
}

}

Foo类和上面的例子来说不变
文件log4jtest1.properties内容(注意这里的文件应该存放在哪里需要根据你设置的工作目录决定,对于eclipse来说它设置的默认工作目录是在项目所在目录下面,而不是bin目录,所以应该放在工作目录里面)
# Set root logger level to DEBUG and add an appender called A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

如果打开了 -Dlog4j.debug标志,那么还能在console看到log4j的内部加载配置文件的信息,如
java -Dlog4j.debug chapter3.MyApp2 chapter3/sample0.properties
在上面的代码例子中,首先加载的是
final static Logger logger = Logger.getLogger(Test1.class);
log4j在没有指定配置的时候,会寻找它规定的默认配置文件
此时虽然没有还没有调用日志记录方法,但是已经可以得到一些日志信息了

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@ad3ba4.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@ad3ba4 class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@ad3ba4.
log4j: Trying to find [log4j.properties] using sun.misc.Launcher$AppClassLoader@ad3ba4 class loader.
log4j: Trying to find [log4j.properties] using ClassLoader.getSystemResource().
log4j: Could not find resource: [null].

然后是执行
PropertyConfigurator.configure("log4jtest1.properties");
的时候,在console中可以看到log4j的信息是

log4j: Parsing for [root] with value=[DEBUG, A1].
log4j: Level token is [DEBUG].
log4j: Category root set to DEBUG
log4j: Parsing appender named "A1".
log4j: Parsing layout options for "A1".
log4j: Setting property [conversionPattern] to [%-4r [%t] %-5p %c %x - %m%n].
log4j: End of parsing for "A1".
log4j: Parsed "A1" options.
log4j: Finished configuring.

随后输出的是

0    [main] INFO  com.cgodo.log4j.test.Test1  - Entering application.
3172 [main] DEBUG com.cgodo.log4j.test.Foo  - Did it again!
3172 [main] INFO  com.cgodo.log4j.test.Test1  - Exiting application.

另外还可以是
使用配置文件
#这里添加了log4j.debug,设置为true
log4j.debug=true
# Set root logger level to DEBUG and add an appender called A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

属性配置文件配置方式和xml相比,功能可能会缺少一些,比如过滤器链,自定义错误处理等等。

配置全局threshold设置
log4j.threshold=[level]
level的值可以是(从高到底)“OFF”, “FATAL”,“ERROR”, “WARN”, “INFO”, “DEBUG”, “ALL”。
自己设计的级别,则应该是写成level#classname

例子
log4j.threshold=OFF
log4j.threshold=WARN
log4j.threshold=ALL

threshold还可以设置为appender这儿。当输出达到这个设备的时候,会检查appender自己的threshold.属性。如果高于调用者的级别就不会输出。

例子
dir=${user.home}
file=test.log
target=${dir}/${file}
log4j.debug=false
log4j.rootLogger=debug, TEST, C
log4j.appender.TEST=org.apache.log4j.FileAppender
log4j.appender.TEST.File=${target}
log4j.appender.TEST.layout=org.apache.log4j.PatternLayout
log4j.appender.TEST.layout.ConversionPattern=%p %t %c - %m%n
log4j.appender.C=org.apache.log4j.ConsoleAppender
log4j.appender.C.Threshold=DEBUG
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

这里由于设置了appender C的级别为DEBUG,所以输出都是有效的。

dir=${user.home}
file=test.log
target=${dir}/${file}
log4j.debug=false
log4j.rootLogger=debug, TEST, C
log4j.appender.TEST=org.apache.log4j.FileAppender
log4j.appender.TEST.File=${target}
log4j.appender.TEST.layout=org.apache.log4j.PatternLayout
log4j.appender.TEST.layout.ConversionPattern=%p %t %c - %m%n
log4j.appender.C=org.apache.log4j.ConsoleAppender
#这里的Threshold设置为INFO,所以控制台的debug调用是不会输出的。
log4j.appender.C.Threshold=INFO
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

结果可以发现debug只输出到了file,而debug并没有输出

设备的配置Appender
语法是log4j.appender. + appenderName = xxxxxxxxxxxxx,其中appenderName是根据自己需要取什么名字,就写什么。

log4j.appender.myfileAppender=org.apache.log4j.ConsoleAppender
appender的属性设置,appenderName就是我们上面设置的appenderName,这里应该是myfileAppender
log4j.appender.myfileAppender.option1=value1
log4j.appender.myfileAppender.option2=value2
...
log4j.appender.appenderName.optionN=valueN

appender是遵守了javabean规范的类,所以appender properties对应了这个appender类的属性值。

配置loggers
一般我们会从rootLogger开始配置。其配置语法是
log4j.rootLogger=[level], [appenderName1, appenderName2, ...]
记录级别只有一个,而设备可以有多个。
级别从高到底的值可以是“OFF”, “FATAL”, “ERROR”, “WARN”, “INFO”, “DEBUG”, “ALL”种的任何一个。如果是自定义的级别,应该写成“level#classname”.根logger的级别如果指定,那么它就是这个级别,如果没有指定,默认是Debug。
Multipleappenders可以由多个appender组合而成。

对于非根的logger和root的配置是差不多的。

log4j.logger.loggerName=[level|INHERITED|NULL], [appenderName1, appenderName2,
...]

其中loggerName是你要设置的logger名字。
INHERITED(继承)实际上效果和NULL是一样的。他们都将从祖先继承而来。但是在实际应用中,这种继承情况我们是不需要配置的。

对additivity的配置
log4j.additivity.loggerName=[true|false]

ObjectRenderers
对象玄渲染器log4j.renderer.fqnOfRenrederedClass=fqnOfRenrederingClass
其中fqn是指要渲染的类名。如log4j.renderer.com.wombat.Fruit=com.wombat.FruitRenderer


变量替换
这个和unix的变量有点类似,使用${varname}访问。这里的变量将从System.getProperty(key);来获取,或者从配置文件中寻找这个变量的植
一个例子
定义个变量,名字叫dir,dir的植是从系统变量取出的。
dir=${user.home}
file=test.log
target=${dir}/${file}
log4j.debug=true
log4j.rootLogger=debug, TEST
log4j.appender.TEST=org.apache.log4j.FileAppender
log4j.appender.TEST.File=${target}
log4j.appender.TEST.layout=org.apache.log4j.PatternLayout
log4j.appender.TEST.layout.ConversionPattern=%p %t %c - %m%n


或者
log4j.debug=true
log4j.rootLogger=debug, TEST
log4j.appender.TEST=org.apache.log4j.FileAppender
log4j.appender.TEST.File=${user.home}/test.log
log4j.appender.TEST.layout=org.apache.log4j.PatternLayout
log4j.appender.TEST.layout.ConversionPattern=%p %t %c - %m%n

当然logger的appender支持多个。
log4j.rootLogger=debug, stdout, R
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
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

上面的配置同时有一个ConsoleAppender设备和一个PatternLayout设备。
默认情况下,一个logger的记录日志操作,会发送到它自己的所有的appender和它的祖先appender。因此如果连接了多个appender,会造成记录器的重复记录。如
log4j.debug=true
log4j.rootLogger=debug, CON
log4j.appender.CON=org.apache.log4j.ConsoleAppender
log4j.appender.CON.layout=org.apache.log4j.PatternLayout
log4j.appender.CON.layout.ConversionPattern=%r %p %t %c - %m%n
# The CON appender is also attached to the "chapter3" logger. The
# following directive does not set the level of "chapter3" logger by
# leaving its level field empty.
log4j.logger.chapter3=,CON

/**
*

* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-9 下午10:26:14
*/

package com.cgodo.log4j.test;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-9 下午10:26:14
*/

public class Test1 {

/**
* 描述:
*
* @param args
* @author liyixing 2011-7-9
*/
public static void main(String[] args) {
PropertyConfigurator.configure("log4jtest1.properties");
Logger logger = Logger.getLogger("chapter3");
logger.debug("Entering application.");
}

}

同时可以发现记录了两次。
另外我们可以为appender指定一个threshold,指定该设备只输出规定的级别。

又或者我们指定
log4j.additivity.chapter3.Foo=false
来使得appender传递到chapter3.Foo为止便停止了。


使用xml的配置
使用org.apache.log4j.xml.DOMConfigurator来加载配置。

/**
*

* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-10 下午03:38:18
*/

package com.cgodo.log4j.test;

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

/**
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-10 下午03:38:18
*/

public class XmlTest {
final static Logger logger = Logger.getLogger(XmlTest.class);

/**
* 描述:
*
* @param args
* @author liyixing 2011-7-10
*/

public static void main(String[] args) {
DOMConfigurator.configure("XmlTest.xml");
logger.info("Entering application.");
Foo foo = new Foo();
foo.doIt();
logger.info("Exiting application.");
}

}

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-4r [%t] %-5p %c %x - %m%n" />
</layout>
</appender>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>

根元素
<log4j:configuration>
它可以有
renderer,appender,logger,root,property (变量)
log4j:configuration元素有两个属性,debug和threshold

renderer元素,对象渲染器。
它不能存在子元素,只有两个属性renderedClass和renderingClass

appender元素
有两个属性,name和class。
可以包含的子元素是
errorHandler
param
layout
filter
appender-ref
(1errorHandler在appender记录的时候出错使用。只有一个class属性。子元素可以是param(多个)以及只能出现一个的root-ref子元素,logger-ref子元素(多个),appender-ref(多个)AppenderSkeleton默认的Hanlder是OnlyOnceErrorHandler,在第一次发生错误时,使用LogLog类奖错误打印到屏幕。更好的做法是使用 FallbackErrorHandler,并配置backupAppender,在JMS等远程Appender出错时,将信息打印到本地。
<appender name="File" class="org.apache.log4j.FileAppender">
    <errorHandler class="org.apache.log4j.varia.FallbackErrorHandler">
        <root-ref/>
        <appender-ref ref="FALLBACK" />
    </errorHandler>
    <param name="File" value="/xyz/x.log" />
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %c{2} - %m%n"/>
    </layout>
</appender>


<appender name="FALLBACK" class="org.apache.log4j.FileAppender">
    <param name="File" value="fallback.log" />
    <param name="Append" value="false" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="--%d %p %t %c - %m%n"/>
    </layout>
</appender>

<root>
    <priority value ="info" />
    <appender-ref ref="File" />
</root>
    root-ref和logger-ref表明logger所包含了appender。appender-ref元素是对其他appender的引用。但主appender失败后,次要的appender将作为备用。

(2param元素出现在其他元素的子元素中。它有两个属性,name和value。

(3layout元素有一个属性class,指定layout布局的类。它可以有param子元素。

(4filter元素和layout元素在配置上一样。只有class属性和param子元素

logger元素
该元素应该放在root元素之前,否则会报警告

需要name属性和一个可选的additivity属性。可以有一个leven子元素。可以包含0-N个appender-ref子元素。

level元素,有两个属性,value和class。value可以是DEBUG,INFO,WARN,ERROR或者FATAL,INHERITED和NULL。

root子元素,没有属性。有leven资源素和appender-ref子元素。


上图是完整的xml配置元素结构图。

设置threshold的例子
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration threshold="warn"
xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.SimpleLayout"/>
</appender>
<root>
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>

设置root和logger的level的例子
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%t] %-5p %c - %m%n"/>
</layout>
</appender>
<logger name="chapter3">
<level value="OFF"/>
</logger>
<root>
<!-- The following level element is not necessary since the -->
<!-- level of the root level is set to DEBUG by default. -->
<level value="debug"/>
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>

设置Appender的threshold的例子
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="INFO"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p [%t] %c - %m%n"/>
</layout>
</appender>
<root>
<level value="debug" />
<appender-ref ref="CONSOLE" />
</root>
</log4j:configuration>

多个Appenders的例子
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true"
xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="LIFE_CYCLE" class="org.apache.log4j.FileAppender">
<param name="File" value="lifecyle.log"/>
<param name="Threshold" value="INFO"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d %5p [%t] %c (%F:%L) - %m%n"/>
</layout>
</appender>
<appender name="ROLLING"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="sample.log"/>
<param name="MaxFileSize" value="100KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
<root>
<appender-ref ref="LIFE_CYCLE" />
<appender-ref ref="ROLLING" />
</root>
</log4j:configuration>

additivity的例子
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true"
xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="INFO"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p %t %c - %m%n"/>
</layout>
</appender>
<appender name="FOO" class="org.apache.log4j.FileAppender">
<param name="File" value="foo.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p %t %c - %m%n"/>
</layout>
</appender>
<logger name="chapter3.Foo" additivity="false">
<appender-ref ref="FOO" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
  • 大小: 55 KB
  • 大小: 68.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics