| 知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
一般的日誌需求可以通過配置 application.properties實現。
Spring Boot中 日誌預設是輸出到控制台的,這樣是為了方便開發人員,但是在生產環境中應該輸出到日誌檔案中。
配置如下
![]() | 提示 |
|---|---|
|
注意:這兩個屬性不能同時配置,只需要配置一個即可。 |
![]() | 提示 |
|---|---|
|
舊版本 logging.file,設置檔案,可以是絶對路徑,也可以是相對路徑。如:logging.file=my.log logging.path,設置目錄,如果 logging.file 沒有設置,會在該目錄下創建spring.log檔案作為預設日誌檔案。 logging.file=target/spring.log #logging.path= 如果仍不能滿足可以使用 logback.xml 配置日誌。 logging.path=/tmp logging.config=classpath:logback.xml |
幾種常見的日誌級別由低到高分為:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
顯示所有DEBUG信息
logging.level.root=DEBUG
僅僅顯示 springframework 調試信息
logging.level.org.springframework.web=DEBUG
僅僅顯示 cn.netkiller.web.TestController 調試信息
private static final Logger log = LoggerFactory.getLogger(TestController.class); log.debug(message); logging.level.cn.netkiller.web.TestController=DEBUG
禁止控制台日誌輸出,同時將日誌寫入日誌檔案.
src/main/resources/application.properties
logging.path=/tmp logging.file=/tmp/spring.log logging.level.root=INFO logging.level.org.springframework.web=DEBUG logging.level.org.hibernate=ERROR
src/main/resources/logback.xml
$ cat src/main/resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
使用 java -jar project-version-xxx.jar 啟動後控制不會再輸出日誌
定製日誌格式有兩個配置
分別是控制台的輸出格式和檔案中的日誌輸出格式
舉例
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
格式說明
%d{HH:mm:ss.SSS} 日誌輸出時間
%thread 輸出日誌的進程名字,這在Web應用以及非同步任務處理中很有用
%-5level 日誌級別,並且使用5個字元靠左對齊
%logger 日誌輸出者的名字
%msg 日誌消息
%n 平台的換行符
日誌的用法,首先開發中我們根據實際的需要打印不同級別的日誌。
package cn.netkiller.web;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
private static final Logger log = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/test/log")
@ResponseBody
public String log() {
String message = "Test";
log.debug(message);
log.info(message);
log.warn(message);
log.error(message);
log.trace(message);
return message;
}
}
然後通過application.properties配置那些需要顯示,那些不需要,以及顯示的級別是什麼。
配置檔案名預設是:logback-spring.xml,使用其他檔案名通過下面配置項指定即可。
logging.config=classpath:logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss} %-4relative [%thread] %-5level %logger{35} : %msg %n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<property name="log.path" value="target" />
<!--輸出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--輸出到檔案-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/spring.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
</configuration>
按日期分割檔案
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/spring.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<FileNamePattern>spring.%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- keep 30 days' worth of history -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
<appender-ref ref="dailyRollingFileAppender" />
</root>
</configuration>
通過級別分割日誌將 info, error, debug 分割到指定檔案中。
<configuration scan="true" scanPeriod="10 seconds">
<!-- 控制台日誌輸出-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %p (%file:%line\)- %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- info日誌輸出-->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d %p (%file:%line\)- %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<File>${LOG_PATH}/www.netkiller.cn.info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/www.netkiller.cn.info-%d{yyyyMMdd}.log.%i
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
</Pattern>
</layout>
</appender>
<!-- debug 日誌輸出-->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d %p (%file:%line\)- %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<File>${LOG_PATH}/www.netkiller.cn.debug.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/www.netkiller.cn.debug-%d{yyyyMMdd}.log.%i
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
</Pattern>
</layout>
</appender>
<!--error 日誌輸出配置 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d %p (%file:%line\)- %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<File>${LOG_PATH}/www.netkiller.cn.error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/www.netkiller.cn.error-%d{yyyyMMdd}.log.%i</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</appender>
<root level="DEBUG">
<!--
<appender-ref ref="STDOUT" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="DEBUG_FILE" />
-->
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="DEBUG_FILE" />
</root>
</configuration>
<logger name="cn.netkiller.controller"/>
<logger name="cn.netkiller.controller.HomeController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
scan:當此屬性設置為true時,配置檔案如果發生改變,將會被重新加載,預設值為true。 scanPeriod:設置監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。 debug:當此屬性設置為true時,將打印出logback內部日誌信息,實時查看logback運行狀態。預設值為false。
每個logger都關聯到logger上下文,預設上下文名稱為“default”。但可以使用設置成其他名字,用於區分不同應用程序的記錄。設置後可以通過%contextName來打印日誌上下文名稱。 <contextName>logback</contextName>
用來定義變數值的標籤, 有兩個屬性,name和value;其中name的值是變數的名稱,value的值時變數定義的值。通過定義的值會被插入到logger上下文中。定義變數後,可以使“${}”來使用變數。
<property name="log.path" value="/tmp" />
<encoder>表示對日誌進行編碼:
%d{HH: mm:ss.SSS}——日誌輸出時間
%thread——輸出日誌的進程名字,這在Web應用以及非同步任務處理中很有用
%-5level——日誌級別,並且使用5個字元靠左對齊
%logger{36}——日誌輸出者的名字
%msg——日誌消息
%n——平台的換行符
上例中<fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>定義了日誌的切分方式——把每一天的日誌歸檔到一個檔案中,同理,可以使用%d{yyyy-MM-dd_HH-mm}來定義精確到分的日誌切分方式。
<maxHistory>30</maxHistory>表示只保留最近30天的日誌,以防止日誌填滿整個磁碟空間。
<totalSizeCap>1GB</totalSizeCap>用來指定日誌檔案的上限大小,例如設置為1GB的話,那麼到了這個值,就會刪除舊的日誌。