Spring Boot 內(nèi)置包含了logback 和 slf4j荤胁,通過依賴關系可以看到岗宣,
spring-boot-starter -> spring-boot-starter-logging
而spring-boot-starter-logging又依賴了 logback和slf4j
因此我們無需在pom.xml文件中引入任何依賴器腋。
日志格式
SpringBoot默認的日志輸出格式是這樣的溶其,從左到右依次是:
- 日期時間
- 日志級別
- 進程號
- 線程名稱
- 源代碼的類名稱
- 日志信息
2018-10-24 11:23:54.773 INFO 1529 ---[nio-8080-exec-1] com.xiaozhao.controller.HelloController : 我是控制器管宵,接收到了參數(shù):詹姆斯
時間日期精確到毫秒 日志級別 進程id ---[線程名稱] 源代碼的類名稱 : 業(yè)務日志
日志級別
Spring Boot 默認只輸出到控制臺前痘,日志級別只顯示INFO、WARN婆瓜、ERROR
雖然可以通過以下2種方式啟動debug日志快集,但是只會輸出系統(tǒng)相關的日志,咱們在程序中寫的debug級別日志是不能輸出的廉白。
1)在 application.properties 中設置 debug=true
- 使用命令行啟動: java -jar myApp.jar --debug
最簡單配置
日志默認是不輸出到文件中的个初,但是在生產(chǎn)環(huán)境下,一般需要記錄運行日志的猴蹂,我們只需在application.properties加上如下配置即可院溺。
logging.path=/Users/xiaozhao/Technology/temp/logs
logging.file=/Users/xiaozhao/Technology/temp/logs/my.log
logging.level.root=info
上面三行配置依次為:
- 日志文件的路徑
- 日志文件名稱
- 日志級別
日志大小默認為10MB,超過這個大小后建立新文件磅轻。
自定義深層次配置
如果想要對日志有更精細的控制珍逸,可以添加額外的配置文件。在resources文件夾下建立對應的配置文件即可聋溜,文件名稱約定為:
- logback.xml
- logback-spring.xml
這2個文件的區(qū)別是加載的時機不同谆膳,logback.xml加載的比較早,因此和Spring Boot的一些互動性不如 logback-spring.xml
建議使用 logback-spring.xml即可撮躁,因為這個可以加入一些擴展配置漱病,比如和spring的profile配合,讀取application.properties中的一些屬性等把曼。
logback 擴展配置
1.與profile配合
可以使用 springProfile 標簽來選擇性的包含或者排除一些設置項杨帽。
比如我們在開發(fā)階段時,一般只要把日志輸出到控制臺即可嗤军,沒有必要輸出到文件中注盈。
而在生產(chǎn)環(huán)境中輸出到控制臺是沒有意義的,同時還有性能開銷叙赚,一般需要把日志輸出到文件老客,則取消輸出到控制臺僚饭。
例如有一個application-dev.properties的配置,用于開發(fā)環(huán)境胧砰,在我們的application.properties中有如下設置
# 啟用開發(fā)環(huán)境
spring.profiles.active=dev
然后在logback-spring.xml中加入如下節(jié)點
<!--開發(fā)環(huán)境下只輸出到控制臺浪慌,不寫日志文件-->
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</springProfile>
同理再加一個生產(chǎn)環(huán)境的配置節(jié)點
<!-- 生產(chǎn)環(huán)境日志級別為INFO/并且記錄日志文件 -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</springProfile>
還可以指定不同的輸出級別,例如在開發(fā)環(huán)境下指定輸出級別為 DEBUG 而在生產(chǎn)下為INFO
2.讀取application.properties中的配置項
可以通過 springProperty節(jié)點來讀取 application.properties中的屬性值朴则,例如我們要讀取項目名稱來作為日志文件的主名稱。
在application.properties中有這么一個配置項
spring.application.name=BangBang
然后在logback-spring.xml文件中添加一個節(jié)點
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="bang.log"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${LOG_HOME}/${logName}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期钓简,%thread表示線程名乌妒,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
其中:
- scope:作用域
- name: 在logback-spring.xml文件中供其他地方引用的變量名稱
- source: 在application.properties中定義的項
- defaultValue: 默認值
這樣就可以把項目名稱讀取進來外邓,生成的日志文件就是項目名稱作為名稱撤蚊,運行之后的截圖:
示例
以下為一個logback-spring.xml配置的例子
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--
說明:
1、日志級別及文件
日志記錄采用分級記錄损话,級別與日志文件名相對應侦啸,不同級別的日志信息記錄到不同的日志文件中
例如:error級別記錄到log_error_xxx.log或log_error.log(該文件為當前記錄的日志文件),而log_error_xxx.log為歸檔日志丧枪,
日志文件按日期記錄光涂,同一天內(nèi),若日志文件大小等于或大于2M拧烦,則按0忘闻、1、2...順序分別命名
例如log-level-2013-12-21.0.log
其它級別的日志也是如此恋博。
2齐佳、文件路徑
若開發(fā)、測試用债沮,在Eclipse中運行項目炼吴,則到Eclipse的安裝路徑查找logs文件夾,以相對路徑../logs疫衩。
若部署到Tomcat下硅蹦,則在Tomcat下的logs文件中
3、Appender
FILEERROR對應error級別隧土,文件名以log-error-xxx.log形式命名
FILEWARN對應warn級別提针,文件名以log-warn-xxx.log形式命名
FILEINFO對應info級別,文件名以log-info-xxx.log形式命名
FILEDEBUG對應debug級別曹傀,文件名以log-debug-xxx.log形式命名
stdout將日志信息輸出到控制上辐脖,為方便開發(fā)測試使用
-->
<!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="LOG_HOME" value="/Users/xiaozhao/Technology/temp"/>
<!-- 讀取 spring.application.name 屬性來生成日志文件名
scope:作用域
name:在 logback-spring.xml 使用的鍵
source:application.properties 文件中的鍵
defaultValue:默認值
-->
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="bang.log"/>
<!-- 控制臺輸出 -->
<!-- 彩色日志 -->
<!-- 彩色日志依賴的渲染類 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- Console 輸出設置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${LOG_HOME}/${logName}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名皆愉,%-5level:級別從左顯示5個字符寬度%msg:日志消息嗜价,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!--用來設置某一個包或者具體的某一個類的日志打印級別-->
<!--打印MyBatis的sql語句-->
<logger name="com.xiaozhao.dao" level="DEBUG"></logger>
<!-- 日志輸出級別艇抠,生產(chǎn)環(huán)境下需要移除控制臺輸出 -->
<!--<root level="INFO">-->
<!--<appender-ref ref="STDOUT"/>-->
<!--<appender-ref ref="FILE"/>-->
<!--</root>-->
<!--開發(fā)環(huán)境下只輸出到控制臺,不寫日志文件-->
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</springProfile>
<!-- 生產(chǎn)環(huán)境日志級別為INFO/并且記錄日志文件 -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</springProfile>
</configuration>
完整代碼
https://github.com/xiaozhaowen/spring-boot-in-action/tree/master/springboot-logback