log4j笔记
参考资料
short manual
简介
Log4j的三个主要对象:
Logger:日志记录器,具有hierarchy naming rule(可继承parent或ancestor的日志级别),可分配日志级别TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF, ALL
Appender:日志请求的输出目的地(in log4j’s speak, an output destination is and Appender.),当前包括console, files, GUI componentt, remote socket servers, JMS, NT Event Loggers, and Unix syslog deamons,可自行扩展,可异步执行日志操作。最常用的为DailyRollingFileAppender及RollingFileAppender。其具有可附加特性(Appender Addivity)
Layout:日志输出格式(配合Appender使用),PatternLayout是使用类似C语言的printf函数的转换模式(conversion pattern)。详细配置请参考PatternLayout的API。
配置
Log4j的配置文件可以是XML格式(使用DOMConfigurator完成配置)或properties格式(使用PropertyConfigurator完成配置)
例子一:Log4j默认读取类路径根目录下log4j.properties完本配置工作
1、在类根目录下添加log4j.properties配置文件
###根日志器 log4j.rootLogger=, A1, A2, A3 ###定义名为A1的输出端的类型为控制台 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d [defaultconfig file log] %5p [%t] %c{1}.%M %L - %m%n ###定义名为A2的输出端的类型为指定大小的日志文件 ###由于其最多只能 log4j.appender.A2=org.apache.log4j.RollingFileAppender log4j.appender.A2.Encoding=UTF-8 #已经生成的日志文件最大数目,出于性能考虑不要超过10,默认为1 #log4j.appender.A2.MaxBackupIndex=10 #MaxFileSize default 10MB (10*1024*1024) log4j.appender.A2.MaxFileSize=1KB log4j.appender.A2.File=C:/A2.log log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%d [default config file log] %5p [%t] %c{1}.%M %L - %m%n ###定义名为A3的输出端的类型为每天产生一个日志文件 ###DailyRollingFileAppender可控制到年月日、时分秒 log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender log4j.appender.A3.File=C:/A3.log log4j.appender.A3.DatePattern='.'yyyy-MM-dd log4j.appender.A3.layout=org.apache.log4j.PatternLayout log4j.appender.A3.layout.ConversionPattern=%d [default config file log] %5p [%t] %c{1}.%M %L - %m%n
2 测试代码如下:
package personal.lql.example; import org.apache.log4j.Logger; /** * 例子:默认读取classpath根目录配置文件 * @author 202625 * */ public class UseDefaultLocationConfigFile { public static final Logger log = Logger .getLogger(UseDefaultLocationConfigFile.class); public static void main(String[] args) { log.debug("using default location log4j.properties test!"); } }
例子二:指定目录下配置文件的配置
将log4j.properties配置文件放置在测试类文件同目录
测试代码
package personal.lql.example; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; /** * 例子:读取指定目录配置文件 * * @author 202625 * */ public class UseSpecifiedConfigFile { static final Logger log = Logger.getLogger(UseSpecifiedConfigFile.class); public static void main(String[] args) { //读取特定URL内容完成配置 PropertyConfigurator.configure(UseSpecifiedConfigFile.class .getClassLoader().getResource("personal/lql/example/log4j.properties")); log.debug("using specified location log4j.properties test!"); int i = 1; int[] arrayI = {0,1}; //先判断能否输出日志再输出 if(log.isInfoEnabled()){ log.info("start " + i + arrayI[1] + "end!!!"); } } }
配置文件:
###根日志器 log4j.rootLogger=, A1, A2, A3 ###定义名为A1的输出端的类型为控制台 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d [specified config file log] %5p [%t] %c{1}.%M %L - %m%n ###定义名为A2的输出端的类型为指定大小的日志文件 ###由于其最多只能 log4j.appender.A2=org.apache.log4j.RollingFileAppender log4j.appender.A2.Encoding=UTF-8 #已经生成的日志文件最大数目,出于性能考虑不要超过10,默认为1 #log4j.appender.A2.MaxBackupIndex=10 #MaxFileSize default 10MB (10*1024*1024) log4j.appender.A2.MaxFileSize=1KB log4j.appender.A2.File=C:/A2.log log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%d [specified config file log] %5p [%t] %c{1}.%M %L - %m%n ###定义名为A3的输出端的类型为每天产生一个日志文件 ###DailyRollingFileAppender可控制到年月日、时分秒 log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender log4j.appender.A3.threshold=INFO log4j.appender.A3.File=C:/A3.log log4j.appender.A3.DatePattern='.'yyyy-MM-dd log4j.appender.A3.layout=org.apache.log4j.PatternLayout log4j.appender.A3.layout.ConversionPattern=%d [specified config file log] %5p [%t] %c{1}.%M %L - %m%n
日志级别设置:
1、设置根日志级别
###根日志器 log4j.rootLogger=DEBUG, A1, A2, A3
2、设置对应Appender日志级别
log4j.appender.A3=INFO
注意事项
1、日志转换模式%C是输出完整的日志类名,生成调用日志类信息会比较慢,因此最好不要使用,除非速度不是问题。
2、日志转换模%l是输出日志事件发生位置,包括类目名、发生线程,在代码中的行数,速度很慢,因此最好不要使用。
3、日志记录内容如果开销较大,需先判断是否可输出,例如,下面的输出内容拼装开销比较大,因为不管是否输出日志,拼装都会完成计算,所以最好先前判断能否输出
int i = 1;
int[] arrayI = {0,1};
//先判断能否输出日志再输出
if(log.isInfoEnabled()){
log.info("start " + i + arrayI[1] + "end!!!");
}