参考资料
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!!!");
}