Log4j的使用

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

今天又偶然用了一下log4j,不免有些生疏。所以贴出来总结一下:

首先Log4j需要准备一个configure文件:log4j.properties

文件格式:

# Configure the log dir and file names here
my.log.dir=./log
my.log.file=my.log

# Define the root logger for deployment
# This is the default level and appender
log4j.rootLogger=INFO,my

# Global Logging Threshold
log4j.threshhold=ALL
#这里定义输出文件以及输出的样式
#
# Daily Rolling File Appender for my
#
log4j.appender.my=org.apache.log4j.DailyRollingFileAppender
log4j.appender.my.File=${my.log.dir}/${my.log.file}
# Rollover at midnight
log4j.appender.my.DatePattern=.yyyy-MM-dd
# Output logs above INFO for this appender
log4j.appender.my.Threshold=INFO 
log4j.appender.my.layout=org.apache.log4j.PatternLayout
# Pattern format: Date LogLevel [ThreadName] LoggerName: LogMessage
log4j.appender.my.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %C: %m%n
# Custom Logging levels
# Only output ERRORs for other libraries
log4j.logger.org=ERROR
# Output logs above INFO for ydrive

log4j.logger.somepackage=INFO

这里需要注意additivity,如果不写,那么就默认继承上面一个appender
log4j.additivity.somepackage.my=false
log4j.logger.somepackage.my=INFO,my

log4j.properties就是这样的格式。上面的意思除了输出文件和输出文件的格式大家基本都是一致的。对于下面怎么添加appender,每个人的写法就有
区别了。如果

log4j.logger.somepackage=INFO,my
log4j.logger.somepackage.my=INFO,my

如果某个类somepackage.my.MyClass要输出log的话,那么在文件里就会输出相同的两行。原因就在于s

log4j.additivity.somepackage.my=false

omepackage.my不光是要打印自己的log,也要打印somepackage的log.所以才有

log4j.additivity.somepackage.my=false

这里就会抹掉sompackage的影响。

另外INFO,my代表输出等级是INFO和my 这个appender输出。至于my appender的定义。其实就是

log4j.appender.my

下面是代码里的写法:

加载log4j.properties很简单:

File log4jFile = new File("log4j.properties");
System.out.println("Read log4j.propeties at" + log4jFile.getAbsolutePath());
PropertyConfigurator.configureAndWatch(log4jFile.getAbsolutePath());

加载完之后,就可以使用log4j:

首先要import下面两个包

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

然后代码里可以这样写:

private static final Log LOG = LogFactory.getLog(MyClass.class);
{
     LOG.info("print");
}

然后你就可以看到

# Configure the log dir and file names here
my.log.dir=./log
my.log.file=my.log

log目录的my.log里有你的print.

有时候,这个my.log很有可能是空的。原因在于还没有到log4j
flush的时候,你可以多输出些东西。log4j是异步的输出。所以可能那个my.log是个空白。