概述
Log4j 为记录Java应用中的输出信息,包括调试信息(DEBUG),提示信息(ERROR),错误信息(ERROR)等。下面是一个Log4j配置文件的Appender配置:
LOG_DIR=c:logs
### direct log messages to platform ###
log4j.appender.platform=org.apache.log4j.ConsoleAppender
log4j.appender.platform.Target=System.out
log4j.appender.platform.layout=org.apache.log4j.PatternLayout
log4j.appender.platform.layout.ConversionPattern=[%d{ISO8601}] :%5p %c{1}:%L - %m%n
log4j.appender.platform1=org.apache.log4j.RollingFileAppender
log4j.appender.platform1.File=${LOG_DIR}/trace.log
log4j.appender.platform1.MaxBackupIndex=100
log4j.appender.platform1.MaxFileSize=5000000
log4j.appender.platform1.layout=org.apache.log4j.PatternLayout
log4j.appender.platform1.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n %m%n
log4j.appender.platform2=org.apache.log4j.RollingFileAppender
log4j.appender.platform2.File=${LOG_DIR}/trace2.log
log4j.appender.platform2.MaxBackupIndex=100
log4j.appender.platform2.MaxFileSize=5000000
log4j.appender.platform2.layout=org.apache.log4j.PatternLayout
log4j.appender.platform2.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n %m%n
log4j.appender.platform3=org.apache.log4j.RollingFileAppender
log4j.appender.platform3.File=${LOG_DIR}/trace3.log
log4j.appender.platform3.MaxBackupIndex=100
log4j.appender.platform3.MaxFileSize=5000000
log4j.appender.platform3.layout=org.apache.log4j.PatternLayout
log4j.appender.platform3.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n %m%n
一、Appender 与 additivity
1、Log4j Appender则可理解为定义一个输出方式,例如可以输出到控制台,也可以输出到文件(固定周期,每天使用一个日志文件记录;固定大小,超过指定大小则记录到一个新问价中),还可以输出到数据库,甚至可以远程输出到一个日志接口程序中进行记录。
Appender配置好以后,记录哪个程序包运行时的日志呢?答案是通过log4j.logger来指定,log4j.logger后带的包名即为Appender要记录的程序包范围,如下面的例子:
log4j.logger.com.sgcc=debug, platform1
platform1是事先定义好的一个Appender,log4j.logger.com.sgcc表示对程序包com.sgcc中的程序使用Appender(名为:platform1)。
下面是一个Appender platformat1的配置:
log4j.appender.platform1=org.apache.log4j.RollingFileAppender log4j.appender.platform1.File=${LOG_DIR}/trace.log log4j.appender.platform1.MaxBackupIndex=100 log4j.appender.platform1.MaxFileSize=5000000 log4j.appender.platform1.layout=org.apache.log4j.PatternLayout log4j.appender.platform1.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n %m%n |
一个程序包可以指定多个Appender, 也就是说,一个程序包的日志可以输出到多个不同的目的地中去。 例如:
log4j.logger.com.sgcc=debug, platform1,platform2,platform3
使用该配置,程序包com.sgcc的日志可以输出到platform1,platform2,platform3三个Appender中。
2、Log4j additivity则使指是否输出到顶层包定义的Appender中,如com.pa中定义了一个Appender A1,而com.pa.pb中又定义了一个Appender A2,则程序运行时,com.pa.pb中的类若有日志输出,则既会输出到A1中,也会输出到A2中。
有些时候,A2的处理可能比较专职化,不希望其日志掺杂到全局或高层的日志记录中,则可以使用additivity功能来实现。
(1)例子一
下面看一个例子,以上面的Log4j Appender配置为基础,进行包的Appender配置和additivity配置:
log4j.logger.com.sgcc=debug, platform1
log4j.additivity.com.sgcc.test=false
log4j.logger.com.sgcc.test.p1=debug, platform2
log4j.logger.com.sgcc.test.p2=debug, platform3
应用程序顶层包com.sgcc输出调试级别的信息,使用的Appender为platform1,日志输出到文件trace.log。
com.sgcc.test.p1包输出调试级别的信息,使用Appender为platform2,日志输出到文件trace2.log。
com.sgcc.test.p2包输出调试级别的信息,使用Appender为platform3,日志输出到文件trace3.log。
测试文件Log4jTest1.java:
package com.sgcc.test;
import org.apache.log4j.Logger;
import com.sgcc.test.p1.Log4jTest1;
import com.sgcc.test.p2.Log4jTest2;
public class Log4jTest {
static Logger log = Logger.getLogger(Log4jTest.class);
public void logtest(){
log.debug("Log4jTest printed the log.");
new Log4jTest1().logtest();
new Log4jTest2().logtest();
}
public static void main(String[] args) {
Log4jInit.initLog4j();
Log4jTest log4jtest = new Log4jTest();
log4jtest.logtest();
}
}
Log4jTest1.java:
package com.sgcc.test.p1;
import org.apache.log4j.Logger;
public class Log4jTest1 {
static Logger log = Logger.getLogger(Log4jTest1.class);
public void logtest(){
log.debug("Log4jTest1 printed the log.");
System.out.println("sysout:Log4jTest1 printed the log.");
}
}
Log4jTest2.java:
package com.sgcc.test.p2;
import org.apache.log4j.Logger;
public class Log4jTest2 {
static Logger log = Logger.getLogger(Log4jTest2.class);
public void logtest(){
log.debug("Log4jTest2 printed the log.");
}
}
若设置com.sgcc.test.p1的上一层包com.sgcc.test的additivity属性为false,请问:Log4jTest,Log4jTest1,Log4jTest2的日志分别会输出到哪些文件中?
答案是:
trace.log | Log4jTest,Log4jTest1,Log4jTest2 |
trace2.log | Log4jTest1 |
trace3.log | Log4jTest2 |
这里可以看出,log4j.logger.additivicom.sgcc.test=false 并没有阻止Log4jTest1的日志进入顶层包Appender的输出文件trace.log中,因为com.sgcc.test包没有定义Appender,com.sgcc.test的additivity属性并不能延伸到子层(p1, p2)的包中。
(2)例子二
仍以例子的数据和程序为基础,修改配置为:
log4j.logger.com.sgcc=debug, platform1
log4j.additivity.com.sgcc.test.p2=false
log4j.logger.com.sgcc.test.p1=debug, platform2
log4j.logger.com.sgcc.test.p2=debug, platform3
此时,Log4jTest,Log4jTest1,Log4jTest2的日志分别会输出到哪些文件中?
答案是:
trace.log | Log4jTest,Log4jTest1 |
trace2.log | Log4jTest1 |
trace3.log | Log4jTest2 |
最后
以上就是风趣花瓣为你收集整理的log4j additivity解说的全部内容,希望文章能够帮你解决log4j additivity解说所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复