Log4j2使用筆記

項(xiàng)目背景

1 因?yàn)轫?xiàng)目需要,需要對(duì)客戶端的一個(gè)控件做訪問日志記錄。用以統(tǒng)計(jì)頁面過去七天的平均數(shù)量。項(xiàng)目中一直使用Log4j1,這次升級(jí)使用Log4j2。準(zhǔn)備將用戶的登錄id和設(shè)備id單獨(dú)記錄在一個(gè)日志文件中,每天生成一份文件,保留七天。

2 項(xiàng)目中使用Jetty作為web容器,Jetty將統(tǒng)一打印日志。但是這次的特殊統(tǒng)計(jì),需要單獨(dú)設(shè)置一個(gè)logger對(duì)象。輸出到單獨(dú)的日志文件。

第一部分: 原有的日志流程總結(jié)

1. log4j的配置方法

線上的日志應(yīng)該是jetty打印的,log4j采用了SYSTEM_OUT的輸出,沒有指定。但是配置了具體的日志的格式和方法:

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n"/>
        </Console>
    </Appenders>

說明:

  1. Console 的target是SYSTEM_OUT是輸出到統(tǒng)一的輸出流,沒有指定日志文件

2. jetty的日志配置方法

jetty的啟動(dòng)配置文件xml在 jetty.xml

    <New id="ServerLog" class="java.io.PrintStream">
        <Arg>
            <New class="org.eclipse.jetty.util.RolloverFileOutputStream">
                <Arg>
                    <SystemProperty name="jetty.logs" default="./logs" />/<SystemProperty name="jetty.appkey" default="jetty" />.log.yyyy_mm_dd
                </Arg>
                <Arg type="boolean">true</Arg>
                <Arg type="int">10</Arg>
                <Arg>
                    <Call class="java.util.TimeZone" name="getTimeZone">
                        <Arg>GMT+8</Arg>
                    </Call>
                </Arg>
                <Arg type="string">yyyy-MM-dd</Arg>
                <Arg type="string"></Arg>
                <Get id="ServerLogName" name="datedFilename" />
            </New>
        </Arg>
    </New>

    <Call class="org.eclipse.jetty.util.log.Log" name="info">
        <Arg>Redirecting stderr/stdout to <Ref id="ServerLogName"/></Arg>
    </Call>
    <Call class="java.lang.System" name="setErr">
        <Arg>
            <Ref id="ServerLog"/>
        </Arg>
    </Call>
    <Call class="java.lang.System" name="setOut">
        <Arg>
            <Ref id="ServerLog"/>
        </Arg>
    </Call>

同時(shí)具體的參數(shù)配置在 boot.init 和 mms啟動(dòng)文件之中: 文件配置之中:

JVM_ARGS="-server -Dfile.encoding=UTF-8 -Dapp.key=apollo-item -Dsun.jnu.encoding=UTF-8 -Djava.io.tmpdir=/tmp -Djava.net.preferIPv6Addresses=false -Duser.timezone=GMT+08 -Djava.util.prefs.systemRoot=/home/sankuai/.java -XX:-LoopUnswitching -XX:-OmitStackTraceInFastThrow"

在mms的啟動(dòng)文件之中的代碼。說明(mms文件時(shí) 線上的jetty啟動(dòng)配置文件)

    EXEC_JAVA=$EXEC_JAVA" -Djetty.appkey=$MODULE -Djetty.context=$CONTEXT -Djetty.logs=$LOG_ROOT"
    LOG_ROOT=/opt/logs/mobile

日志打印流程說明

  1. 配置文件log4j.xml 中的<Console name="Console" target="SYSTEM_OUT">表示 log4j2將日志配置到System.out輸入到控制到輸出流。

  2. Jetty中對(duì)于所有的控制臺(tái)輸出流統(tǒng)一進(jìn)行處理,有一個(gè)ServerLog的配置部分代表將所有的
    控制臺(tái)輸出流統(tǒng)一輸出到文件之中,使用到了org.eclipse.jetty.util.RolloverFileOutputStream類,這個(gè)類的定義式:
    RolloverFileOutputStream This output stream puts content in a file that is rolled over every 24 hours.代表將輸出流放到一個(gè)每24小時(shí)產(chǎn)生一個(gè)新的文件的日志之中。

  3. 然后具體的文件輸出地址與日志打印的格式都在<Arg>標(biāo)簽中進(jìn)行了詳細(xì)的配置。相應(yīng)的參數(shù)從jetty的啟動(dòng)命令中獲取。語句<SystemProperty name="jetty.logs" default="./logs" />/<SystemProperty name="jetty.appkey" default="jetty" />.log.yyyy_mm_dd 代表了日志的輸出文件地址。


第二部分 - 新的日志配置

1 項(xiàng)目背景:

原有的項(xiàng)目中所有的日志都是統(tǒng)一到一個(gè)日志文件中,但是產(chǎn)品臨時(shí)需要對(duì)一個(gè)功能進(jìn)行統(tǒng)計(jì)分析,需要進(jìn)行單獨(dú)的日志處理。這時(shí)就需要設(shè)計(jì)一個(gè)新的日志對(duì)象并增加一個(gè)新的日志輸出流,從其他的統(tǒng)一日志中進(jìn)行區(qū)分,以用于單獨(dú)的統(tǒng)計(jì)與分析功能。具體的配置過程如下ji:

