今天遇到的一些问题。
package com.lj.basic.util; import org.apache.log4j.Logger; /** * 这里把log4j.properties放到了basic-common中,此时如果调用basic-common的maven项目中没有log4j.properties文件<br/> * 那么就会调用这里的log4j.properties来读取信息<br/> * 但是如果maven项目中建立了log4j.properties,那么程序就不会再读取这里的property文件了。 * @author Administrator * */ public final class MyLog4jLogger { private static Logger logger=Logger.getLogger(MyLog4jLogger.class); private MyLog4jLogger(){} public static void debug(Object obj){ logger.debug( obj); } public static void info(Object obj){ logger.info(obj); } public static void warn(Object obj){ logger.warn(obj); } }
1. 这个类是想拿来随处使用的, 不必在每个类中都new一个Logger对象。
但是似乎问题很多。 比如这样一来就没法显示调用logger方法的类了。(会一律被显示为这个MyLog4jLogger。)
2. 自定义包的问题。
如上图所示,
#log4j.logger.com.lj.cms.web=debug,cms #log4j.logger.com.lj.core.dao=debug,cms log4j.logger.com.lj=debug,cms
只有第三行是有效的,原因其实很简单。
因为Mylog4jLogger.java的位置在com.lj.basic.util里面。
log4j并不会管我在哪里调用的MyLog4jLogger的方法, 它只管这个类的位置在哪里。
因此上面改为:
log.4j.logger.com.lj.basic.util, 就可以了。
3. rootLogger的问题
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n log4j.rootLogger=warn, stdout
这个rootLogger似乎要屏蔽掉才行。
不然会导致我上面所有的debug信息输出两遍。
这里让我很不解。
难道我自定义了包路径以及级别, 不应该覆盖掉rootLogger的输出才对么?