1. 程式人生 > 實用技巧 >【log4j2】springboot使用log4j2詳細配置

【log4j2】springboot使用log4j2詳細配置

本文主要講解:

1、一個日誌配置檔案如何拆分

2、不同服務的日誌如何劃分

3、日誌如何滾動

4、日誌過期策略

5、非同步日誌

1、日誌拆分

日誌配置檔案拆分,例如以下完整的日誌配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="DEBUG">

    <properties>
        <!--日誌格式-->
        <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %X{TRACE_ID} [%thread] %-5level %logger[%L] - %m%n"
/> <!--日誌編碼--> <property name="CHARSET" value="utf-8"/> <!--單個日誌檔案大小--> <property name="MAX_FILE_SIZE" value="200MB"/> <!--日誌儲存時間--> <property name="MAX_HISTORY" value="P30D"/> <!--日誌根路徑--> <
property name="BASE_LOG_PATH" value="/data/logs"/> <!--日誌應用名,例如拼接完整的日誌路徑:/data/logs/app/app-info.log--> <property name="SERVER_NAME" value="${sys:SERVICE_NAME}"/> </properties> <appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <
PatternLayout pattern="${PATTERN}" charset="${CHARSET}"/> </Console> <RollingRandomAccessFile name="FILE-INFO" fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.log" filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.%d{yyyy-MM-dd}-%i.log.gz"> <LevelRangeFilter minLevel="WARN" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${PATTERN}" charset="${CHARSET}"/> <Policies> <!--每天滾動一次--> <TimeBasedTriggeringPolicy interval="1"/> <!--或者日誌達到10KB 滾動一次--> <SizeBasedTriggeringPolicy size="10KB"/> </Policies> <!--日誌刪除策略--> <DefaultRolloverStrategy fileIndex="nomax"> <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2"> <IfFileName glob="*-info.*.log.gz"/> <IfLastModified age="P1D"/> </Delete> </DefaultRolloverStrategy> </RollingRandomAccessFile> <RollingRandomAccessFile name="FILE-ERROR" fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-error.log" filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-error.%d{yyyy-MM-dd}-%i.log.gz"> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${PATTERN}" charset="${CHARSET}"/> <Policies> <!--每天滾動一次--> <TimeBasedTriggeringPolicy interval="1"/> <!--或者日誌達到10KB 滾動一次--> <SizeBasedTriggeringPolicy size="10KB"/> </Policies> <!--日誌刪除策略--> <DefaultRolloverStrategy fileIndex="nomax"> <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2"> <IfFileName glob="*-error.*.log.gz"/> <IfLastModified age="P1D"/> </Delete> </DefaultRolloverStrategy> </RollingRandomAccessFile> </appenders> <loggers> <AsyncRoot level="DEBUG" includeLocation="true" > <AppenderRef ref="CONSOLE"/> </AsyncRoot> <AsyncLogger name="com.luna" level="INFO" includeLocation="true" > <appender-ref ref="FILE-INFO"/> <appender-ref ref="FILE-ERROR"/> </AsyncLogger> <AsyncLogger name="druid.sql.Statement" level="DEBUG" additivity="false" includeLocation="true" > <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE-INFO"/> </AsyncLogger> </loggers> </configuration>

在單個專案中這個配置檔案可以直接使用,但是在聚合專案中,我們不可能在每個專案都寫一遍完整的日誌配置檔案。如果這樣做,1,容易寫錯造成日誌格式的不統一、2,假如你更改了日誌配置,需要更改多個配置檔案容易遺漏

所以我們常規做法是將這些公共的配置抽取出來,然後直接引用即可。log4j2的日誌拆分和其它日誌拆分基本差不多(logback,log4j),官方文件:http://logging.apache.org/log4j/2.x/manual/configuration.html#XInclude

從官方文件看出,log4j2的拆分,依賴XInclude

新建log4j-xinclude-property.xml,抽取Properties

