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
如果某个类somepackage.my.MyClass要输出log的话,那么在文件里就会输出相同的两行。原因就在于slog4j.logger.somepackage.my=INFO,my
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是个空白。