1. log4j 的log4j.properties在WPF里面是默认自带的,不需要自己再定义,在WEB-INF/configs底下。
2. Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。
3. log4j配置文件:
1 #all logger output level is DEBUG and output position is stdout
2 log4j.rootLogger=DEBUG, stdout ,R ////这一句指定了日志输出的级别为debug,stout和R分别代表日志输出到什么地方。
3 #log4j.appender is set output postion
4 #log4j.logger is set some package(some package your want output logger specially)=[output level],[...output position]
5
6 #in the console
7 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
8 #config stdout position output contain INFO level and up
9 log4j.appender.stdout.Threshold=DEBUG //stout的输入级别
10 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
11 log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %l:%t - %m %n18
19 #in the daily files
20 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
21 log4j.appender.R.Threshold=ERROR
22 log4j.appender.R.File=${root.path}/log/EmailInterface.log
23 log4j.appender.R.DatePattern='.'yyyy-MM-dd'.log'
24 log4j.appender.R.layout=org.apache.log4j.PatternLayout
25 log4j.appender.R.layout.ConversionPattern=%d [%-5p] %l:%t - %m %n
26
27 log4j.logger.com.statestr=DEBUG //指定特定包的输出级别,即com.statestreet的包都是DEBUG级别
3.1 rootLogger相当于java当中的object,其它的logger去继承它。
log4j.rootLogger=INFO, stdout ,R,语法为:#log4j.rootLogger = [ level ] , appenderName, appenderName。这里的INFO表示log的级别是INFO,所以debug就会被忽略掉。#appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
但,stdout和R又是什么呢?这个名字是随便取的,你可以叫它A
3.1.1其中,Log4j提供的appender有以下几种:
3.1.2 Log4j提供的layout有以下几种:
#org.apache.log4j.HTMLLayout(以HTML表格形式布局),
#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
3.1.3当调试系统时,我们往往注意的只是异常级别的日志输出,但是通常所有级别的输出都是放在一个文件里的,如果日志输出的级别是BUG!?那就慢慢去找吧。
这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以,Log4j已经提供了这样的功能,我们只需要在配置中修改Appender的Threshold就能实现。如上例中R就是为了把ERROR以上的错误输出到一个单独的文件中。
4. log4j的注意事项:
debug的时候要用:
if (log.isDebugEnabled()) {
log.debug("updateBidAuction:" + bidAuction);
}
原因: 为了优化性能。
当输出级别是debug,即需要进行日志信息输出时,加不加这句if判断,效果是一样的;
当输出级别高于debug,即不需要进行日志信息输出时:
①假如debug方法中的参数比较简单时(比如直接就是写好的字符串),加不加这句if判断,在效率上也几乎没有什么差别;
②假如debug方法中的参数比较复杂时(比如还要使用别的函数进行计算、或者还要进行字符串的拼接等等),在前面就加上这句if判断,会让效率提高(否则,开始大动干戈做了很多事情(比如字符串的拼接),后来才发现不需要进行输出日志信息)。 因为是log.debug这句话是先进行()里的字符串的运算的,运算好了才进行log.debug,如果这时候才发现是INFO或者ERROR级别的,不需要输入,那就很浪费效率了。
5. log4j使用实例:
1 public class LogTest {
2 static {
3 PropertyConfigurator.configure("log4j.properties");
4 }
5 static Logger logger = Logger.getLogger(LogTest.class);
6
7 public static void main(String[] args) {
8 logger.info("Entering application.");
9
10 logger.debug("debug");
11 logger.error(constructError());
12 logger.fatal("fatal");
13
14 logger.info("Exiting application.");
15 }
16
17 private static String constructError() {
18 return "error";
19 }
20 }