logback配置詳解:https://www.jianshu.com/p/1ded57f6c4e3
- logback-classic:log4j的一個改良版本,同時實現了
slf4j
的接口;
-
<!--這個依賴直接包含了 logback-core 以及 slf4j-api的依賴--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency>
springBoot日誌處理:日誌框架UCL、JUL、slf4j、logback、log4j;springboot默認支持的有slf4j、logback;
springboot默認幫我們配置好了,直接使用就可以了;
springboot默認的日誌級別是info,只打印info級別只之後的信息,也可以在配置文件中配置日誌級別logging.level.主配置類多所在的包=日誌級別;
吧日誌保存在文件中:要配置logging.file=保存日誌文件的位置,(相對於文件的根路徑),也可以設置絕對路徑.文件夾用logging.path=文件夾位置,並且默認的文件名叫spring.log;
修改日誌的格式:1.日誌顯示在控制檯,logging.pattern.console=%d{yyyy-MM-dd } [%thread] %-5level %logger{50} -%msg %n;2.日誌顯示在文件中,logging.pattern.file=%d{yyyy-MM-dd } [%thread] %-5level %logger{50} -%msg %n。
如果你即想完全掌控日誌配置,但又不想用logback.xml作爲Logback配置的名字,application.yml可以通過logging.config屬性指定自定義的名字:
logging.config=classpath:logging-config.xml
Spring Boot 的日誌支持依賴是 spring-boot-starter-logging,默認使用slf4j+logback的方式來記錄日誌.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
在控制檯中可看到 spring boot 默認打印出的啓動日誌,不過默認的打印級別爲 INFO.Logback 支持 TRACE, DEBUG, INFO, WARN, ERROR 日誌級別,優先級關係爲 TRACE < DEBUG < INFO < WARN < ERROR , 我們可以在 application.properties 配置文件中更改打印日誌級別.
***通用修改:
logging.level.root=DEBUG
還可以指定包的日誌級別:
logging.level.org.springframework=INFO
***代碼中使用:
Logger logger= LoggerFactory.getLogger(DemoApplication.getClass());
logger.debug("debug日誌");
logger.info("info日誌");
logger.warn("warn日誌");
logger.error("error日誌");
***使用屬性 logging.pattern.console 和 logging.pattern.file 可以分別自定義控制檯日誌和文件日誌的格式
#控制檯顯示日誌的格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{5}- %msg%n
#文件顯示日誌的格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm} [%thread] %-5level %logger- %msg%n
%d: 日期實踐
%thread: 線程名
%-5level:級別從左顯示5個字符寬度
%logger{5}:表示logger名字最長5個字符,否則按照句點分割。
%msg:日誌消息
%n:換行
***日誌保存(優先輸出 logging.file)
logging.path 可以指定日誌保存目錄,但不能指定輸出的文件名,且默認名爲spring.log
logging.path=/Users/HaokeMaster/Desktop/sts
logging.file 指定具體的路徑:
logging.file=/Users/HaokeMaster/Desktop/sts/my.log
***
# 當文件超過 10Mb 時,歸檔壓縮
logging.file.max-size=10Mb
# 日誌文件最多保存3天
logging.file.max-history=3
# 用於滾動的日誌文件名的模式
logging.pattern.rolling-file-name=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
***
日誌服務在ApplicationContext 創建之前就被初始化了,並不是採用Spring的配置文件進行控制。
那我們來如何進行自定義配置日誌呢。springboot爲我們提供了一個規則,按照規則組織配置文件名,就可以被正確加載:
Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging):logging.properties
參考:https://blog.csdn.net/weixin_38361347/article/details/86707149
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制檯打印日誌的相關配置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日誌格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%level] - %m%n</pattern>
</encoder>
<!-- 日誌級別過濾器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過濾的級別 -->
<level>WARN</level>
<!-- 匹配時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 文件保存日誌的相關配置 -->
<appender name="ERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 保存日誌文件的路徑 -->
<file>/logs/error.log</file>
<!-- 日誌格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n</pattern>
</encoder>
<!-- 日誌級別過濾器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過濾的級別 -->
<level>ERROR</level>
<!-- 匹配時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
<!-- 循環政策:基於時間創建日誌文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日誌文件名格式 -->
<fileNamePattern>error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 最大保存時間:30天-->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 基於debug處理日誌:具體控制檯或者文件對日誌級別的處理還要看所在appender配置的filter,如果沒有配置filter,則使用root配置 -->
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="ERROR-OUT" />
</root>
</configuration>
一:根節點<configuration>包含的屬性:
scan:
當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
scanPeriod:
設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
例如:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 其他配置省略-->
</configuration>
onMatch和onMismatch都有三個屬性值,分別爲Accept、DENY和NEUTRAL
分別介紹這兩個配置項的三個屬性值:
onMatch="ACCEPT" 表示匹配該級別及以上
onMatch="DENY" 表示不匹配該級別及以上
onMatch="NEUTRAL" 表示該級別及以上的,由下一個filter處理,如果當前是最後一個,則表示匹配該級別及以上
onMismatch="ACCEPT" 表示匹配該級別以下
onMismatch="NEUTRAL" 表示該級別及以下的,由下一個filter處理,如果當前是最後一個,則不匹配該級別以下的
onMismatch="DENY" 表示不匹配該級別以下的
logback配置非常詳細的解釋:https://blog.csdn.net/qq_36850813/article/details/83092051
<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!--兩個屬性 key:標識此<timestamp> 的名字;datePattern:設置將當前時間(解析配置文件的時間)轉換爲字符串的模式,遵循java.txt.SimpleDateFormat的格式。其他地方可以引用-->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<!-- 用來定義變量值的標籤,後面可以通過${app.name}使用-->-->
<property name="log.path" value="/Users/HaokeMaster/Desktop/sts"/>
<!-- 配置日誌的格式 -->
<property name="CONSOLE_LOG_PATTERN" value="%yellow%(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%line)"/>
<!-- 輸出到控制檯 -->
<appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<!-- 這裏的變量就是上面定義的格式 -->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</layout>
</appender>
<!-- 輸出到文件 -->
<!--獲取比info級別高(包括info級別)但除error級別的日誌-->
<appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--定義了一個過濾器,在LEVEL之下的日誌輸出不會被打印出來-->
<!--這裏定義了INFO,也就是控制檯不會輸出比INFO級別小的日誌-->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--定義輸出格式-->
<encoder>
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
<!-- 設置字符集 -->
<charset>UTF-8</charset>
</encoder>
<!--按時間滾動日誌策略,當達到一定條件後重新生成新的日誌文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--定義文件滾動時的文件名的格式-->
<fileNamePattern>${log.path}/info/%d.log</fileNamePattern>
<!-- 日誌文件保留天數 -->
<maxHistory>30</maxHistory>
<!-- 最大存儲 -->
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
</appender>
<appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</encoder>
<!--滾動策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路徑-->
<fileNamePattern>${log.path}/error/%d.log</fileNamePattern>
<maxHistory>30</maxHistory>
<!-- 最大存儲 -->
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
</appender>
<!-- 開發環境的日誌配置 -->
<springProfile name="dev">
<!--對於類路徑以 com.example.logback 開頭的Logger,輸出級別設置爲warn,並且只輸出到控制檯-->
<!--這個logger沒有指定appender,它會繼承root節點中定義的那些appender-->
<logger name="com.example.logback" level="warn"/>
<!--通過 LoggerFactory.getLogger("mytest") 可以獲取到這個logger-->
<!--由於這個logger自動繼承了root的appender,root中已經有stdout的appender了,自己這邊又引入了stdout的appender-->
<!--如果沒有設置 additivity="false" ,就會導致一條日誌在控制檯輸出兩次的情況-->
<!--additivity表示要不要使用rootLogger配置的appender進行輸出-->
<logger name="mytest" level="info" additivity="false">
<appender-ref ref="stdout"/>
</logger>
<!--由於設置了 additivity="false" ,所以輸出時不會使用rootLogger的appender-->
<!--但是這個logger本身又沒有配置appender,所以使用這個logger輸出日誌的話就不會輸出到任何地方-->
<logger name="mytest2" level="info" additivity="false"/>
<!-- 必須有的子節點,root是默認的logger 這裏設定輸出級別是info,日誌會通過往這兩個appender裏面寫>root可以包含多個appender,標識這個appender將會添加到這個loger
<root level="INFO">
<appender-ref ref="CONSOLE-LOG" />
<appender-ref ref="INFO-LOG" />
<appender-ref ref="ERROR-LOG" />
</root>
</springProfile>
<springProfile name="pro">
<!-- 在com.example.config包下面打印WARN級別的日誌 -->
<logger name="com.example" level="WARN"/>
<root level="info">
<appender-ref ref="CONSOLE-LOG" />
<appender-ref ref="INFO-LOG" />
<appender-ref ref="ERROR-LOG" />
</root>
</springProfile>
</configuration>
***依賴重複的報錯:https://blog.csdn.net/a704397849/article/details/98487404
排除spring-boot-starter-logging依賴,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 排除包引起的衝突 -->
<exclusions>
<exclusion>這一個可以不排除
<artifactId>logback-core</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>這個必須排除
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--全局排除spring-boot-starter-logging內的所有依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
如何快速正確的解決類似重複依賴的問題。
- 1 pom.xml中選中exclusion,右鍵 -> Maven -> Show Dependencies
- 2.crtl + f 打開搜索,然後輸入搜索內容 logback-classic或者其他需要搜索的內容.