log4j2初遇

Log4j 1.xlog4j2.x仍是有一些不一樣的地方,下面作一些簡單的使用。首先,下載log4j2.x
html

http://logging.apache.org/log4j/2.x/download.html 而後解壓,下面是2.3的部分jar包。java


  1. 在項目中導入jarapache

eclipse中新建一個名爲Log4j2java工程,工程名上右鍵選擇屬性或者直接alt+enter快捷鍵。選擇Java Build Pathjson

選擇Add Library 而後選擇User Library 而後next,在選擇User Library而後選擇new新建一個library數據結構

選擇Add Extenal Jar,選擇下面兩個jar包就能夠了app


而後建立類LogTest以下eclipse

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");
  }
}

運行,報錯ui

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.搜索引擎

爲何會報錯了,很明顯的問題嗎?咱們連配置文件都沒有固然要包配置文件沒有找到嘛。spa

這裏先說一說log4j2中的配置的4種方式:

1. 經過一個XMLJSON,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目錄下。

yamljsonxml均可以理解爲一種特殊的數據結構,用他們存在和解析數據很方便,有哪個不知道能夠用搜索引擎搜一下。

下面咱們來試一試第一種方式:system property的方式。

首先準備一個名爲log4j.xmlXML文件。文件的內容以下:

<?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

相關文章
相關標籤/搜索