- 浏览: 957365 次
- 性别:
- 来自: 江西上饶
文章分类
- 全部博客 (460)
- p.spring (56)
- p.maven (20)
- p.ant (17)
- p.jee (18)
- p.jse (33)
- p.ofbiz (31)
- p.软件工程 (8)
- p.struts2 (5)
- p.hibernate (5)
- linux (25)
- 设计模式 (2)
- p.javascript (11)
- 硬件 (1)
- p.jsp (2)
- p.windows批处理 (1)
- 操作系统问题 (5)
- 算法 (1)
- p.mysql (7)
- p.sql (5)
- p.c (1)
- google产品 (0)
- 内存 (1)
- p.struts (1)
- p.freemarker (7)
- p.css (4)
- p.log4j (10)
- p.html (3)
- 淘宝产品 (0)
- 其他 (3)
- 编译器 (0)
- svn (4)
- p.spring.security (11)
- 图形 (0)
- p.xml (1)
- p.ssh (0)
- p.jquery (4)
- p.jdbc (3)
- p.flex (0)
- p.c++ (0)
- p.c#Net (0)
- p.assembly (0)
- p.sqlserver (0)
- p.其他 (3)
- p.webwork (21)
- p.wap (12)
- p.cglib (1)
- p.jee服务器 (11)
- windows (2)
- p.iphone (1)
- p.java.分布式与集群 (2)
- p.ibatis (16)
- p.eclipse (5)
- 架构 (2)
- http协议 (5)
- 我的个人标准 (2)
- 多线程 (1)
- 奇怪问题 (5)
- p.jira (13)
- p.httpclient (1)
- 服务器.apache (11)
- 安全防范 (1)
- p.PODAM (1)
- p.junit (16)
- fop (2)
- 硬盘安装 (1)
- powerdesigner (0)
- 单元测试 (1)
- apache commons (4)
- tomcat+apache集群 (10)
- 各类诡辩 (1)
- 安卓 (8)
- qvod (1)
- java编程基础知识考试考点及答案 (0)
- 工作总结 (4)
- oracle (0)
- spring的util工具 (3)
- json (2)
- maven (3)
- jms (19)
- p.bat (3)
- hadoop (2)
- git (3)
- nginx (1)
- p.移动开发 (1)
- shiro (3)
- 游戏破解 (1)
- react-native (7)
- ios开发 (1)
- webmagic (6)
- socks5 (1)
最新评论
-
weituotian:
说的不好,没人看的
公司系统中的菜单功能和权限功能 -
石不易:
非常详细的注解~
绑定端口和IP,Listen 与VirtualHost指令 -
spring_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
spring mvc -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装 -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装
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>
例子
/**
*
* @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>
发表评论
-
Invalid signature file digest for Manifest main attributes
2015-09-23 14:26 8253java.lang.SecurityException: In ... -
log4jdbc
2014-12-25 13:55 3044该框架目前支持到jdbc3.和jdbc4的版本。 提供了多种 ... -
logger
2014-12-25 12:13 777loggers additivity属性,决定是否从root ... -
filter
2011-07-16 01:12 1033log4j默认提供了几个过滤器,包括repository过滤器 ... -
layout
2011-07-10 23:28 1133抽象类Layout public abstract ... -
appender
2011-07-10 17:03 2129Appender实现了Appender 类定义如下 packa ... -
log4j基础知识2 LoggingEvent类,性能
2011-07-07 23:21 4606LoggerEvent 当threshold和logg ... -
log4j的执行流程
2011-07-03 18:50 1835当调用了记录日志的方法后,比如调用log()方法 1.检测th ... -
log4j 基础知识
2011-07-03 01:41 1213简单例子: 将log4j-VERSION.jar架包加入到cl ...
相关推荐
**SourceInsight 4.0配置文件详解** SourceInsight是一款强大的源代码分析和编辑工具,尤其在编程语言如C/C++、Java、C#等领域中广泛应用。它提供了高效的代码浏览、查找、编辑和理解功能,是软件开发人员提高工作...
INI 配置文件的保存和读取 INI 配置文件是一种常见的文件格式,用于存储程序的配置信息。它是一种简单的持久化机制,允许程序在启动时初始化配置信息。INI 文件由多个节(Section)组成,每个节中可以有多个键名...
**SourceInsight 4 风格配置文件详解** SourceInsight 4 是一款深受程序员喜爱的源代码分析和编辑工具,它提供了强大的代码浏览、查找、跳转和编辑功能。在SourceInsight中,用户可以根据个人喜好和工作需求定制...
在Android开发中,读写配置文件是常见的任务,主要用于存储应用程序的设置、用户偏好或者其他持久化数据。配置文件通常以XML或JSON格式存在,因为它们结构清晰,易于解析。本实例将详细介绍如何在Android中进行读取...
在IT行业中,配置文件是应用程序运行的关键组成部分,它们包含了各种设置和参数,用于定义系统的行为、连接数据库、控制权限等。"配置文件jar包"是一个集合,它将多个配置文件和必要的Java档案(jar文件)整合在一起...
标题中的“proe config配置文件大全”指的是针对Pro/Engineer Wildfire 5.0(简称ProE 5.0)软件的一系列配置文件集合。ProE是一款由PTC公司开发的三维参数化建模软件,广泛应用于产品设计和工程领域。配置文件是...
在Spring Boot应用中,多模块配置文件的读取是一个重要的实践,它有助于提高代码的可维护性和模块化。本文将详细探讨如何在Spring Boot的多模块项目中管理和使用不同的配置文件,以实现低耦合的设计。 首先,了解...
在C#编程中,Windows Forms(Winform)应用程序经常需要与配置文件进行交互,以便存储和检索应用设置。本文将详细讲解如何在Winform中读取和修改配置文件,特别是`appSettings`部分,这对于大多数桌面应用来说是至关...
在C#编程中,配置文件是用于存储应用程序运行时所需的设置和参数的重要工具。这些设置可以包括数据库连接字符串、API密钥、应用路径等。本教程将深入探讨如何使用C#进行配置文件的读写操作,并提供源代码供学习者...
在Linux系统中,C语言作为底层编程的主要工具,其对配置文件的操作往往涉及到繁琐的文件I/O操作。然而,为了简化这一过程,开发者通常会利用特定的库来处理配置文件,比如读取、写入、解析键值对等。本文将深入探讨...
vSphere 主机配置文件是VMware vSphere虚拟化平台的一个重要组成部分,它允许IT管理员创建、管理和应用配置文件来标准化和自动化vCenter Server中的ESXi主机配置。使用vSphere主机配置文件可以提高效率并减少重复...
标题中的“Hikvision配置文件解码器.zip”指出,这是一个与解码Hikvision视频监控设备配置文件相关的工具或程序。Hikvision是全球知名的安防监控设备制造商,其产品广泛应用于各种场所,如家庭、商业设施、公共安全...
本文将详细讲解海康威视配置文件解码的专业知识,以及如何利用“海康威视配置文件解码专用工具器”进行操作。 首先,了解什么是配置文件。在海康威视的设备中,配置文件通常包含了摄像头、NVR(网络视频录像机)或...
标题中的“笔记本颜色配置文件”指的是用于调整笔记本电脑显示屏色彩特性的ICC(International Color Consortium)配置文件。这种文件能够帮助用户校正显示器的色彩表现,确保显示的图像颜色与实际色彩更加接近,...
在LabVIEW中,配置文件是用于存储应用程序设置、参数或状态的关键元素。这些文件通常以.ini或.xml格式存在,允许程序在运行时根据这些配置进行自定义行为。本教程将深入探讨如何在LabVIEW中进行配置文件的写入与读取...
在Linux系统中,C语言开发过程中,经常需要与配置文件打交道,进行读取和写入操作。配置文件通常用于存储程序的设置或用户偏好,使其能够根据不同的环境或需求进行定制。下面我们将深入探讨如何在C语言中实现对配置...
标题中的“MACBook颜色配置文件Apple-MAC-OS-Color LCD.rar”指的是为苹果MacBook设计的一种特定的颜色配置文件,这种文件通常以ICC(International Color Consortium)格式存在,用于优化显示器的色彩表现,确保...
在Java开发中,配置文件是应用中不可或缺的一部分,它们通常包含系统设置、数据库连接信息、应用参数等。本文将深入探讨如何在Java中实现动态修改配置文件,同时解决中文字符编码问题,使得配置文件的读写更加高效和...
在C++编程中,处理配置文件通常是为了存储和读取应用程序的设置或用户偏好。ini文件是一种常见的配置文件格式,其结构简单,易于理解和操作。本文将深入探讨如何使用C++来读写ini配置文件,主要参考提供的"rwconfig....
"mac的颜色配置文件",也就是苹果的ICC(International Color Consortium)配色文件,是这个过程中的重要组成部分。 ICC配色文件是一种标准化的方式,用来描述显示器、打印机、扫描仪等设备如何解释和再现颜色。这些...