目錄
Springboot日志使用
Logback日志
日志格式
自定義日志格式
日志文件輸出
Springboot啟用log4j2日志框架
Springboot日志使用
Springboot底層是使用slf4j+logback的方式進(jìn)行日志記錄
Logback日志
trace:級別最低
debug:調(diào)試級別的,常用于跟蹤程序的進(jìn)展
info:普通的打印信息(默認(rèn)的日志級別)
warn:警告級別,不影響使用,但應(yīng)該注意
error:錯(cuò)誤級別,錯(cuò)誤日志信息打印
fatal:致命級別,因代碼異常導(dǎo)致程序退出,級別最高
日志級別
Trace-> debug-> info-> warn-> error-> fatal
logger.trace("trace");跟蹤
logger.debug("debug");調(diào)試
logger.info("info");信息
logger.warn("warn");告警
logger.error("error");異常
logging:
level:
root: trace
logging:
level:
com:
example: trace
日志格式
1、時(shí)間日期:精確到毫秒
2、日志級別:ERROR,WARN,INFO,DEBUG,TRACE
3、進(jìn)程ID:
4、分隔符:— 標(biāo)識(shí)實(shí)際日志的開始
5、線程名:方括號(hào)括起來(可能會(huì)截?cái)嗫刂婆_(tái)輸出)
6、Logger名:通常使用源代碼的類名
7、日志內(nèi)容:
自定義日志格式
%
clr(%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}){yellow}
docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging
日志文件輸出
默認(rèn)情況下,springboot僅記錄到控制臺(tái),不寫日志文件。
若要輸出日志文件,需設(shè)置logging.file.name或logging.file.path屬性
logging:
level:
com:
example: trace
#logging.pattern.dateformat -> LOG_DATEFORMAT_PATTERN
#https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging
#pattern:
# dateformat: yyyy-MM-dd HH:mm:ss.SSS
file:
#log文件默認(rèn)在項(xiàng)目的相對路下
name: D:/test/log/demo.log
file:
#默認(rèn)文件名spring.log
# name: D:/test/log/demo.log
#log文件默認(rèn)在項(xiàng)目的相對路下
path: D:/test/log/
logging:
level:
com:
example: trace
#logging.pattern.dateformat -> LOG_DATEFORMAT_PATTERN
#https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging
#pattern:
# dateformat: yyyy-MM-dd HH:mm:ss.SSS
file:
#默認(rèn)文件名spring.log
name: D:/test/log/demo.log
#log文件默認(rèn)在項(xiàng)目的相對路下
# path: D:/test/log/
# 最大日志文件大小(默認(rèn)為10MB,這里為了測試歸檔,暫時(shí)設(shè)置為5KB)
max-size: 5KB
# 要保留的日志備份的總大小(默認(rèn)為0B)
total-size-cap: 1GB
# 保存存檔日志文件的最大天數(shù)(默認(rèn)為7天)
max-history: 7
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路徑 -->
<property name="log.path" value="${user.dir}/logs"/>
<!-- 日志輸出格式 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{100} - [%method,%line] - %msg%n"/>
<!-- 控制臺(tái)輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系統(tǒng)日志輸出 -->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循環(huán)政策:基于時(shí)間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過濾的級別 -->
<level>INFO</level>
<!-- 匹配時(shí)的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時(shí)的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系統(tǒng)日志輸出 -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug.log</file>
<!-- 循環(huán)政策:基于時(shí)間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過濾的級別 -->
<level>DUBUG</level>
<!-- 匹配時(shí)的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時(shí)的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循環(huán)政策:基于時(shí)間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過濾的級別 -->
<level>ERROR</level>
<!-- 匹配時(shí)的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時(shí)的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用戶訪問日志輸出 -->
<appender name="user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滾 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 日志水平-->
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系統(tǒng)操作日志-->
<root level="info">
<appender-ref ref="info"/>
<appender-ref ref="debug"/>
<appender-ref ref="error"/>
</root>
<!--系統(tǒng)用戶操作日志-->
<logger name="com.example" level="info">
<appender-ref ref="user"/>
</logger>
</configuration>
Springboot啟用log4j2日志框架
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 排除logback依賴 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--Log4j2場景啟動(dòng)器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<!--status:Log4j2內(nèi)部日志的輸出級別,設(shè)置為TRACE對學(xué)習(xí)Log4j2非常有用 -->
<!--monitorInterval:定時(shí)檢測配置文件的修改,有變化則自動(dòng)重新加載配置,時(shí)間單位為秒,最小間隔為5s -->
<Configuration status="WARN" monitorInterval="1800">
<!--properties:設(shè)置全局變量 -->
<properties>
<!--LOG_HOME:指定當(dāng)前日志存放的目錄 -->
<property name="LOG_HOME">./logs</property>
<!--FILE_NAME:指定日志文件的名稱 -->
<property name="FILE_NAME">test</property>
</properties>
<!--Appenders:定義日志輸出目的地,內(nèi)容和格式等 -->
<Appenders>
<!--Console:日志輸出到控制臺(tái)標(biāo)準(zhǔn)輸出 -->
<Console name="Console" target="SYSTEM_OUT">
<!--pattern:日期,線程名,日志級別,日志名稱,日志信息,換行 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [線程名%t] [日志級別%-5level] [日志名稱%L] - [日志信息:%msg]%n" />
</Console>
<!--RollingFile:日志輸出到文件,下面的文件都使用相對路徑 -->
<!--fileName:當(dāng)前日志輸出的文件名稱 -->
<!--filePattern:備份日志文件名稱,備份目錄為logs下面以年月命名的目錄,備份時(shí)使用gz格式壓縮 -->
<RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%L] - %msg%n" />
<!--Policies:觸發(fā)策略決定何時(shí)執(zhí)行備份 -->
<Policies>
<!--TimeBasedTriggeringPolicy:日志文件按照時(shí)間備份 -->
<!--interval:每1天生成一個(gè)新文件,時(shí)間單位需要結(jié)合filePattern時(shí)間%d{yyyy-MM-dd} -->
<!--同理,如果要每1小時(shí)生成一個(gè)新文件,則改成%d{yyyy-MM-ddHH} -->
<!--modulate:對備份日志的生成時(shí)間糾偏,糾偏以0為基準(zhǔn)進(jìn)行,"0+interval"決定啟動(dòng)后第一次備份時(shí)間 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<!--SizeBasedTriggeringPolicy:日志文件按照大小備份 -->
<!--size:指定日志文件最大為100MB,單位可以為KB、MB或GB -->
<SizeBasedTriggeringPolicy size="200MB" />
</Policies>
<!--DefaultRolloverStrategy:翻轉(zhuǎn)策略決定如何執(zhí)行備份 -->
<!--max:最多保存5個(gè)備份文件,結(jié)合時(shí)間使用后,在每個(gè)時(shí)間段內(nèi)最多有5個(gè)備份,多出來的會(huì)被覆蓋 -->
<!--compressionLevel:配置日志壓縮級別,范圍0-9,0不壓縮,1壓縮速度最快,9壓縮率最好,目前只對于zip壓縮文件類型有效 -->
<DefaultRolloverStrategy max="5" compressionLevel="1">
<!--Delete:刪除匹配到的過期備份文件 -->
<!--maxDepth:由于備份文件保存在${LOG_HOME}/$${date:yyyy-MM},所以目錄深度設(shè)置為2 -->
<Delete basePath="${LOG_HOME}" maxDepth="2">
<!--IfFileName:匹配文件名稱 -->
<!--glob:匹配2級目錄深度下的以.log.gz結(jié)尾的備份文件 -->
<IfFileName glob="*/*.log.gz" />
<!--IfLastModified:匹配文件修改時(shí)間 -->
<!--age:匹配超過180天的文件,單位D、H、M、S分別表示天、小時(shí)、分鐘、秒-->
<IfLastModified age="180D" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<!--Loggers:定義日志級別和使用的Appenders -->
<Loggers>
<!--name: 打印日志的類的包路徑 -->
<!--additivity: true當(dāng)前的Logger打印的日志附加到Root,false僅僅打印到RollingFile -->
<Logger name="com.example" level="info" additivity="true">
<AppenderRef ref="RollingFile" />
</Logger>
<!--Root:日志默認(rèn)打印到控制臺(tái) -->
<!--level日志級別: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
<Root level="ERROR">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
Apache Log4j2 (Log4j – Apache Log4j 2)是對Log4j的升級,它比其前身Log4j 1.x提供了重大改進(jìn),并參考了Logback中優(yōu)秀的設(shè)計(jì),同時(shí)修復(fù)了Logback架構(gòu)中的一些問題。被譽(yù)為是目前最優(yōu)秀的Java日志框架;企業(yè)中通常使用SLF4j門面+Log4j2來記錄日志。
SLF4J: Found provider [ch.qos.logback.classic.spi.LogbackServiceProvider@11c20519]
SLF4J: Found provider [org.apache.logging.slf4j.SLF4JServiceProvider@70beb599]
存在依賴沖突,解決辦法
<exclusions><!-- 排除logback依賴 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
排查發(fā)現(xiàn)
spring-boot-starter-actuator
springfox-swagger2
springfox-swagger-ui
spring-boot-starter-web
需排除logback依賴否則會(huì)與log4j2產(chǎn)生依賴沖突
<dependency>
??????????? <groupId>org.springframework.boot</groupId>
??????????? <artifactId>spring-boot-starter-actuator</artifactId>
??????????? <exclusions><!-- 排除logback依賴 -->
??????????????? <exclusion>
??????????????????? <groupId>org.springframework.boot</groupId>
??????????????????? <artifactId>spring-boot-starter-logging</artifactId>
??????????????? </exclusion>
??????????? </exclusions>
??????? </dependency>
??????? <dependency>
??????????? <groupId>io.springfox</groupId>
??????????? <artifactId>springfox-swagger2</artifactId>
??????????? <version>2.9.2</version>
??????????? <exclusions><!-- 排除logback依賴 -->
??????????????? <exclusion>
??????????????????? <groupId>org.springframework.boot</groupId>
??????????????????? <artifactId>spring-boot-starter-logging</artifactId>
??????????????? </exclusion>
??????????? </exclusions>
??????? </dependency>
??????? <dependency>
??????????? <groupId>io.springfox</groupId>
??????????? <artifactId>springfox-swagger-ui</artifactId>
??????????? <version>2.9.2</version>
??????????? <exclusions><!-- 排除logback依賴 -->
??????????????? <exclusion>
??????????????????? <groupId>org.springframework.boot</groupId>
??????????????????? <artifactId>spring-boot-starter-logging</artifactId>
??????????????? </exclusion>
??????????? </exclusions>
??????? </dependency>
??????? <dependency>
log4j2+Mybatis
Mybatis日志交給log4j2管理
mybatis-config.xml文章來源:http://www.zghlxwxcb.cn/news/detail-803606.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="LOG4J2"/>
</settings>
</configuration>
log4j2.xml文章來源地址http://www.zghlxwxcb.cn/news/detail-803606.html
<?xml version="1.0" encoding="UTF-8"?>
<!--status:Log4j2內(nèi)部日志的輸出級別,設(shè)置為TRACE對學(xué)習(xí)Log4j2非常有用 -->
<!--monitorInterval:定時(shí)檢測配置文件的修改,有變化則自動(dòng)重新加載配置,時(shí)間單位為秒,最小間隔為5s -->
<Configuration status="WARN" monitorInterval="1800">
<!--properties:設(shè)置全局變量 -->
<properties>
<!--LOG_HOME:指定當(dāng)前日志存放的目錄 -->
<property name="LOG_HOME">./logs</property>
<!--FILE_NAME:指定日志文件的名稱 -->
<property name="FILE_NAME">wms</property>
</properties>
<!--Appenders:定義日志輸出目的地,內(nèi)容和格式等 -->
<Appenders>
<!--Console:日志輸出到控制臺(tái)標(biāo)準(zhǔn)輸出 -->
<Console name="Console" target="SYSTEM_OUT">
<!--pattern:日期,線程名,日志級別,日志名稱,日志信息,換行 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [線程名%t] [日志級別%-5level] [日志名稱%L] - [日志信息:%msg]%n" />
</Console>
<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
<!--控制臺(tái)只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<!--此處的level一定要設(shè)置為debug,否者mybatis的日志會(huì)被拒絕-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [線程名%t] [日志級別%-5level] [日志名稱%L] - [日志信息:%msg]%n"/>
<Policies>
<!--TimeBasedTriggeringPolicy:日志文件按照時(shí)間備份 -->
<!--interval:每1天生成一個(gè)新文件,時(shí)間單位需要結(jié)合filePattern時(shí)間%d{yyyy-MM-dd} -->
<!--同理,如果要每1小時(shí)生成一個(gè)新文件,則改成%d{yyyy-MM-ddHH} -->
<!--modulate:對備份日志的生成時(shí)間糾偏,糾偏以0為基準(zhǔn)進(jìn)行,"0+interval"決定啟動(dòng)后第一次備份時(shí)間 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<!--SizeBasedTriggeringPolicy:日志文件按照大小備份 -->
<!--size:指定日志文件最大為100MB,單位可以為KB、MB或GB -->
<SizeBasedTriggeringPolicy size="200MB" />
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個(gè)文件,這里設(shè)置了100 例如文件中會(huì)生成如下 info-1.log info-2.log .... info-100.log -->
<DefaultRolloverStrategy max="10">
<Delete basePath="${LOG_HOME}" maxDepth="2">
<!--IfFileName:匹配文件名稱 -->
<!--glob:匹配2級目錄深度下的以.log.gz結(jié)尾的備份文件 -->
<IfFileName glob="*/*.log.gz" />
<!--IfLastModified:匹配文件修改時(shí)間 -->
<!--age:匹配超過180天的文件,單位D、H、M、S分別表示天、小時(shí)、分鐘、秒-->
<IfLastModified age="30D" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<!--Loggers:定義日志級別和使用的Appenders -->
<Loggers>
<!--name: 打印日志的類的包路徑 -->
<!--additivity: true當(dāng)前的Logger打印的日志附加到Root,false僅僅打印到RollingFile -->
<Logger name="com.example" level="debug">
<!-- <AppenderRef ref="RollingFile" />-->
<AppenderRef ref="RollingFileInfo" />
</Logger>
<!--Root:日志默認(rèn)打印到控制臺(tái) -->
<!--level日志級別: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFileInfo" />
</Root>
</Loggers>
</Configuration>
到了這里,關(guān)于Springboot日志框架logback與log4j2的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!