log4j 根據日誌級別輸出到指定文件中

1、log4j的參考配置文件 (以下支持根據級別輸出到特定文件中)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p] %d{yyyy-MM-dd HH\:mm\:ss} %l\: %m%n"/>
</layout>
</appender>


<appender name="DEBUG" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logs/LottChartStBox_debug.log"/>
<param name="datePattern" value="'.'yyyy-MM-dd"/>
<param name="encoding" value="UTF-8">
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p] %d{yyyy-MM-dd HH\:mm\:ss} %l\: %m%n"/>
</layout>
</appender>

<appender name="WARN" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logs/LottChartStBox_warn.log"/>
<param name="datePattern" value="_yyyy-MM-dd"/>
<param name="encoding" value="UTF-8">
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%p] %d{yyyy-MM-dd HH\:mm\:ss} %l\: %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="ERROR" />
</filter></appender>

<!-- <appender name="ERROR" class="org.apache.log4j.DailyMaxRollingFileAppender">
<param name="File" value="logs/LottChartStBox_error.log"/>
<param name="Append" value="true"/>
<param name="DatePattern" value="LottChartStBox_error_'yyyy-MM-dd'.log" />
<param name="encoding" value="UTF-8">
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d{yyyy-MM-dd HH\:mm\:ss} %l\: %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter> </appender>  -->

<root>
<priority value="debug"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="DEBUG"/>
<appender-ref ref="WARN"/>
<!-- <appender-ref ref="ERROR"/> -->
</root>

</log4j:configuration>


2、log4j的文件的放置於調用

     在log4j.jar中,有個初始化類org.apache.log4j.LogManager . 它有個靜態代碼塊,指明瞭調用配置文件的先後順序如下 :   

  static
  {
    Hierarchy h = new Hierarchy(new RootLogger(Level.DEBUG));
    repositorySelector = new DefaultRepositorySelector(h);
    String override = OptionConverter.getSystemProperty("log4j.defaultInitOverride", null);
    if ((override == null) || ("false".equalsIgnoreCase(override)))
    {
      String configurationOptionStr = OptionConverter.getSystemProperty("log4j.configuration", null);
      String configuratorClassName = OptionConverter.getSystemProperty("log4j.configuratorClass", null);
      


      URL url = null;
      if (configurationOptionStr == null)
      {
        url = Loader.getResource("log4j.xml");
        if (url == null) {
          url = Loader.getResource("log4j.properties");
        }
      }
      else
      {
        try
        {
          url = new URL(configurationOptionStr);
        }
        catch (MalformedURLException ex)
        {
          url = Loader.getResource(configurationOptionStr);
        }
      }
      if (url != null)
      {
        LogLog.debug("Using URL [" + url + "] for automatic log4j configuration.");
        try
        {
          OptionConverter.selectAndConfigure(url, configuratorClassName, getLoggerRepository());
        }
        catch (NoClassDefFoundError e)
        {
          LogLog.warn("Error during default initialization", e);
        }
      }
      else
      {
        LogLog.debug("Could not find resource: [" + configurationOptionStr + "].");
      }
    }
  }
     說明:

     1、OptionConverter.getSystemProperty() 等用於 System.getProperty()

     2、如果系統屬性配置了“log4j.defaultInitOverride”且不是false(默認爲null),那麼就不會自動加載配置文件,必須手動調用org.apache.log4j.PropertyConfigurator.configure(xxxx)方法來自己手動加載文件屬性

    3、沒有配置“log4j.defaultInitOverride”,那麼就會先在系統屬性"log4j.configuration"所指定的路徑下去查找配置文件,找到就加載,找不到就拉倒

    4、如果沒有“log4j.defaultInitOverride” 和 "log4j.configuration" ,就會在項目classpath下去找,優先找到log4j.xml,再找log4j.properties,先找到哪個就加載哪個

    5、第一次獲得logger對象後,就會放入緩存,後面取的將都是緩存裏面的值 (注意,如果第一次構建對象時還沒有加載到配置文件,及時後面系統加載了配置文件也不生效了,還有,謹防jar包裏面的log4j配置文件的影響)

3、日誌的輸出

       我們調用一般會用2個  :

       org.apache.commons.logging.Log log =   org.apache.commons.logging.LogFactory.getLog(Class);   //來源於 commons-logging.jar

       org.apache.log4j.Logger logger =  org.apache.log4j.LogManager.getLogger(Class);   //來源於log4j.jar

       關係 :

      org.apache.commons.logging.Log  繼承於(extends)   org.apache.log4j.Logger; 

      org.apache.commons.logging.LogFactory.getLog(Class);這個方法最終也是調用了org.apache.log4j.LogManager.getLogger(Class)的方法生成logger對象 。

      不過 org.apache.commons.logging.LogFactory.getLog(Class) 這個是包裝了一層緩存,而 org.apache.log4j.LogManager.getLogger(Class)沒有緩存 。 那麼效率就肯定低下好多,且會new多個對象

      請使用

      org.apache.commons.logging.Log log =   org.apache.commons.logging.LogFactory.getLog(Class);   //來源於 commons-logging.jar

    

 

      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章