Log4j2簡單配置

log4j官網:http://logging.apache.org/log4j/2.x/manual/appenders.html

熟讀官網內容的請忽視本文,記錄英文小白的摸索過程

-------起因

新接手的項目原來是log4j的,線上日誌登上去不是很好,分類的不夠好,而且相對於xml的格式,properties的配置一直覺得不夠直觀

這次就想直接替換成log4j2了,而且簡單瞭解了一下log4j2的性能相比較log4j和logback更加好


--------

用過logback的小夥伴們,對應log4j2的配置一定不會感到特別陌生,只是部分標籤和格式不一樣,大體的結構是一樣的


<?xml version="1.0" encoding="GBK" ?>
<Configuration>
    <!-- 輸出日誌到控制檯  ConsoleAppender -->
    <Properties>
        <!--申明全局別名,下面可以直接使用-->
        <Property name="APP_Name">myproject</Property>
        <Property name="log.dir">/data/logs/apps/myproject</Property>
    </Properties>

    <!-- 輸出日誌到文件  每天一個文件 -->
    <Appenders>
        <!-- fileName:申明當前輸出文件的目錄和文件名 -->
        <!-- filePattern:申明當使用歸檔策略的時候,生成的文件應該放到哪些目錄下且名字格式如何 -->
        <RollingFile name="FILE_INFO" fileName="${log.dir}/info-${APP_Name}.log"
         filePattern="${log.dir}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log">
            <!-- 當使用組合過濾器的時候,onMatch/onMismatch=NEUTRAL的時候 日誌消息會繼續往後面流轉-->
            <Filters>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <!--歸檔策略,當滿足歸檔條件,則自動歸檔。TimeBasedTriggeringPolicy基於時間條件歸檔,SizeBasedTriggeringPolicy基於文件大小歸檔-->
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="FILE_DEBUG" fileName="${log.dir}/debug-${APP_Name}.log"
                                 filePattern="${log.dir}/%d{yyyy-MM-dd}/debug-%d{yyyy-MM-dd}-%i.log">
            <!-- 當使用組合過濾器的時候,onMatch/onMismatch=NEUTRAL的時候 日誌消息會繼續往後面流轉-->
            <Filters>
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="FILE_ERROR" fileName="${log.dir}/error-${APP_Name}.log"
                                 filePattern="${log.dir}/%d{yyyy-MM-dd}/error-%d{yyyy-MM-dd}-%i.log">
            <!-- 當使用組合過濾器的時候,onMatch/onMismatch=NEUTRAL的時候 日誌消息會繼續往後面流轉-->
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="FILE_WARN" fileName="${log.dir}/warn-${APP_Name}.log"
                                 filePattern="${log.dir}/%d{yyyy-MM-dd}/warn-%d{yyyy-MM-dd}-%i.log">
            <!-- 當使用組合過濾器的時候,onMatch/onMismatch=NEUTRAL的時候 日誌消息會繼續往後面流轉-->
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="MONITOR" fileName="${log.dir}/monitor-${APP_Name}.log"
                     filePattern="${log.dir}/%d{yyyy-MM-dd}/monitor-%d{yyyy-MM-dd}-%i.log">
            <!-- 當使用組合過濾器的時候,onMatch/onMismatch=NEUTRAL的時候 日誌消息會繼續往後面流轉-->
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
    </Appenders>

    <!--
        控制某包下面的日誌輸出級別,只有大於等於這個級別纔會輸出
     -->
    <Loggers>
        <Logger name="com.ibatis" level="DEBUG"/>
        <Logger name="java.sql" level="DEBUG"/>
        <Logger name="org.springframework" level="WARN"/>
        <Logger name="org.apache.velocity" level="WARN"/>
        <Logger name="org.apache.http" level="WARN"/>
        <Logger name="net.sf" level="WARN"/>
        <Logger name="org.displaytag" level="ERROR"/>
        <Logger name="org.apache.commons" level="WARN"/>
        <Logger name="org.apache.struts" level="WARN"/>
        <Logger name="RocketmqClient" level="ERROR"/>
        <Logger name="httpclient.wire" level="ERROR"/>
        <!--申明一個特殊的日誌,輸出到某個文件裏面去-->
        <Logger name="monitor" level="DEBUG" >
            <AppenderRef ref="MONITOR"/>
        </Logger>

        <Root level="DEBUG">
            <AppenderRef ref="FILE_INFO"/>
            <AppenderRef ref="FILE_WARN"/>
            <AppenderRef ref="FILE_ERROR"/>
            <AppenderRef ref="FILE_DEBUG"/>
        </Root>
    </Loggers>

</Configuration>

web.xml的配置

	<context-param>
		<param-name>log4jContextName</param-name>
		<param-value>myproject</param-value>
	</context-param>
	<context-param>
		<param-name>log4jConfiguration</param-name>
		<param-value>classpath:log4j2.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>



對於monitor log的申明是這樣的

private static final Logger monitorLog = LoggerFactory.getLogger("monitor");

這樣通過這個log記錄的日誌都會到monitor這個日誌文件裏面去了,還是很靈活的,這個功能logback也提供了。

--------Filters

這裏着重說一下Filters 

我這裏是用的ThresholdFilter,因爲之前還用過logback的xml配置,那邊的level指定了DEBUG就輸出DEBUG,而LOG4J2不太一樣

http://logging.apache.org/log4j/2.x/manual/filters.html#ThresholdFilter

Threshold Filter Parameters這個裏面對於level定義其實不夠準確,可能也因爲前文已經說到了,這裏也只是簡單的定義了一下。

重點在前文說明上:

This filter returns the onMatch result if the level in the LogEvent is the same or more specific than the configured level and the onMismatch value otherwise

過濾器會篩選 如果日誌級別大於等於配置的級別的,則返回onMatch的值,否則返回OnMismath的值

所以滿足級別要求的,也可以不輸出,把onMatch配置成DENY就行。


說一下onMatch和onMishmatch的三個值:

Accept     通過 :輸出日誌並阻止日誌往下個過濾器流轉

Deny        拒絕  :不輸出日誌並阻止日誌往下個過濾器流轉

Neutral     中立  :不輸出日誌,日誌往下個過濾器流轉, 直到最後一個過濾器



因爲過濾器的級別定義的特性,如果要配置一個只輸出INFO級別日誌的文件,過濾器如下:

<Filters>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>


--------Policy

着重說一下 TimeBasedTriggeringPolicy

interval,指定歸檔日誌時間間隔,具體單位以日誌的文件名最後一個單位爲標準,比如  yyyy-MM-dd,則以天爲單位

modulate,boolean型,說明是否對封存時間進行調製。若modulate=true,則封存時間將以0點爲邊界進行偏移計算。比如,modulate=true,interval=4hours,那麼假設上次封存日誌的時間爲03:00,則下次封存日誌的時間爲04:00,之後的封存時間依次爲08:00,12:00,16:00,。。。


--------Appender

今天配好之後,error、warn、info、debug級別的日誌輸出都沒有問題,但是原來catalina.out文件輸出的內容只有啓動時候的,之後具體運行時候的都沒有記錄了。

還是吃了沒文化的虧,之前沒有自己從頭到尾的配置過日誌。

跟手上其他的項目比較之後,發現有一個ConsoleAppender沒有配置導致的,這個是輸出控制檯日誌的,配置了這個之後catalina.out就會包含所有的日誌了,但是需要注意catalina.out文件過大的問題

<Console name="STDOUT" >
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n"/>
        </Console>



--------附加相關網址

配置按照分鐘歸檔 http://blog.csdn.net/zhang168/article/details/46814489

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