<?xml version="1.0" encoding="UTF-8"?>

<properties>
    <!--日誌格式-->
    <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %X{TRACE_ID} [%thread] %-5level %logger[%L] - %m%n"/>
    <!--日誌編碼-->
    <property name="CHARSET" value="utf-8"/>
    <!--單個日誌檔案大小-->
    <property name="MAX_FILE_SIZE" value="200MB"/>
    <!--日誌儲存時間-->
    <property name="MAX_HISTORY" value="P30D"/>
    <!--日誌根路徑-->
    <property name="BASE_LOG_PATH" value="/data/logs"/>
    <!--日誌應用名,例如/data/logs/app/app-info.log-->
    <property name="SERVER_NAME" value="${sys:SERVICE_NAME}"/>
</properties>

新建log4j-xinclude-appenders.xml,抽取appenders

<?xml version="1.0" encoding="UTF-8"?>

<appenders>
    <Console name="CONSOLE" target="SYSTEM_OUT">
        <PatternLayout pattern="${PATTERN}" charset="${CHARSET}"/>
    </Console>

    <RollingRandomAccessFile name="FILE-INFO"
                             fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.log"
                             filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.%d{yyyy-MM-dd}-%i.log.gz">
        <LevelRangeFilter minLevel="WARN" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
        <PatternLayout pattern="${PATTERN}" charset="${CHARSET}" />
        <Policies>
            <!--每天滾動一次-->
            <TimeBasedTriggeringPolicy interval="1"/>
            <!--或者日誌達到10KB 滾動一次-->
            <SizeBasedTriggeringPolicy size="10KB"/>
        </Policies>
        <!--日誌刪除策略-->
        <DefaultRolloverStrategy fileIndex="nomax">
            <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2">
                <IfFileName glob="*-info.*.log.gz"/>
                <IfLastModified age="P1D"/>
            </Delete>
        </DefaultRolloverStrategy>
    </RollingRandomAccessFile>

    <RollingRandomAccessFile name="FILE-ERROR"
                             fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-error.log"
                             filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-error.%d{yyyy-MM-dd}-%i.log.gz">
        <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        <PatternLayout pattern="${PATTERN}" charset="${CHARSET}" />
        <Policies>
            <!--每天滾動一次-->
            <TimeBasedTriggeringPolicy interval="1"/>
            <!--或者日誌達到10KB 滾動一次-->
            <SizeBasedTriggeringPolicy size="10KB"/>
        </Policies>
        <!--日誌刪除策略-->
        <DefaultRolloverStrategy fileIndex="nomax">
            <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2">
                <IfFileName glob="*-error.*.log.gz"/>
                <IfLastModified age="P1D"/>
            </Delete>
        </DefaultRolloverStrategy>
    </RollingRandomAccessFile>

</appenders>

新建log4j-xinclude-loggers.xml,抽取loggers

<?xml version="1.0" encoding="UTF-8"?>

<loggers>

    <AsyncRoot level="DEBUG" includeLocation="true" >
        <AppenderRef ref="CONSOLE"/>
    </AsyncRoot>


    <AsyncLogger name="com.luna" level="INFO" includeLocation="true" >
        <appender-ref ref="FILE-INFO"/>
        <appender-ref ref="FILE-ERROR"/>
    </AsyncLogger>

    <AsyncLogger name="druid.sql.Statement" level="DEBUG" additivity="false" includeLocation="true" >
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE-INFO"/>
    </AsyncLogger>

</loggers>

最後新建log4j2.xml引用即可

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xi="http://www.w3.org/2001/XInclude"
               status="DEBUG" name="XIncludeDemo">

    <!--常量配置-->
    <xi:include href="log4j-xinclude-property.xml"/>
    <!--appenders-->
    <xi:include href="log4j-xinclude-appenders.xml" />
    <!--loggers-->
    <xi:include href="log4j-xinclude-loggers.xml" />


</configuration>

完整的配置截圖

2、