log4j2切換

本文章轉自:https://blog.csdn.net/vbirdbest/article/details/71751835

                  :https://www.cnblogs.com/new-life/p/9246143.html

再次感謝博主分享

1、刪除之前log4j的jar包

2、引入log4j2的jar包

      <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-api</artifactId>
          <version>2.9.1</version>
      </dependency>
      <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-core</artifactId>
          <version>2.9.1</version>
      </dependency>
      <!--用於與slf4j保持橋接-->
      <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-slf4j-impl</artifactId>
          <version>2.9.1</version>
      </dependency>
      <!-- slf4j核心包-->
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.25</version>
      </dependency>

3、配置文件的位置:log4j2默認會在classpath目錄下尋找log4j2.xml、log4j.json;一般放置在src/main/resources根目錄下即可;

4、log4j2.xml文件配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" monitorInterval="30">
    <properties>
        <property name="APP_NAME" value="serviceA"/>
        <property name="log_path" value="/home/logs/${APP_NAME}"/>
        <property name="MAXHISTORY" value="365"/>
        <property name="PATTERN"
                  value="[${APP_NAME}] [%-12(%d{yyyy-MM-dd HH:mm:ss.SSS})] [%-5level] [%thread] [%c.%M] [%L] [%X{X-B3-TraceId:-}] [%X{X-B3-SpanId:-}] ==>> %m%n"/>
    </properties>
    <!--先定義所有的appender-->
    <appenders>
        <!--這個輸出控制檯的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--輸出日誌的格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>
        <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->
        <File name="log" fileName="${log_path}/${APP_NAME}.log" append="false" filePermissions="rw-r--rw-">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>
        <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
        <RollingFile name="RollingFileInfo" fileName="${log_path}/${APP_NAME}-info.log"
                     filePattern="${log_path}/$${date:yyyy-MM}/info-${APP_NAME}-%d{yyyy-MM-dd}-%i.log" filePermissions="rw-r--rw-">
            <!--控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="RollingFileWarn" fileName="${log_path}/${APP_NAME}-warn.log"
                     filePattern="${log_path}/$${date:yyyy-MM}/warn-${APP_NAME}-%d{yyyy-MM-dd}-%i.log" filePermissions="rw-r--rw-">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下7個文件,這裏設置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <RollingFile name="RollingFileError" fileName="${log_path}/${APP_NAME}-error.log"
                     filePattern="${log_path}/$${date:yyyy-MM}/error-${APP_NAME}-%d{yyyy-MM-dd}-%i.log" filePermissions="rw-r--rw-">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <!--然後定義logger,只有定義了logger並引入的appender,appender纔會生效-->
    <loggers>
        <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="log"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
</configuration>

5、配置文件詳解:

Configuration:爲根節點,有status和monitorInterval等多個屬性

status的值有 “trace”, “debug”, “info”, “warn”, “error” and “fatal”,用於控制log4j2日誌框架本身的日誌級別,如果將stratus設置爲較低的級別就會看到很多關於log4j2本身的日誌,如加載log4j2配置文件的路徑等信息
monitorInterval,含義是每隔多少秒重新讀取配置文件,可以不重啓應用的情況下修改配置
Appenders:輸出源,用於定義日誌輸出的地方
log4j2支持的輸出源有很多,有控制檯Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等

Console:控制檯輸出源是將日誌打印到控制檯上,開發的時候一般都會配置,以便調試

File:文件輸出源,用於將日誌寫入到指定的文件,需要配置輸入到哪個位置(例如:D:/logs/mylog.log)

RollingRandomAccessFile: 該輸出源也是寫入到文件,不同的是比File更加強大,可以指定當文件達到一定大小(如20MB)時,另起一個文件繼續寫入日誌,另起一個文件就涉及到新文件的名字命名規則,因此需要配置文件命名規則
這種方式更加實用,因爲你不可能一直往一個文件中寫,如果一直寫,文件過大,打開就會卡死,也不便於查找日誌。

fileName 指定當前日誌文件的位置和文件名稱
filePattern 指定當發生Rolling時,文件的轉移和重命名規則
SizeBasedTriggeringPolicy 指定當文件體積大於size指定的值時,觸發Rolling
DefaultRolloverStrategy 指定最多保存的文件個數
TimeBasedTriggeringPolicy 這個配置需要和filePattern結合使用,注意filePattern中配置的文件重命名規則是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的時間粒度是mm,即分鐘
TimeBasedTriggeringPolicy指定的size是1,結合起來就是每1分鐘生成一個新文件。如果改成%d{yyyy-MM-dd HH},最小粒度爲小時,則每一個小時生成一個文件
NoSql:MongoDb, 輸出到MongDb數據庫中

Flume:輸出到Apache Flume(Flume是Cloudera提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統,Flume支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。)

Async:異步,需要通過AppenderRef來指定要對哪種輸出源進行異步(一般用於配置RollingRandomAccessFile)

PatternLayout:控制檯或文件輸出源(Console、File、RollingRandomAccessFile)都必須包含一個PatternLayout節點,用於指定輸出文件的格式(如 日誌輸出的時間 文件 方法 行數 等格式),例如 pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"

  %d{HH:mm:ss.SSS} 表示輸出到毫秒的時間
  %t 輸出當前線程名稱
  %-5level 輸出日誌級別,-5表示左對齊並且固定輸出5個字符,如果不足在右邊補0
  %logger 輸出logger名稱,因爲Root Logger沒有名稱,所以沒有輸出
  %msg 日誌文本
  %n 換行

  其他常用的佔位符有:
  %F 輸出所在的類文件名,如Log4j2Test.java
  %L 輸出行號
  %M 輸出所在方法名
  %l 輸出語句所在的行數, 包括類名、方法名、文件名、行數
Loggers:日誌器
日誌器分根日誌器Root和自定義日誌器,當根據日誌名字獲取不到指定的日誌器時就使用Root作爲默認的日誌器,自定義時需要指定每個Logger的名稱name(對於命名可以以包名作爲日誌的名字,不同的包配置不同的級別等),日誌級別level,相加性additivity(是否繼承下面配置的日誌器), 對於一般的日誌器(如Console、File、RollingRandomAccessFile)一般需要配置一個或多個輸出源AppenderRef;

每個logger可以指定一個level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定時level默認爲ERROR

additivity指定是否同時輸出log到父類的appender,缺省爲true。

<Logger name="rollingRandomAccessFileLogger" level="trace" additivity="true">  
    <AppenderRef ref="RollingRandomAccessFile" />  
</Logger>
properties: 屬性
使用來定義常量,以便在其他配置的時候引用,該配置是可選的,例如定義日誌的存放位置
D:/logs

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