Springcloud學習筆記38--springboot整合日誌框架log4j2
阿新 • • 發佈:2021-11-30
1.log4j2概述
常用的日誌框架:
- Log4j:Apache的一個開源專案,可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件等,可以控制每一條日誌的輸出格式,這些可以通過一個配置檔案來靈活地進行配置,而不需要修改應用的程式碼。雖然已經停止維護了,但目前絕大部分企業都是用的log4j。
- LogBack:是Log4j的一個改良版本
- Log4j2:Log4j2已經不僅僅是Log4j的一個升級版本了,它從頭到尾都被重寫了
log4j2 在目前JAVA中的日誌框架裡,非同步日誌的效能是最高的,沒有之一。
2. log4j2的日誌引入
springboot 專案結構:
首先引入依賴,然後新增日子的配置檔案,最後將配置檔案引入到yml檔案中生效。後就可以在專案中使用lombok的外掛直接在類上註解即可使用。
2.1pom.xml中引入依賴
web依賴中排除掉logging依賴,並且引入log4j2依賴。不只是starter-web中有logging jar包,如redis,mybatis中也有這個jar包,需要將他們也清除,否則依然會報錯!
<!--Lombok能通過註解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString方法--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.6.RELEASE</version> <!--排除掉logging,不使用logback,改用log4j2--> <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> <!--log4j2依賴disruptor--> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.2</version> </dependency>
2.2 log4j2.xml配置檔案
部分引數說明:
(1)%c
(2)%d
(3)%m
%m表示輸出所有message訊息
(4)%n
%n 為換行符
(5)%t
(6)%L
配置檔案案例:
<?xml version="1.0" encoding="UTF-8"?> <configuration status="WARN" monitorInterval="600"> <Properties> <property name="LOG_HOME" value="${sys:user.home}/logs"/> <property name="APP_CODE" value="file_log"/> <property name="LOG_LEVEL_PATTERN" value="%-5p"/> <property name="INSTANCE_INFO_PATTERN" value="${homeName}:${sys:user.name}"/> <property name="CODE_INFO_PATTERN" value="%pid:%F:%L"/> <property name="LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/> <property name="METRIC_LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/> <property name="APP_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID} | %t | ${CODE_INFO_PATTERN} | [%X{seq}] -%m%n"/> <property name="METRIC_LOG_PATTERN" value="%d{${METRIC_LOG_DATEFORMAT_PATTERN}}%m%n"/> <property name="LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | %X{TRACE_ID} | ${LOG_LEVEL_PATTERN} | ${INSTANCE_INFO_PATTERN} | ${CODE_INFO_PATTERN} | [%X{seq}] -%m%n"/> <property name="ALERT_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} $${ctx:traceId:-} | ${INSTANCE_INFO_PATTERN} | [%X{seq}] -%m%n"/> </Properties> <!--先定義所有的appender--> <appenders> <!--這個輸出控制檯的配置--> <console name="Console" target="SYSTEM_OUT" follow="true"> <!--輸出日誌的格式,--> <PatternLayout pattern="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %t | %c:%L | [%X{seq}] -%m%n"/> </console> <!-- 這個會打印出所有的info及以下級別的資訊,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔--> <RollingFile name="EventLogFile" fileName="${LOG_HOME}/event.log" immediateFlush="true" filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i"> <PatternLayout> <Pattern>${LOG_PATTERN}</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy internal="1" modulate="true"/> <SizeBasedTriggeringPolicy size="50 MB"/> </Policies> <!--保留最近30天的日誌--> <DefaultRolloverStrategy> <Delete basePath="${LOG_HOME}" maxDepth="2"> <IfFileName glob="*/app.log.*"/> <IfLastModified age="30d"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="AppLogFile" fileName="${LOG_HOME}/app.log" immediateFlush="true" filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i"> <PatternLayout> <Pattern>${APP_LOG_PATTERN}</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy internal="1" modulate="true"/> <SizeBasedTriggeringPolicy size="50 MB"/> </Policies> <!--保留最近30天的日誌--> <DefaultRolloverStrategy> <Delete basePath="${LOG_HOME}" maxDepth="2"> <IfFileName glob="*/app.log.*"/> <IfLastModified age="30d"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="AlertLogFile" fileName="${LOG_HOME}/alert.log" immediateFlush="true" filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i"> <PatternLayout> <Pattern>${ALERT_LOG_PATTERN}</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy internal="1" modulate="true"/> <SizeBasedTriggeringPolicy size="50 MB"/> </Policies> </RollingFile> <RollingFile name="ErrorLogFile" fileName="${LOG_HOME}/error.log" immediateFlush="true" filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i"> <PatternLayout> <Pattern>${LOG_PATTERN}</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy internal="1" modulate="true"/> <SizeBasedTriggeringPolicy size="50 MB"/> </Policies> </RollingFile> <RollingFile name="FlepMetricLogFile" fileName="${LOG_HOME}/metric.log" immediateFlush="true" filePattern="${LOG_HOME}/%d{yyyyMMdd}/metric.log.%i"> <PatternLayout> <Pattern>${METRIC_LOG_PATTERN}</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy internal="1" modulate="true"/> <SizeBasedTriggeringPolicy size="50 MB"/> </Policies> </RollingFile> </appenders> <!--然後定義logger,只有定義了logger並引入的appender,appender才會生效--> <loggers> <Root level="INFO"> <AppenderRef ref="Console" /> <AppenderRef ref="AppLogFile" /> <AppenderRef ref="AlertLogFile"/> <AppenderRef ref="ErrorLogFile"/> </Root> <AsyncLogger name="event" level="ALL" additivity="false"> <AppenderRef ref="EventLogFile"/> </AsyncLogger> <logger name="org.apache" level="warn"/> <logger name="org.springframework" level="warn"/> <logger name="com.netflix" level="warn"/> <logger name="springfox" level="warn"/> </loggers> </configuration>
下面針對配置檔案進行圖文說明:
注意:user.home的屬性值可以用以下方法檢視,本機預設為C:\Users\14032
public static void main(String[] args) { System.out.println(System.getProperty("user.home")); }
2.3在application.yml檔案中引入配置檔案,正式生效日誌的配置
logging:
config: classpath:log4j2-dev.xml
2.4在專案中使用log4j2 DEMO
如果不想每次都寫private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用註解@Slf4j,這個註解需要引入lombok的jar包依賴。已新增到pom中
參考文獻:
https://zhanglf.blog.csdn.net/article/details/88909106
https://blog.csdn.net/u010663021/article/details/108388817
https://www.jianshu.com/p/d13c2e50a89c