Log4j 1.x和log4j2.x还是有一些不同的地方,下面做一些简单的使用。首先,下载log4j2.x
http://logging.apache.org/log4j/2.x/download.html 然后解压,下面是2.3的部分jar包。
在项目中导入jar包
在eclipse中新建一个名为Log4j2的java工程,工程名上右键选择属性或者直接alt+enter快捷键。选择Java Build Path
选择Add Library 然后选择User Library 然后next,在选择User Library然后选择new新建一个library。
选择Add Extenal Jar,选择下面两个jar包就可以了
然后创建类LogTest如下
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Logger; public class LogTest { private static final Logger logger = (Logger) LogManager.getLogger(LogTest.class); public static void main(String[] args) { logger.info("log4j2 test"); } }
运行,报错
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
为什么会报错了,很明显的问题吗?我们连配置文件都没有当然要包配置文件没有找到嘛。
这里先说一说log4j2中的配置的4种方式:
1. 通过一个XML,JSON,YAML的配置文件来配置。
2. 创建一个ConfigurationFactory并且实现Configuration接口。
3. 调用实现了Configuration接口的类,更改默认设置。
4. 调用Loggerd的内部方法。
这里我们只用第一个,通过XML文件来配置Log4j2.
那么问题来了我们的配置文件放在什么地方呢?log4j2怎么找到我们的配置文件呢?我们请教一下发现
官方文档说:当log4j启动的时候,会首先找到所有的ConfigurationFactory然后按权重排序。
1.会找系统属性(system property)
2. log4j2-test.yaml或者log4j2-test.yam
3. log4j2-test.json 或者log4j2-test.jsn
4. log4j2-test.xml
5. log4j2.yaml 或者 log4j2.yml
6. log4j2.json 或者log4j2.jsn
7. log4j2.xml
8. 如果以上都没有找到就用默认的DefaultConfiguration
解释一下,system properties就是设置java里的Properties,可以通过System.getProperties();得到。
Log4j2中通过下面的方式设置配置文件的位置
System.setProperty(XmlConfigurationFactory.CONFIGURATION_FILE_PROPERTY,"log4j2.xml");
2~7的文件必须是在classpath路径中的,可以通过
System.out.println(System.getProperty("java.class.path"));来看一看classpath的路径,然后随便放在其中一个就可以了,在eclipse中最简单的就是直接放在项目的bin目录下。
yaml,json和xml都可以理解为一种特殊的数据结构,用他们存在和解析数据很方便,有哪一个不知道可以用搜索引擎搜一下。
下面我们来试一试第一种方式:system property的方式。
首先准备一个名为log4j.xml的XML文件。文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF"> <appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </appenders> <loggers> <root level="trace"> <appender-ref ref="Console"/> </root> </loggers> </configuration>
我们先不管文件的意思,先来改一改代码。
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory; public class LogTest { private static final Logger logger = (Logger) LogManager.getLogger(LogTest.class); public static void main(String[] args) { System.setProperty(XmlConfigurationFactory.CONFIGURATION_FILE_PROPERTY,"log4j.xml"); logger.info("log4j2 test"); } }
运行一下,还是ERROR StatusLogger No log4j2 configuration file found.他和我杠上了,嗯,让我想一想。
private static final Logger logger = (Logger) LogManager.getLogger(LogTest.class);
看一看这一句,修饰词是static,这意味着在执行main方法时也就是在
System.setProperty(XmlConfigurationFactory.CONFIGURATION_FILE_PROPERTY,"log4j.xml");
之前就已经初始化了logger,所以还是找不到文件也是能够理解的。
我们再改一改,改成下面的样子:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory; public class LogTest { static { System.setProperty(XmlConfigurationFactory.CONFIGURATION_FILE_PROPERTY,"log4j.xml"); } private static final Logger logger = (Logger) LogManager.getLogger(LogTest.class); public static void main(String[] args) { // System.setProperty(XmlConfigurationFactory.CONFIGURATION_FILE_PROPERTY,"log4j.xml"); logger.info("log4j2 test"); } }
是不是就OK了。
现在我们试一试方法7,把log4j.xml文件移动到项目的src或者bin文件夹下,然后程序改为下面的样子:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Logger; //import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory; public class LogTest { // static // { // System.setProperty(XmlConfigurationFactory.CONFIGURATION_FILE_PROPERTY,"log4j.xml"); // } private static final Logger logger = (Logger) LogManager.getLogger(LogTest.class); public static void main(String[] args) { // System.setProperty(XmlConfigurationFactory.CONFIGURATION_FILE_PROPERTY,"log4j.xml"); logger.info("log4j2 test"); } }
运行,什么鬼,又找不到文件,4j2哥不要这样玩我。惹不起,我摇人,找到4j2的文档大哥打听一下,发现他找的是log4j2.xml不是log4j.xml.再改一改文件名,听4j2文档大哥的话,改为log4j2.xml,放在项目的src文件夹下。
OK,搞定,摇人就是管用,像ERROR StatusLogger No log4j2 configuration file found.这个小东西都不敢瞅我了。
参考:
http://logging.apache.org/log4j/2.x/manual/configuration.html
http://stackoverflow.com/questions/19476955/how-to-configure-log4j2-by-runtime-path-working-directory-xml-file-not-classp