2 具體配置

配置appender(日志輸出源)

        #配置一個(gè)新的appender(輸出流 - 直接打到文件輸出流)
        <RollingFile name="Daijia" fileName="/opt/logs/mobile/apolloitem/daijia"
                     filePattern="'.'yyyy-MM" Append="true" >
            <PatternLayout pattern="%-5p:%d:%c{1} [%x] - %m%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="16 MB"/>
            </Policies>
            <DefaultRolloverStrategy fileIndex="min" max="16"/>
        </RollingFile>

說明

  1. RollingFile代表新增加一個(gè)appender(輸出源),日志名稱是Daijia, fileName代表的則是 日志文件的輸出地點(diǎn),這里采用了絕對(duì)路徑,也可以采用相對(duì)路徑。

配置一個(gè)日志對(duì)象

        <logger name="com.meituan.apollo.item.filter.util.VListResultModelFilterUtil" level="info" additivity="false">
            <appender-ref ref="Daijia" />
        </logger>

在Root里面配置新的AppendRef

配置根日志

        <Root level="INFO">
            <AppenderRef ref="Console"/>
            #if($environment == 'online')
            <AppenderRef ref="Sentry"/>
            #end
            # <AppenderRef ref="Daijia"/>
        </Root>

說明

  1. Root里面都代表日志的根日志,所有其他的日志都集成來自Root,如果把一個(gè)Appender放到<Root>的根日志配置下面,則所有的log對(duì)象都會(huì)輸出到這些源頭。我們想單獨(dú)記錄記錄E代駕的日志,所以就不把代駕的輸出源放到根日志下面了.

3 配置log4j中應(yīng)該注意的地方(或者說遇到的坑)

1 log4j遷移的問題

1)問題

2015-11-02 17:38:02,742 ERROR Appenders contains an invalid element or attribute "appender"
2015-11-02 17:38:02,746 ERROR Unable to locate appender Daijia for logger
2015-11-02 17:38:02,746 ERROR Unable to locate appender Daijia for logger com.meituan.apollo.item.controller.IndexControlle

2)原因與解決辦法

appender這個(gè)標(biāo)簽在log4j.xml中是違法的,第一次出現(xiàn)這個(gè)問題的時(shí)候很納悶,因?yàn)檫@是從網(wǎng)上復(fù)制拷貝的配置語法。但是仔細(xì)深入發(fā)現(xiàn)之后,問題在于<appender>標(biāo)簽是屬于log4j 1的版本,升級(jí)到log4j2之后,不再支持原有<appender>標(biāo)簽。

log4j1的console輸出源

  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>
  </appender>

遷移到log4j2之后的語法配置就應(yīng)該是;

    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </Console>

同樣對(duì)于所有的輸出流式日志文件的<appender>標(biāo)簽同樣是這樣的配置語法。具體的log4j2遷移參考官網(wǎng):Migrating from Log4j 1.x

2 RollingFile必須加上參數(shù)大小的配置

1)問題

2015-11-02 18:28:06,742 ERROR A TriggeringPolicy must be provided
2015-11-02 18:28:06,743 ERROR Null object returned for RollingFile in Appenders.
2015-11-02 18:28:06,747 ERROR Unable to locate appender Daijia for logger com.meituan.apollo.item.filter.util.VListResultModelFilterUtil
2015-11-02 18:28:06,748 ERROR Unable to locate appender Daijia for logger

2)原因與解決辦法
出現(xiàn)這個(gè)問題是因?yàn)椴捎昧?code><RollingFile>是因?yàn)椋琑ollingFile的輸出流代表指定輸入到指定參數(shù)的文件之中,然后根據(jù)的指定的策略重新覆蓋日志文件。所以<RollingFile>必須配置 TriggeringPolicy(觸發(fā)策略) 和 RolloverStrategy(覆蓋策略)這兩個(gè)參數(shù),否則出錯(cuò)。這里采取的策略是根據(jù)日志大小進(jìn)行重新覆蓋SizeBasedTriggeringPolicy.并采用了默認(rèn)的覆蓋行為DefaultRolloverStrategy進(jìn)行重新覆蓋。

詳細(xì)的<RollingFile>的輸出流配置可以參考:log4j2中Appender的配置


參考資料鏈接:

  1. Log4j官網(wǎng): http://logging.apache.org/log4j/2.x/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在應(yīng)用程序中添加日志記錄總的來說基于三個(gè)目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 5,217評(píng)論 1 13
  • 在應(yīng)用程序中添加日志記錄總的來說基于三個(gè)目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 5,159評(píng)論 0 6
  • 一、Log4j簡(jiǎn)介 Log4j有三個(gè)主要的組件:Loggers(記錄器),Appenders (輸出源)和Layo...
    默默守護(hù)閱讀 1,979評(píng)論 2 8
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,273評(píng)論 6 342
  • #########################################################...
    BearFaraway閱讀 1,869評(píng)論 0 51

友情鏈接更多精彩內(nèi)容