目錄
前言
此篇文章基於xml文件形式進行整合,後續會另推出以boot/cloud爲微服務架構下基於log4j2整合
說到log4j2肯定會有log4j,log4j2就是log4j的替代者,log4j目前已經停止更新,微服務架構下日誌首選爲ELK,然而ELK略耗資源,由此很多企業都採用logBack或者log4j2+slf4j,
核心依賴添加
SpringBoot默認攜帶自身的log日誌功能,需要去調默認配置方能生效
<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>
<dependency> <!-- 引入log4j2依賴 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
log4j2核心配置(基於xml形式)
log4j2-spring.xml核心配置標籤概述以及描述都有寫
<?xml version="1.0" encoding="UTF-8" ?>
<!--Configuration後面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數-->
<configuration monitorInterval="5">
<!--日誌級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--變量配置-->
<Properties>
<!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度 %msg:日誌消息,%n是換行符-->
<!-- %logger{36} 表示 Logger 名字最長36個字符
%date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %l - %msg%n
-->
<property name="LOG_PATTERN" value="%date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %l -%M - %msg%n"/>
<!-- 定義日誌存儲的路徑 -->
<property name="FILE_PATH" value="D:\logs"/>
</Properties>
<appenders>
<!--控制檯日誌輸出-->
<console name="Console" target="SYSTEM_OUT">
<!--運行日誌輸入文件-->
<!--<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>-->
<!--日誌的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制檯只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<!--控制檯輸出日誌格式-->
<!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
</console>
<AsyncRoot level="info" includeLocation="true">
<AppenderRef ref="Console"/>
<appender-ref ref="infoJournal"/>
<appender-ref ref="debugJournal"/>
</AsyncRoot>
<!--
debug 運行時異常日誌信息
-->
<RollingFile name="debugJournal" fileName="${FILE_PATH}/堆棧日誌.log"
filePattern="D://logs/$${date:yyyy-MM-dd}/debug-%d{yyyy-MM-dd}-%i.log">
<!--文件只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日誌消息輸出格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--日誌拆分規則-->
<Policies>
<!--在系統啓動時,生成一個新的日誌文件-->
<OnStartupTriggeringPolicy/>
<!--interval屬性用來指定多久滾動一次,默認是1 hour-->
<TimeBasedTriggeringPolicy interval="0.001"/>
<SizeBasedTriggeringPolicy size="10 Kb"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下10個文件開始覆蓋-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
<RollingFile name="infoJournal" fileName="${FILE_PATH}/運行日誌.log"
filePattern="D://logs/$${date:yyyy-MM-dd}/run-%d{yyyy-MM-dd}-%i.log">
<!--文件只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日誌消息輸出格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--日誌拆分規則-->
<Policies>
<!--在系統啓動時,生成一個新的日誌文件-->
<OnStartupTriggeringPolicy/>
<!--interval屬性用來指定多久滾動一次,默認是1 hour-->
<TimeBasedTriggeringPolicy interval="0.001"/>
<SizeBasedTriggeringPolicy size="10 KB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下10個文件開始覆蓋-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</appenders>
<!--Logger節點用來單獨指定日誌的形式,比如要爲指定包下的class指定不同的日誌級別等。-->
<!--然後定義loggers,只有定義了logger並引入的appender,appender纔會生效-->
<loggers>
<!--過濾掉spring和mybatis的一些無用的信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--監控系統信息-->
<!--若是additivity設爲false,則 子Logger 只會在自己的appender裏輸出,而不會在 父Logger 的appender裏輸出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="infoJournal"/>
<appender-ref ref="debugJournal"/>
</root>
</loggers>
</configuration>
引用log4j2日誌規則文件
SpringBoot下有yml簡化寫法和properties全名寫法
我用的是yml,由此是下面這種格式,你們用時直接修改配置文件爲application.yml爲後綴即可
logging:
config: classpath:log4j2-spring.xml
controller層引用log4j2
這裏簡單描述一下當前測試場景,根據我的配置文件loh4j2-spring.xml日誌規則,我這裏只記錄兩種級別,一個爲運行日誌(包含錯誤信息,程序運行過程),一個爲訪問日誌(只記錄運行信息)
package com.itxwl.run.controller;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Auther: 薛
* @Date: 2020/4/30 15:37
* @Description:
*/
@RestController
@RequestMapping("t")
public class DemoController {
private Logger logger= LogManager.getLogger(DemoController.class);
@GetMapping("/s/{data}")
public Integer s(@PathVariable("data") Integer data){
logger.fatal("訪問運算接口~");
Integer dd=5;
Integer ix=0;
if (!StringUtils.isEmpty(data)){
try {
ix = dd / data;
} catch (Exception e) {
logger.error("運算失敗,可能被除數爲零");
}
}
return ix;
}
}
服務運行後場景概況
根據以上log4j2配置文件規則會在系統D盤/logs文件下生成日誌文件
- 首次系統運行即生成兩個文件
- 日誌測試環境限定配置爲滿10KB即滾動當前日誌文件,異常及堆棧信息移動其它文件
- 日誌文件滿足10KB時會自動新增,根據xml文件配置如果滿30個文件,會回滾爲最後一條爲最新數據
服務結構圖(基於idea)
日誌記錄文件圖示
-
運行日誌如圖
-
訪問日誌如圖
結束語(博主聯繫方式)
當然只是基礎引用log4j2記錄日誌,後續會持續推出日誌相關文章,進而整合到微服務架構下日誌記錄。
QQ:2509647976
微信:x331191249