1. 程式人生 > >Log4j2 配置

Log4j2 配置

config:

<?xml version="1.0" encoding="UTF-8"?>
<!-- http://logging.apache.org/log4j/2.x/manual/appenders.html -->
<!-- status 負責列印日記系統的 WARN 級別以及以上的日記 -->
<Configuration status="INFO">
    <Properties>
		<!-- springboot:logs or ${sys:jboss.server.log.dir} -->
        <Property name="logFilePath">logs</Property>
        <Property name="logFileName">ProjectName</Property>
        <Property name="logPattern">%d [%t] %-5level %logger{36} - %m%n%throwable</Property>
    </Properties>
    <Appenders>
        <!--很直白,Console指定了結果輸出到控制檯-->
        <Console name="ConsolePrint" target="SYSTEM_OUT" direct="true">
            <PatternLayout pattern="${logPattern}"/>
        </Console>
        <!--<File>輸出結果到指定檔案</File>-->
        <!--<RollingFile>同樣輸出結果到指定檔案,但是使用buffer,速度會快點</RollingFile>-->
        <!--filePattern:表示當日志到達指定的大小或者時間,產生新日誌時,舊日誌的命名路徑。-->
        <!--PatternLayout:和log4j一樣,指定輸出日誌的格式,append表示是否追加內容,值預設為true-->
        <!-- https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html-->
        <RollingFile name="RollingFileInfo" fileName="${logFilePath}/${logFileName}-info.log"
                     filePattern="${logFilePath}/$${date:yyyy-MM}/${logFileName}-%d{yyyy-MM-dd-HH-mm}-%i-info.log.gz">
            <PatternLayout pattern="${logPattern}"/>
            <!--注意,如果有多個ThresholdFilter,那麼Filters標籤是必須的-->
            <Filters>
                <!--首先需要過濾不符合的日誌級別,把不需要的首先DENY掉,然後在ACCEPT需要的日誌級別,次序不能顛倒-->
                <!--只輸出DEBUG級別以上的資訊-->
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="FATAL" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!-- RollingFile實現日誌檔案滾動更新,依賴於TriggeringPolicy[Policies]和RolloverStrategy[預設就是DefaultRolloverStrategy] -->
            <Policies>
                <!-- 下述3個TriggeringPolicy為觸發策略,其決定了何時觸發日誌檔案的rollover,即When -->
                <OnStartupTriggeringPolicy />
                <!--時間策略,每隔24小時產生新的日誌檔案-->
                <TimeBasedTriggeringPolicy/>
                <!--大小策略,每到指定size大小時產生新的日誌檔案-->
                <SizeBasedTriggeringPolicy size="1MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy指定了當觸發rollover時的預設策略 -->
            <!-- max引數指定了計數器的最大值。一旦計數器達到了最大值,過舊的檔案將被刪除。注意:不要認為max引數是需要保留的日誌檔案的最大數目 -->
            <!-- 即使在log4j2.xml中沒有顯式指明,也相當於為RollingFile配置下添加了如下語句。DefaultRolloverStrategy預設的max為7 -->
            <!-- max引數是與filePattern中的計數器%i配合起作用的,其具體作用方式與filePattern的配置密切相關-->
            <!-- 1.如果filePattern中僅含有date/time pattern,每次rollover時,將用當前的日期和時間替換檔案中的日期格式對檔案進行重新命名。max引數將不起作用。如,filePattern="%d{yyyy-MM-dd}.log"-->
            <!-- 2.如果filePattern中僅含有整數計數器(即%i),每次rollover時,檔案重新命名時的計數器將每次加1(初始值為1),若達到max的值,將刪除舊的檔案。如,filePattern="%i.log"-->
            <!-- 3.如果filePattern中既含有date/time pattern,又含有%i,每次rollover時,計數器將每次加1,若達到max的值,將刪除舊的檔案,直到data/time pattern不再符合,被替換為當前的日期和時間,計數器再從1開始。如,filePattern="%d{yyyy-MM-dd HH-mm}-%i.log"-->
            <DefaultRolloverStrategy max="10">
                <!-- 通過DeleteAction可以刪除任何檔案,而不僅僅像DefaultRolloverStrategy那樣,刪除最舊的檔案,所以使用的時候需要謹慎! -->
                <!-- basePath必填。目錄掃描開始路徑。-->
                <!-- maxDepth:掃描的最大目錄深度。0表示basePath指定的檔案自身。Integer.MAX_VALUE表示掃描所有的目錄層。預設值為1,表示僅掃描basePath下的檔案。-->
                <Delete basePath="${logFilePath}" maxDepth="2">
                    <!-- pathConditions:刪除檔案的過濾條件,滿足指定條件的檔案將會被刪除,可以指定一個或多個。 -->
                    <!-- 如果指定多個pathCondition,需要同時滿足。Conditions可以巢狀,當巢狀配置時,只有當滿足了外部的Condition時,才能對內部的condition進行判斷。如果Conditions不是巢狀的,會可能以任意順序進行判斷。-->
                    <!-- Conditions也可以通過使用IfAll,IfAny,IfNot等類似於AND,OR,NOT的condition,實現複雜的condition。-->
                    <!-- IfFileName-判斷檔案的檔名是否滿足正則表示式或glob表示式-->
                    <!-- IfLastModified-判斷檔案的修改時間是否早於指定的duration-->
                    <!-- IfAccumulatedFileCount-判斷在遍歷檔案樹的時候,檔案個數是否超過了指定值-->
                    <!-- IfAccumulatedFileSize-判斷在遍歷檔案樹的時候,檔案的總大小是否超過了指定值-->
                    <!-- IfAll-判斷巢狀的condition是否都滿足-->
                    <!-- IfAny-判斷巢狀的condition是否有一個滿足-->
                    <!-- IfNot-判斷巢狀的condition是否不滿足-->
                    <IfFileName glob="*/${logFileName}-*-info.log.gz">
                        <!-- Note: 這裡的age必須和filePattern協調, 後者是精確到HH, 這裡就要寫成xH, xd就不起作用
                    另外, 數字最好>2, 否則可能造成刪除的時候, 最近的檔案還處於被佔用狀態,導致刪除不成功!-->
                        -->
                        <IfLastModified age="2m">
                            <IfAny>
                                <IfAccumulatedFileSize exceeds="1MB" />
                                <IfAccumulatedFileCount exceeds="5" />
                            </IfAny>
                        </IfLastModified>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <Async name="ASYNC">
            <AppenderRef ref="RollingFileInfo"/>
            <AppenderRef ref="ConsolePrint"/>
        </Async>
    </Appenders>
    <Loggers>
        <!-- additivity=false:表示只用當前logger的appender-ref。 -->
        <Logger name="debug的package 名稱" level="debug" additivity="false">
            <AppenderRef ref="ASYNC" />
        </Logger>
        <Root level="info" includeLocation="true">
            <AppenderRef ref="ASYNC" />
        </Root>
    </Loggers>
</Configuration>