2016年10月18日 星期二

Log4j Java 使用xml設定檔

環境
-Intelj13
-log4j1.2.17

範例實作
1.匯入lo4j jar檔







2.建立log4j.xml 設定檔
- 設定檔名稱『一定要叫log4j』,否則系統會抓取不到
- 開頭前2行做為log4j設定檔的宣告
- 所有設定放在log4j:configuration中
- 放在專案src下方









<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  <!--宣告log4j.xml的文件型別定義(Document Type Definition, DTD)-->

<!--所有log4j的設定都必須放在 <log4j:configuration>...</log4j:configuration>之內 -->
<log4j:configuration>
</log4j:configuration>

3.Log要輸出到哪裡??要長甚麼樣子??,appender設定
(放在
log4j:configuration中)

- Append 定義 log message 『輸出的裝置』及 『log 內容格式』
- log4j.xml 可以設定多個append
    <appender name="Console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout"> <!-- 設定appender的layout為PatternLayout -->
            <!-- 設定layout的pattern,參數名為conversionPattern,value為想要的輸出格式 -->
            <param name="conversionPattern"
                   value="%-d{yyyy-MM-dd HH:mm:ss} [%C{5}]-[%p] %m%n"/>
        </layout>
    </appender>
    <!-- DailyRollingFileAppender的第一個log檔並不會加上DatePattern的樣式,
                     必須在下一次週期產生的log檔才會加上DatePattern的樣式。
                     所以基本上當天產生的log檔算是第一次的log檔,並不會加上Pattern樣式-->

    <appender name="File" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="D:\system_notice.txt" /> <!--檔案路徑-->
        <!--DatePattern是DailyRollingFileAppender的一個重要參數,用來設定檔案輸出的週期-->
        <param name="DatePattern" value="'.'yyyy-MM-dd-HH'.log'" />  
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%C{5}]-[%p] %m%n" />
        </layout>
    </appender>
4.檔案與Log設定的配對(本範例有三種) logger設定(放在log4j:configuration中)
- 補充-概念等於希望把log印出至console也要同時輸出至檔案
<appender-ref ref="Console"/>
<appender-ref ref="File"/> 
- 全專案套用
- 某個資料夾全部套用
- 指定要使用哪個Logger
    <!--RootLogger(全專案套用)-->
    <!--rootLogger的LEVEL設定為DEBUG,DEBUG以上等級的資訊也都會寫出-->
    <!--主要class搭配:public static Logger logger = Logger.getLogger(MyPractice.class);-->
    <root>
    <priority value="DEBUG"/> <!--印出INFO以上的資訊-->
    <appender-ref ref="Console"/> <!--將rootLogger的appender參考至剛設定好的Console appender-->
    <appender-ref ref="File"/> <!--將rootLogger的appender參考至剛設定好的File appender-->
    </root>
    <!--整個資料夾套用-->
    <!--main class搭配:public static Logger logger = Logger.getLogger("MyPractice.class");-->
    <logger name="MyTest"> <!--指定的資料夾-->
        <level value="ERROR"/> <!--印出ERROR以上的資訊-->
        <appender-ref ref="Console"/> <!--將rootLogger的appender參考至剛設定好的Console appender-->
        <appender-ref ref="File"/> <!--將rootLogger的appender參考至剛設定好的File appender-->
    </logger>
    <!--指定要哪個Logger設定-->
    <!--class搭配:public static Logger logger = Logger.getLogger("aa");-->
    <logger name="aa"> //替logger取名稱
    <level value="INFO"/> <!--印出INFO以上的資訊-->
    <appender-ref ref="Console"/> <!--將rootLogger的appender參考至剛設定好的Console appender-->
    <appender-ref ref="File"/>    <!--將rootLogger的appender參考至剛設定好的File appender-->
    </logger>
5.Java檔實際執行記錄
public class MyPractice{
    public static Logger logger = Logger.getLogger(MyPractice.class);
    public static Logger logger2 = Logger.getLogger("aa");
    public static void main(String[] args) {
        int num = 0;
        try {
            System.out.println(num/0);
        } catch (Exception e) {
            System.out.println(e);
            logger.debug("Here is some DEBUG");
            logger.info("Here is some INFO");
            logger.warn("Here is some WARN");
            logger.error("Here is some ERROR");
            logger.fatal("Here is some FATAL");
            logger2.debug("Here is some aa logger");
            logger2.info("Here is some aa logger");
        }
    }
}

沒有留言:

張貼留言