log4j的使用
结合项目使用Log4j打印日志,log4j具体的使用方法大家可以baidu下,本文只是总结一下log4j和项目的关系。
首先创建一个maven项目,在POM文件中导入log4j依赖:
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
项目结构如下:
定义3个类 Test1,Test2,Test3
package appender1;
import org.apache.log4j.Logger;
public class Test1 {
public static Logger LOG = Logger.getLogger(Test1.class);
public static void main(String[] args) {
LOG.info("this info is from class Test1");
LOG.info("this info is from class Test1");
LOG.info("this info is from class Test1");
LOG.info("this info is from class Test1");
}
}
package appender1;
import org.apache.log4j.Logger;
public class Test2 {
public static Logger LOG = Logger.getLogger(Test2.class);
public static void main(String[] args) {
LOG.info("this info is from class Test2");
LOG.info("this info is from class Test2");
LOG.info("this info is from class Test2");
LOG.info("this info is from class Test2");
}
}
package appender2;
import org.apache.log4j.Logger;
public class Test3 {
public static Logger LOG = Logger.getLogger(Test3.class);
public static void main(String[] args) {
LOG.info("this info is from class Test3");
LOG.info("this info is from class Test3");
LOG.info("this info is from class Test3");
LOG.info("this info is from class Test3");
}
}
注意这里类Test1完整类名为appender1.Test1
类Test2完整类名为appender1.Test2
类Test3完整类名为appender2.Test3
Test1和Test2属于同一个包
Log4j的配置文件如下
#定义appender,这个随便查下就好啦
log4j.appender.Test = org.apache.log4j.FileAppender
log4j.appender.Test.File= ./logs/test.log
log4j.appender.Test.layout=org.apache.log4j.PatternLayout
log4j.appender.Test.layout.conversionPattern=%m%n
#这里是记录的重点,主要是配置对应的Logger,对于我们之前的项目,
#Test1和Test2位与同一个包appender1中,下面这个配置的意思就是将
#包appender1中定义的Logger对应上配置文件中名为Test的appender。
log4j.logger.appender1=INFO,Test
接着分别运行Test1,Test2,Test3 我们可以发现,Test1,Test2正常将日志输出到./logs/test.log文件中。而Test3将会报错:
log4j:WARN No appenders could be found for logger (appender2.Test3).
log4j:WARN Please initialize the log4j system properly.
因为Test3中的Logger找不到与之对应的appender。
配置log4j.logger.appender2= INFO,Test 即可
补充一点:
log4j.rootLogger = INFO, ROOT
log4j.appender.ROOT = org.apache.log4j.FileAppender
log4j.appender.ROOT.File= ./logs/test.log
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
log4j.appender.ROOT.layout.conversionPattern=%m%n
log4j有一个叫做rootLogger的默认Logger,剩下的logger都是这个rootLogger的子logger,也就是说所有日志都会写到rootLogger中,如果将上述配置加入到log4j.properties文件中,当我们再次运行Test1时,会发现test.log 中将会记录8条日志,这是因为rootLogger和Test这两个Logger分别向日志文件中写了一次。
那么就会想到这样岂不是日志就有重复了么?没关系,对于每个我们自己定义的logger可以配置如下属性,这样就不会写入到rootLogger中了,其中appender1是我们的包名
log4j.additivity.appender1=false