log4j root 里配的appender-ref会覆盖前面的字覆盖后面的字吗

4800人阅读
&?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&&&&&&
&&&&&&& &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&
(1). 输出方式appender一般有5种:
&&&&&&&&&&&& org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)
&&&&&&&&&&&& org.apache.log4j.ConsoleAppender (控制台)&
&&&&&&&&&&&& org.apache.log4j.FileAppender (文件)
&&&&&&&&&&&& org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
&&&&&&&&&&&& org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
(2). 日记记录的优先级priority,优先级由高到低分为
&&&&&&&&&&& OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
&&&&&&&&&&& Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。
(3). 格式说明layout中的参数都以%开始,后面不同的参数代表不同的格式化信息(参数按字母表顺序列出):
&&&&&&&&&&&&&&& %c&&&&&&& 输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的维(如:&org.apache.elathen.ClassName&,%C{2}将输出elathen.ClassName)
&&&&&&&&&&&&&&& %d&&&&&& 输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
&&&&&&&&&&&&&&& %l&&&&&&& 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
&&&&&&&&&&&&&&& %n&&&&&& 换行符
&&&&&&&&&&&&&&& %m&&&&& 输出代码指定信息,如info(“message”),输出message
&&&&&&&&&&&&&&& %p&&&&&& 输出优先级,即 FATAL ,ERROR 等
&&&&&&&&&&&&&&& %r&&&&&&& 输出从启动到显示该log信息所耗费的毫秒数
&&&&&&&&&&&&&&& %t&&&&&&& 输出产生该日志事件的线程名
xml declaration and DTD
xml配置文件的头部包括两个部分:xml声明和DTD声明。头部的格式如下:
&?xml version=&1.0& encoding=&UTF-8& ?&
&!DOCTYPE log4j:configuration SYSTEM &log4j.dtd&&
log4j:configuration (root element)
xmlns:log4j [#FIXED attribute] : 定义log4j的名字空间,取定值&http://jakarta.apache.org/log4j/&
appender [* child] : 一个appender子元素定义一个日志输出目的地 logger [* child] : 一个logger子元素定义一个日志写出器 root [? child] : root子元素定义了root logger
appender元素定义一个日志输出目的地。
name [#REQUIRED attribute] : 定义appender的名字,以便被后文引用 class [#REQUIRED attribute] : 定义appender对象所属的类的全名 param [* child] : 创建appender对象时传递给类构造方法的参数 layout [? child] : 该appender使用的layout对象
layout元素定义与某一个appender相联系的日志格式化器。
class [#REQUIRED attribute] : 定义layout对象所属的类的全名 param [* child] : 创建layout对象时传递给类构造方法的参数
logger元素定义一个日志输出器。
name [#REQUIRED attribute] : 定义logger的名字,以便被后文引用 additivity [#ENUM attribute] : 取值为&true&(默认)或者&false&,是否继承父logger的属性
level [? child] : 定义该logger的日志级别 appender-ref [* child] : 定义该logger的输出目的地
root元素定义根日志输出器root logger。
param [* child] : 创建root logger对象时传递给类构造方法的参数 level [? child] : 定义root logger的日志级别 appender-ref [* child] : 定义root logger的输出目的地
level元素定义logger对象的日志级别。
class [#IMPLIED attribute] : 定义level对象所属的类,默认情况下是&org.apache.log4j.Level类
value [#REQUIRED attribute] : 为level对象赋值。可能的取值从小到大依次为&all&、&debug&、&info&、&warn&、&error&、&fatal&和&off&。当值为&off&时表示没有任何日志信息被输出
param [* child] : 创建level对象时传递给类构造方法的参数
appender-ref
appender-ref元素引用一个appender元素的名字,为logger对象增加一个appender。
ref [#REQUIRED attribute] : 一个appender元素的名字的引用 appender-ref元素没有子元素
param元素在创建对象时为类的构造方法提供参数。它可以成为appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。
name and value [#REQUIRED attributes] : 提供参数的一组名值对
param元素没有子元素
在xml文件中配置appender和layout
创建不同的Appender对象或者不同的Layout对象要调用不同的构造方法。可以使用param子元素来设定不同的参数值。
创建ConsoleAppender对象
ConsoleAppender的构造方法不接受其它的参数。
... ... ... ...
&appender name=&console.log& class=&org.apache.log4j.ConsoleAppender&&
&layout ... &
&/appender&
... ... ... ...
创建FileAppender对象
可以为FileAppender类的构造方法传递两个参数:File表示日志文件名;Append表示如文件已存在,是否把日志追加到文件尾部,可能取值为&true&和&false&(默认)。
... ... ... ...
&appender name=&file.log& class=&org.apache.log4j.FileAppender&&
&param name=&File& value=&/tmp/log.txt& /&
&param name=&Append& value=&false& /&
&layout ... &
&/appender&
... ... ... ...
创建RollingFileAppender对象
除了File和Append以外,还可以为RollingFileAppender类的构造方法传递两个参数:MaxBackupIndex备份日志文件的个数(默认是1个);MaxFileSize表示日志文件允许的最大字节数(默认是10M)。
... ... ... ...
&appender name=&rollingFile.log& class=&org.apache.log4j.RollingFileAppender&&
&param name=&File& value=&/tmp/rollingLog.txt& /&
&param name=&Append& value=&false& /&
&param name=&MaxBackupIndex& value=&2& /&
&param name=&MaxFileSize& value=&1024& /&
&layout ... &
&/appender&
... ... ... ...
创建PatternLayout对象
可以为PatternLayout类的构造方法传递参数ConversionPattern。
... ... ... ...
&layout class=&org.apache.log4j.PatternLayout&
&param name=&Conversion& value=&%d [%t] %p - %m%n& /&
... ... ... ...
&context-param&
&&&param-name&log4jConfigLocation&/param-name&
&&&param-value&/WEB-INF/log4j.xml&/param-value&
&&/context-param&
&&context-param&
&&&param-name&log4jRefreshInterval&/param-name&
&&&param-value&60000&/param-value&
&&/context-param&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:422545次
积分:5567
积分:5567
排名:第3609名
原创:128篇
转载:111篇
评论:58条
(1)(1)(1)(3)(1)(3)(1)(1)(2)(5)(1)(5)(4)(5)(5)(2)(5)(8)(4)(4)(4)(1)(4)(16)(3)(2)(5)(2)(7)(7)(2)(10)(3)(2)(8)(7)(1)(5)(1)(11)(1)(4)(2)(11)(9)(8)(6)(6)(10)(11)(7)(5)1&&&&&&简介
&&&&&& 一般log4j的xml配置方式基本步骤有3个,第一步:配置appender;第二步:配置logger;第三步:配置root。下面配置一个ConsoleAppender和两个DailyRollingFileAppender为例具体展开。
1.1& 日志级别
&&&&&& 不考虑其他因素,日记级别FATAL&ERROR&WARN&INFO&DEBUG,这个是许多同学都清楚的,但是结合appender,logger,root的配置后,日志打印的结果会发生一些微妙的变化。
&&&&&& 首先,root的中的日志级别在用户没有为某一个具体的logger配置日志级别的时候才会对该logger生效。这里就可以用来解释有的同学问为什么在root中配置了ERROR级别,但是日志中依旧有INFO的日志输出。
&&&&&& 其次,如果某一个appender配置了日志过滤器,那使用该appender的logger配置日志级别的时候,范围不超出appender过滤的级别信息才会被输出。
2&&&&&&配置appender
&&&&&& 图2-1是一个标准的ConsoleAppender配置:
&&&&&& 如注释所描述,ConsoleAppender一般在我们调试项目时候用处比较大,这里不再多余描述。
&&&&&& 图2-2是一个标准的FileAppender配置,这里我配置了一个info.log文件和一个eror.log,位于/opt/logs目录下面,分别用来记录一般消息和错误消息。
& & & & & & & & & & & & & & & & & & & & & & & & &
&&&&&&&& appender的配置相对比较简单,除了过滤器,没有特殊要注意的。
3&&&配置logger
&&&&&& 图3-1是两种looger配置。
&&&&&&&& logger的name属性指代的是程序包路径,不用赘述。additivity属性,表示是否遵循缺省的继承机制。
&&&&&&&& 需要注意:
&&&&&&&& 1如果我们配置了true,那我们最好不要再给该logger配置appender-ref属性,除非被配置的appender-ref我们没有继续添加在root的appender-ref中,否则我们会发现日志重复。
&&&&&&&& 2如果我们配置了false,那就必须为该logger配置appender-ref,否则日志不会被打印。
4&&&配置root
&&&&&& 图4-1是一个标准的root配置。
root的作用是是收集所有配置的logger(additivity=true)反馈上来的信息流并且根据root中配置的appender-ref进行输出,所以,如果我们logger配置了additivity=true,又配置了appender-ref,会导致日志重复。
&&&&&&&& 注意:这里的level值对那些没有配置日志级别,而且additivity=true的logger才会有作用。
下面是具体的配置信息:
&?xml version=&1.0& encoding=&UTF-8&?&
&!DOCTYPE log4j:configuration SYSTEM &log4j.dtd&&
&log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' &
&!--对于ConsoleAppender来说,在开发阶段还是比较有用的,能直接在ide中看到输出的日志内容,
但是在实际的产品阶段,我们更希望将日志输出到指定的文件上查看,这就需要用到FileAppender--&
&appender name=&CONSOLE& class=&org.apache.log4j.ConsoleAppender&&
&param name=&encoding& value=&UTF-8& /&
&layout class=&org.apache.log4j.PatternLayout&&
&param name=&ConversionPattern& value=&%d %-5p %t %l %m%n& /&
&!--如果有过滤器,当前appender只会处理满足过滤器条件的日志信息--&
&!--&filter class=&org.apache.log4j.varia.LevelRangeFilter&&
&param name=&levelMin& value=&DEBUG& /&
&param name=&levelMax& value=&FATAL& /&
&param name=&AcceptOnMatch& value=&true& /&
&/filter&--&
&/appender&
&!-- 写到远端日志 --&
&appender name=&DEFAULT-APPENDER-REMOTE& class=&org.apache.log4j.net.SyslogAppender&&
&param name=&SyslogHost& value=&${logServer}&/&
&param name=&Facility& value=&LOCAL1&/&
&param name=&FacilityPrinting& value=&true&/&
&layout class=&org.apache.log4j.PatternLayout&&
&param name=&ConversionPattern& value=&%d %-5p %t %c %m%n& /&
&/appender&
&appender name=&FRAMEWORK-APPENDER-REMOTE& class=&org.apache.log4j.net.SyslogAppender&&
&param name=&SyslogHost& value=&${logServer}&/&
&param name=&Facility& value=&LOCAL3&/&
&param name=&FacilityPrinting& value=&true&/&
&layout class=&org.apache.log4j.PatternLayout&&
&param name=&ConversionPattern& value=&%d %-5p %t %c %m%n& /&
&/appender&
&!-- 写到本地日志 --&
&!--第一步:配置appender--&
&appender name=&INFO-LOCAL& class=&org.apache.log4j.DailyRollingFileAppender&&
&param name=&file& value=&/opt/logs/info.log& /&
&param name=&append& value=&true& /&&!--一般必须配置true,否则会覆盖而不是累加--&
&param name=&encoding& value=&UTF-8& /&
&layout class=&org.apache.log4j.PatternLayout&&
&param name=&ConversionPattern& value=&%d %-5p %t %l %m%n& /&
&!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息--&
&filter class=&org.apache.log4j.varia.LevelRangeFilter&&
&param name=&levelMin& value=&DEBUG& /&
&param name=&levelMax& value=&INFO& /&
&param name=&AcceptOnMatch& value=&true& /&
&/appender&
&appender name=&ERROR-LOCAL& class=&org.apache.log4j.DailyRollingFileAppender&&
&param name=&file& value=&/opt/logs/error.log& /&
&param name=&append& value=&true& /&&!--一般必须配置true,否则会覆盖而不是累加--&
&param name=&encoding& value=&UTF-8& /&
&layout class=&org.apache.log4j.PatternLayout&&
&param name=&ConversionPattern& value=&%d %-5p %t %l %m%n& /&
&!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息--&
&filter class=&org.apache.log4j.varia.LevelRangeFilter&&
&param name=&levelMin& value=&WARN& /&
&param name=&levelMax& value=&FATAL& /&
&param name=&AcceptOnMatch& value=&true& /&
&/appender&
&!--第二步:配置logger。
如果不配置,系统会采用默认策略,即additivity=&true&,level value=&DEBUG&。
注意:additivity=true,表示遵循缺省的继承机制,此时就不应该继续配置appender-ref,否则日志会出现重复
相反,如果additivity=false,就必须要配置appender-ref,否则日志不会被打印,配置也就没有意义--&
&logger name=&com.test.log4j& additivity=&true&&
&!--给具体的logger配置日志级别,比如com.test包下面日志级别大于等于DEBUG的,
才会交给appender进行处理。
注意:对于com.test包而言,此处的级别会覆盖root下面的日志级别--&
&level value=&INFO& /&
&!--如果此处配置了append-ref,而且additivity=&true&,将会和root里面的同一个
append-ref形成累加,即重复日志--&
&!--&appender-ref ref=&CONSOLE& /&--&
&!--&appender-ref ref=&DEFAULT-LOCAL&/&--&
&!--&appender-ref ref=&ERROR-LOCAL&/&--&
&logger name=&com.test2& additivity=&false&&
&level value=&INFO& /&
&appender-ref ref=&INFO-LOCAL& /&
&!--第三步:配置root--&
&!--root的作用是收集所有配置的logger反馈上来的信息流并根据配置在root中appender进行输出,
只要你在looger中配置了additivity=&false&,就不会反馈到root中。--&
&!--优先级小于具体的logger中配置的级别,只有当具体的logger没有配置的时候,
这里才会对具体的looger起作用--&
&level value=&DEBUG& /&
&appender-ref ref=&CONSOLE& /&
&appender-ref ref=&INFO-LOCAL& /&
&appender-ref ref=&ERROR-LOCAL&/&
&/log4j:configuration&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:49173次
排名:千里之外
原创:19篇
评论:10条
(2)(1)(1)(2)(1)(1)(1)(2)(1)(1)(1)(4)(2)(3)(1)一个配置比较全的log4j.xml文件,配置的正确性已在项目中验证。 - dolphin_ygj - ITeye技术网站
博客分类:
获取loggerLogger.getRootLogger()
获取根loggerLogger.getLogger(String name)获取子loggerLogger.getLogger(Class clazz)或Logger.getLogger(clazz.getName())
设置日志级别(.setLevel(int,Exception))Level.ALL打开所有日志Level.DEBUG 用于调试< 用于运行过程Level.WARN 用于潜在的错误Level.ERROR 用于错误事件Level.FATAL 用于严重错误时间Level.OFF 关闭所有日志
输出端Appender(.addAppender(Appender).setAdditivity(boolean additive)是否覆盖)org.apache.log4j.ConsoleAppender
输出到控制台 targer:
ConsoleAppender.SYSTEM_OUT(Default)
ConsoleAppender.SYSTEM_ERR public ConsoleAppender(Layout) public ConsoleAppender(Layout,String targer)org.apache.log4j.FileAppender
输出到文件 public FileAppender(Layout,String fileName) public FileAppender(Layout,String fileName,boolean append)是否覆盖org.apache.log4j.DailyRollingFileAppender 输出到文件,每天一个新文件org.apache.log4j.RollingFileAppender
输出到文件,自动新增改名 public RollingFileAppender(Layout,String fileName) void setMaxBackupIndex(int index) 设置日志文件最大备份数 void setMaximumFileSize(long size) 设置日志文件最大尺寸org.apache.log4j.WriterAppender
流格式输出到任意地方org.apache.log4j.JDBCAppender
输出到数据库
日志格式化(Layout)%c
public PatternLayout() 使用默认设置DEFAULT_CONVERSION_PATTERN 只打印信息public PatternLayout(String)使用自定义的pattern构造一个PatternLayoutvoid setConversionPattern(String)
设置日志格式HTMLLayoutSimpleLayout
5.1.BasicConfigurator.configure() PatternLayout p = new PatternLayout("%p [%t] %c (%F:%L) - %m%n");
ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
root.addAppender(a);
rootLogger.setLevel(Level.DEBUG);
2.PropertyConfigurator.configure("/help/example.properties")
String resource = "/help/example.properties";
URL configFileResource = Log4J.class.getResource(resource);
PropertyConfigurator.configure(configFileResource);3.DOMConfigurator.configure("/help/example.xml")xml declaration and dtd | log4j:configuration | +-- appender (name, class) | | | +-- param (name, value) | +-- layout (class) | | | +-- param (name, value) +-- logger (name, additivity) | | | +-- level (class, value) | | | | | +-- param (name, value) | +-- appender-ref (ref) +-- root | +-- param (name, class) +-- level | | | +-- param (name, value) +-- appender-ref (ref)
0.log4j.properties模板log4j.rootLogger=info,CONSOLE,RFILE,FILE,DB
设置级别和三个输出端log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
控制台类型log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= %4p [%t] (%F:%L) - %m%n
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=/help/my.properties
目标文件log4j.appender.FILE.Append=false
是否追加log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
布局模式log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %c:%L - %m%n
格式化布局
log4j.appender.RFILE=org.apache.log4j.RollingFileAppender
log4j.appender.RFILE.File=/help/my.properties
目标文件log4j.appender.RFILE.MaxFileSize=1KB
最大长度log4j.appender.RFILE.MaxBackupIndex=3
最多备份log4j.appender.RFILE.layout=org.apache.log4j.PatternLayout
布局模式log4j.appender.RFILE.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %c:%L - %m%n
格式化布局
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DB.URL=jdbc:oracle:thin:@127.0.0.1:1521:mumu
URLlog4j.appender.DB.driver=oracle.jdbc.driver.OracleDriver
驱动log4j.appender.DB.user=liulibo
用户名log4j.appender.DB.password=liulibo
密码log4j.appender.DB.layout=org.apache.log4j.PatternLayout
布局模式log4j.appender.DB.layout.ConversionPattern=insert into log4j(createdate,thread,level_,class,message) values(\'%d\',\'%t\',\'%-5p\',\'%c\',\'%m\')
create table log4j(createdate varchar2(32),thread varchar2(32),level_ varchar2(32),class varchar2(32),message varchar2(32)); 0.XML模板&?xml version="1.0" encoding="UTF-8" ?&&!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&
&log4j:configuration&
&appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n"/&
&/layout& &/appender&
&appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender"&
&param name="Append" value="false"/&
&param name="MaxFileSize" value="1KB"/&
&param name="File" value="dom/my.log"/&
&param name="MaxBackupIndex" value="3"/&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n"/&
&/layout& &/appender&
&appender name="JDBCAppender" class="org.apache.log4j.jdbc.JDBCAppender"&
&param name="URL" value="jdbc:oracle:thin:@127.0.0.1:1521:mumu"/&
&param name="user" value="liulibo"/&
&param name="password" value="liulibo"/&
&param name="driver" value="oracle.jdbc.driver.OracleDriver"/&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern" value="insert into log4j(createdate,thread,level_,class,message) values(\'%d\',\'%t\',\'%-5p\',\'%c\',\'%m\')"/&
&/layout& &/appender&
&priority value ="debug" /&
&appender-ref ref="ConsoleAppender"/&
&appender-ref ref="RollingFileAppender"/&
&appender-ref ref="JDBCAppender"/& &/root&
&/log4j:configuration&
应用 web.xml
&context-param&
&param-name&props&/param-name&
&param-value&/WEB-INF/log4j.properties&/param-value&
&/context-param&
&listener&
&listener-class&cart.listener.SCServletContextListener&/listener-class&
&/listener& 初始化方法中添加 private void initLog4j(ServletContext context){
String prefix = context.getRealPath("/");
System.out.println("prefix:"+prefix);
String props = context.getInitParameter("props");
if(props != null) {
PropertyConfigurator.configure(prefix+props);
Logger logger = Logger.getLogger(SCServletContextListener.class);
&?xml version="1.0" encoding="UTF-8" ?&&!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&
&log4j:configuration threshold="debug" xmlns:log4j='http://jakarta.apache.org/log4j/'&
&appender name="console.CONSOLE"
class="org.apache.log4j.ConsoleAppender"&
&param name="threshold" value="debug" /&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern" value="%d{HH:mm:ss}[%C.%M(%L)-%p] %m%n"/&
&param name="ConversionPattern" value="%d{HH:mm:ss}[%C(%L)-%p] %m%n"/&
&/layout& &/appender&
&appender name="file.text.SYSFILE"
class="org.apache.log4j.RollingFileAppender"&
&param name="threshold" value="error" /&
&param name="file" value="/juyee.log" /&
&param name="maxFileSize" value="2MB" /&
&param name="maxBackupIndex" value="5" /&
&param name="append" value="true" /&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern"
value="%-d{yyyy-MM-dd HH:mm:ss.SSS} [%p]-[%c] %m%n" /&
&/layout& &/appender& &appender name="file.text.DATE_FILE"
class="org.apache.log4j.DailyRollingFileAppender"&
&param name="threshold" value="debug" /&
&param name="file" value="/juyee.log" /&
&param name="append" value="true" /&
&param name="datePattern" value="'.'yyyy-MM-dd" /&
&!-- each hour
&param name="DatePattern" value="'.'yyyy-MM-dd-HH"/&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern" value="%d %-5p [%c] %m%n" /&
&/layout& &/appender& &appender name="file.text.APPFILE"
class="org.apache.log4j.RollingFileAppender"&
&param name="threshold" value="error" /&
&param name="file" value="${webapp.root}/WEB-INF/logs/juyee.log" /&
&param name="maxFileSize" value="1024KB" /&
&param name="maxBackupIndex" value="5" /&
&param name="append" value="true" /&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern"
value="%d %-5p %c - %m [%t] (%F:%L)%n" /&
&/layout& &/appender& &appender name="file.html.HTML"
class="org.apache.log4j.RollingFileAppender"&
&param name="threshold" value="error" /&
&param name="file" value="/juyee-log.html" /&
&param name="maxFileSize" value="1024KB" /&
&param name="maxBackupIndex" value="5" /&
&param name="append" value="true" /&
&layout class="org.apache.log4j.HTMLLayout" /& &/appender& &appender name="file.xml.XML"
class="org.apache.log4j.RollingFileAppender"&
&param name="threshold" value="error" /&
&param name="file" value="/juyee-log.xml" /&
&param name="maxFileSize" value="1024KB" /&
&param name="maxBackupIndex" value="5" /&
&param name="append" value="true" /&
&layout class="org.apache.log4j.xml.XMLLayout" /& &/appender&
&appender name="mail.MAIL" class="org.apache.log4j.net.SMTPAppender"&
&param name="threshold" value="debug"/&
&param name="threshold" value="fatal"/&
&param name="BufferSize" value="10"/&
&param name="From" value="&
&param name="SMTPHost" value="&
&param name="Subject" value="juyee-log4jMessage"/&
&param name="To" value="&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss.SSS} [%p]-[%c] %m%n" /&
&/appender&
&appender name="remote.CHAINSAW"
class="org.apache.log4j.net.SocketAppender"&
&param name="threshold" value="fatal" /&
&param name="remoteHost" value="localhost" /&
&param name="port" value="4445" /&
&param name="locationInfo" value="true" /& &/appender&
&category name="com.juyee" additivity="true"&
&priority value="info" /&
&appender-ref ref="console.CONSOLE" /&
&appender-ref ref="file.text.DATE_FILE" /&
--& &/category&
&category name="com.co" additivity="true"&
&priority value="debug" /&
&appender-ref ref="console.CONSOLE" /&
&appender-ref ref="file.text.DATE_FILE" /& &/category&
&category name="org" additivity="true"&
&priority value="WARN" /&
&appender-ref ref="console.CONSOLE" /&
&appender-ref ref="file.text.DATE_FILE" /&
--& &/category&
&level value="trace" /&
&level value="debug" /&
&level value="info" /&
&level value="warn" /&
&level value="error" /&
&level value="fatal" /&
&appender-ref ref="console.CONSOLE" /&
&appender-ref
ref="file.text.DATE_FILE"/&
--& &/root&&/log4j:configuration&
===================================================
今天弄mondrian时才注意log4j.xml,原来一直使用log4j.properties,发现它比properties功能强大,可以配置输出多个log文件。转一个基本的配置:
log4j 有两种配置方法,大家熟知的是properties文件但是最近的项目实施中,每次去用户那里装系统,都要苦恼于log文件放在不同位置,要改property文件就要重打jar包,麻烦的紧。而如果采用xml配置的方法,直接放在WEB-INFO下,要修改路径,很方便。查了些资料,终于把系统的log4j改成在xml中配置啦。记一下记一下……嘿嘿附:log4j的API http://logging.apache.org/log4j/docs/api/index.htmllog4i.xml 文件&?xml version="1.0" encoding="GB2312" ?&&!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&&log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"& &appender name="FILE"
class="org.apache.log4j.RollingFileAppender"&
&!-- 设置通道file和输出方式:org.apache.log4j.RollingFileAppender --&
&param name="File" value="D:/zhaotj/all.output.log" /&&!-- 设置File参数:日志输出文件名 --&
&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="STDOUT" class="org.apache.log4j.ConsoleAppender"&
&!-- 设置监视器输出方式 --&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern"
value="%-4r [%t] %-5p %c %x - %m%n" /&
&!--滤镜设置输出的级别--&
&filter class="org.apache.log4j.varia.LevelRangeFilter"&
&param name="levelMin" value="info" /&
&param name="levelMax" value="info" /&
&param name="AcceptOnMatch" value="true" /&
&/filter& &/appender&
&root&&!-- 设置接收所有输出的通道 --&
&priority value="info" /&
&appender-ref ref="FILE" /&&!-- 与前面的通道id相对应 --&
&appender-ref ref="STDOUT" /& &/root&
&/log4j:configuration&建好xml文件后 要写一个servlet类继承actionservlet,当工程初始化时自动加载xml配置文件package com.import javax.servlet.ServletEimport mons.logging.Limport mons.logging.LogFimport org.apache.log4j.xml.DOMCimport org.apache.struts.action.ActionS
public class ExtendedActionServlet extends ActionServlet {
private Log log = LogFactory.getLog(this.getClass().getName());
public ExtendedActionServlet() {}
public void init() throws ServletException {
"Initializing, My MyActionServlet init this System's Const Variable");
String prefix = this.getServletConfig().getServletContext().getRealPath(
"/");//读取项目的路径
String file = this.getServletConfig().getInitParameter("log4j");
//读取log4j相对路径
String filePath = prefix +
DOMConfigurator.configure(filePath);//加载.xml文件
("Initializing, end My Init");
super.init();//应用了struts,此方法不能省,ActionServlet覆盖了的此方法中有很多重要操作
}}我们可以看到 在此类中 用了相对路径来加载xml的方法,首先通过prefix 读取了项目的路径然后再通过读取web.xml中的log4j变量,获得log4j.xml的相对路径 两者结合 就是他的绝对路径拉最后在web.xml中配置action信息 就可以实现加载啦web.xml
&servlet-name&action&/servlet-name&
&servlet-class&
com.asiainfo.ExtendedActionServlet
&/servlet-class&
&init-param&
&param-name&config&/param-name&
&param-value&/WEB-INF/struts-config.xml&/param-value&
&/init-param&
&!-- tsExtend
&init-param&
&param-name&config/tsextend&/param-name&&!--设备检测子模块--&
&param-value&
/WEB-INF/tsextend/struts-config.xml
&/param-value&
&/init-param&
&init-param&
&param-name&log4j&/param-name&&!--log4j.xml的路径--&
&param-value&
/WEB-INF/log4j.xml
&/param-value&
&/init-param&
&init-param&
&param-name&info&/param-name&
&param-value&3&/param-value&
&/init-param&
&init-param&
&param-name&detail&/param-name&
&param-value&3&/param-value&
&/init-param&
&load-on-startup&0&/load-on-startup&&!--设置当工程初始时便执行--& &/servlet&
&servlet-mapping&
&servlet-name&action&/servlet-name&
&url-pattern&*.do&/url-pattern& &/servlet-mapping&
依据各个级别的日志输出到不同文件
log4j支持这个功能,不过不能再使用Properties配置,必须使用XML建一个log4j.xml&?xml
version= "1.0 "
encoding= "UTF-8 "?&&!DOCTYPE
log4j:configuration
"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 "/&&/appender&&appender
name= "DEBUG "
class= "org.apache.log4j.RollingFileAppender "&&param
name= "File "
value= "debug.log "/&&param
name= "Append "
value= "true "/&&param
name= "MaxFileSize "
value= "500KB "/&&param
name= "MaxBackupIndex "
value= "2 "/&&layout
class= "org.apache.log4j.PatternLayout "/&&filter
class= "org.apache.log4j.varia.LevelRangeFilter "&&param
name= "LevelMax "
value= "DEBUG "
name= "LevelMin "
value= "DEBUG "
/&&/filter&&/appender&&appender
name= "INFO "
class= "org.apache.log4j.RollingFileAppender "&&param
name= "File "
value= "info.log "/&&param
name= "Append "
value= "true "/&&param
name= "MaxFileSize "
value= "500KB "/&&param
name= "MaxBackupIndex "
value= "2 "/&&layout
class= "org.apache.log4j.PatternLayout "/&&filter
class= "org.apache.log4j.varia.LevelRangeFilter "&&param
name= "LevelMax "
value= "INFO "
name= "LevelMin "
value= "INFO "
/&&/filter&&/appender&&root&&appender-ref
ref= "STDOUT "/&&appender-ref
ref= "DEBUG "/&&appender-ref
ref= "INFO "/&&/root&&/log4j:configuration&代码中DOMConfigurator.configure( "log4j.xml ");这样就可以在log.debug和时分别打印到不同文件中,如果你还需要更多的文件,可以复制多几次appender就可以了(1). 输出方式appender一般有5种:
org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方) (2). 日记记录的优先级priority,优先级由高到低分为
OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。 (3). 格式说明layout中的参数都以%开始,后面不同的参数代表不同的格式化信息(参数按字母表顺序列出):
输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的维(如:"org.apache.elathen.ClassName",%C{2}将输出elathen.ClassName)
输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
输出代码指定信息,如info(“message”),输出message
输出优先级,即 FATAL ,ERROR 等
输出从启动到显示该log信息所耗费的毫秒数
输出产生该日志事件的线程名
下载次数: 239
浏览 27352
dolphin_ygj
浏览: 873764 次
来自: 上海
方便把:testPNR();具体实现发出来吗?谢谢
如果js和webservice不在同一个服务器上,有跨域问题如 ...}

我要回帖

更多关于 log4j 日志被覆盖 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信