1. 程式人生 > 其它 >Springboot log4j2總結

Springboot log4j2總結

Log4j2

PS: Log4j 已不再維護,而最新的是Log4j2, Log4j2 是全部重寫了Log4j,並擁有更加優秀的效能

1. 引入依賴,和去掉logging的依賴

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<!-- log4j2 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-log4j2</artifactId>
		</dependency>

2. 在resources 下增加檔案log4j2.xml,預設會讀取這個命名的檔案(名字也可以改,但沒啥意義,預設就行)

Log4j2.xml 解釋版

<?xml version="1.0" encoding="UTF-8"?>
<!--
    status : 這個用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,會看到log4j2內部各種詳細輸出
    monitorInterval : Log4j能夠自動檢測修改配置檔案和重新配置本身, 設定間隔秒數。
-->
<Configuration status="WARN" monitorInterval="60">
  <Properties>
    <!-- 配置日誌檔案輸出目錄 -->
    <Property name="LOG_HOME">./logs</Property>

    <!-- 格式化輸出:%date表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度 %msg:日誌訊息,%n是換行符-->
    <!-- %logger{36} 表示 Logger 名字最長36個字元 -->
<!--    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />-->

    <!-- 這個多打印出了日期,執行的函式名及行號 -->
    <property name="LOG_PATTERN" value="%d|%t|%X{uid}|%-5level|%c.%M:%L|%m%n" />
  </Properties>

  <Appenders>

    <!-- 控制檯輸出配置 -->
    <Console name="Console" target="SYSTEM_OUT">
      <!-- 控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch) -->
      <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
      <!--輸出日誌的格式-->
      <PatternLayout pattern="${LOG_PATTERN}"/>
    </Console>

    <!-- FileAppender。servlet容器中的兩個web應用程式
        可以擁有它們各自的配置,如果Log4j2位於它們共同使用
        的類載入器中,則可以安全地將日誌寫入同一個檔案。預設
         啟用bufferedIO以及immediateFlush(前者提高效能,後
         者可以保證寫入,緩衝區沒滿也寫入!每次寫操作都會調
         用flush,不過有點影響效能),如果是非同步Logger,即便
         immediateFlush設定為false,非同步Logger和appender也
         將在一批事件結束時自動flush,這樣做比較高效同時
         保證了資料寫入磁碟 -->
    <!--檔案會打印出所有資訊,這個log每次執行程式會自動清空,由append屬性決定,適合臨時測試用-->
    <File name="Debug" fileName="${LOG_HOME}/debug.log" append="false">
      <PatternLayout pattern="${LOG_PATTERN}"/>
    </File>

    <!-- 似乎可以看作是FileAppender的進化版,實現上不大
        一樣,根據報導,相比啟用了bufferedIO的FileAppender
        效能提高了20-200%(RandomAccessFile沒有bufferedIO
        這個選項,因為它總是buffered的!) -->
    <RollingRandomAccessFile name="Error" immediateFlush="true" bufferSize="4096" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error.log.%d{yyyy-MM-dd}.gz" ignoreExceptions="false">
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <Filters>
        <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
      <!-- 這個的預設是一小時觸發一次 -->
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2">
          <IfFileName glob="error.log.*.gz"/>
          <IfLastModified age="30d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>

    <RollingRandomAccessFile name="System" immediateFlush="true" bufferSize="4096"
                             fileName="${LOG_HOME}/system.log"
                             filePattern="${LOG_HOME}/system.log.%d{yyyy-MM-dd}.gz"
                             ignoreExceptions="false">
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <Filters>
        <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
      <!-- 表示兩天觸發一次策略 -->
      <Policies>
        <CronTriggeringPolicy schedule="0 0 2 * * ?" evaluateOnStartup="true"/>
      </Policies>

      <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2" followLinks="true">
          <IfFileName glob="system.log.*.gz"/>
          <IfLastModified age="7d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>

  </Appenders>

  <!--Logger節點用來單獨指定日誌的形式,比如要為指定包下的class指定不同的日誌級別等。-->
  <!-- 定義logger,只有定義了logger 並引入appender,appender才會生效 -->
  <Loggers>
    <!--若是additivity設為false,則子Logger 只會在自己的appender裡輸出,而不會在 父Logger 的appender裡輸出。-->
    <!--過濾掉mybatis的一些無用的DEBUG資訊-->
    <Logger name="org.mybatis" level="info" additivity="false">
      <AppenderRef ref="Console"/>
    </Logger>

    <!--過濾掉spring的一些無用的DEBUG資訊-->
    <Logger name="org.springframework" level="info" additivity="false">
      <AppenderRef ref="Console"/>
    </Logger>

    <Logger name="org.hibernate.validator" level="info" additivity="false">
      <AppenderRef ref="Console"/>
    </Logger>

    <!-- Root節點用來指定專案的根日誌,如果沒有單獨指定Logger,那麼就會預設使用該Root日誌輸出 -->
    <!-- 建立一個預設的root的logger -->
    <Root level="trace" includeLocation="true">
      <AppenderRef ref="Console"/>
      <AppenderRef ref="Error" />
      <AppenderRef ref="System" />
      <AppenderRef ref="Debug" />
    </Root>
  </Loggers>
</Configuration>