前言
- Logback是由log4j創(chuàng)始人設(shè)計(jì)的又一個開源日志組件扳还。logback當(dāng)前分成三個模塊:logback-core,logback- classic和logback-access氨距。logback-core是其它兩個模塊的基礎(chǔ)模塊。logback-classic是log4j的一個 改良版本楞遏。
- SpringBoot會默認(rèn)使用logback作為日志框架寡喝。SpringBoot會默認(rèn)加載classpath:logback.xml或者classpath:logback-spring.xml文件作為日志配置文件勒奇。如果兩個文件都不存在撬陵,logback 用 BasicConfigurator 自動對自己進(jìn)行配置珊皿,這會導(dǎo)致記錄輸出到控制臺网缝。
一、pom.xml文件
因?yàn)閟pringboot默認(rèn)使用logback作為日志框架蟋定,所以我們不需要再引入依賴粉臊,這里引入lombok是為了方便使用logback,下面會有例子驶兜。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
二扼仲、logback配置文件
這里的錯誤日志單獨(dú)生成一個文件。具體配置可以參考logback中文手冊
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>SpringBoot-logback</contextName>
<!--設(shè)置系統(tǒng)日志目錄-->
<property name="log-dir" value="logs"/>
<property name="log-name" value="spring-boot-logback"/>
<!-- 控制臺輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--encoder 默認(rèn)配置為PatternLayoutEncoder-->
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!--此日志appender是為開發(fā)使用屠凶,只配置最底級別,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 日志記錄器肆资,日期滾動記錄 -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名稱矗愧,如果沒有File 屬性,那么只會使用FileNamePattern的文件路徑規(guī)則如果同時有<File>和<FileNamePattern>郑原,那么當(dāng)天日志是<File>唉韭,明天會自動把今天的日志改名為今天的日期。即犯犁,<File> 的日志都是當(dāng)天的属愤。-->
<!--<File>${log-dir}/${log-name}/info.spring-boot-demo-logback.log</File>-->
<!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路徑,定義了日志的切分方式——把每一天的日志歸檔到一個文件中,以防止日志填滿整個磁盤空間-->
<FileNamePattern>${log-dir}/${log-name}/info.created_on_%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用來指定日志文件的上限大小酸役,那么到了這個值住诸,就會刪除舊的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:這是活動文件的大小,默認(rèn)值是10MB,本篇設(shè)置為1KB涣澡,只是為了演示 -->
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!--如果只是想要 Info 級別的日志贱呐,只是過濾 info 還是會輸出 Error 日志,因?yàn)?Error 的級別高暑塑, 所以我們使用下面的策略吼句,可以避免輸出 Error 的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--過濾 Error-->
<level>ERROR</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--沒有匹配到就允許-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!--日志文件最大的大小-->
<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!--<maxFileSize>1KB</maxFileSize>-->
<!--</triggeringPolicy>-->
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
</appender>
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名稱锅必,如果沒有File 屬性事格,那么只會使用FileNamePattern的文件路徑規(guī)則如果同時有<File>和<FileNamePattern>,那么當(dāng)天日志是<File>搞隐,明天會自動把今天的日志改名為今天的日期驹愚。即,<File> 的日志都是當(dāng)天的劣纲。-->
<!--<File>logs/error.spring-boot-demo-logback.log</File>-->
<!--滾動策略逢捺,按照時間滾動 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路徑,定義了日志的切分方式——把每一天的日志歸檔到一個文件中,以防止日志填滿整個磁盤空間-->
<FileNamePattern>${log-dir}/${log-name}/error.created_on_%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:這是活動文件的大小,默認(rèn)值是10MB,本篇設(shè)置為1KB癞季,只是為了演示 -->
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!--如果只是想要 Error 級別的日志劫瞳,那么需要過濾一下倘潜,默認(rèn)是 info 級別的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Error</level>
</filter>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="FILE_ERROR"/>
</root>
</configuration>
三志于、Controller類
- 未使用lombok方式涮因。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
// logback
private final static Logger logger = LoggerFactory.getLogger(IndexController.class);
@RequestMapping("/index")
public String index() {
logger.debug("記錄debug日志");
logger.info("訪問了index方法");
logger.error("記錄了error錯誤日志");
return "index";
}
}
- 使用lombok方式。
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class IndexController2 {
@RequestMapping("/index2")
public String index2() {
log.trace("記錄trace日志");
log.debug("記錄debug日志");
log.info("訪問了index方法");
log.warn("記錄了warn日志");
log.error("記錄了error錯誤日志");
try {
int i = 0;
int j = 1 / i;
} catch (Exception e) {
log.error("錯誤異常:", e);
}
return "index";
}
}
四伺绽、備注
為了加深理解logback配置养泡,這里放一個搜到的比較好的一個配置,僅供參考奈应。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
說明:
1澜掩、日志級別及文件
日志記錄采用分級記錄,級別與日志文件名相對應(yīng)杖挣,不同級別的日志信息記錄到不同的日志文件中
例如:error級別記錄到log_error_xxx.log或log_error.log(該文件為當(dāng)前記錄的日志文件)肩榕,而log_error_xxx.log為歸檔日志,
日志文件按日期記錄惩妇,同一天內(nèi)点把,若日志文件大小等于或大于2M,則按0屿附、1郎逃、2...順序分別命名
例如log-level-2013-12-21.0.log
其它級別的日志也是如此。
2挺份、文件路徑
若開發(fā)褒翰、測試用,在Eclipse中運(yùn)行項(xiàng)目匀泊,則到Eclipse的安裝路徑查找logs文件夾优训,以相對路徑../logs。
若部署到Tomcat下各聘,則在Tomcat下的logs文件中
3揣非、Appender
FILEERROR對應(yīng)error級別,文件名以log-error-xxx.log形式命名
FILEWARN對應(yīng)warn級別躲因,文件名以log-warn-xxx.log形式命名
FILEINFO對應(yīng)info級別早敬,文件名以log-info-xxx.log形式命名
FILEDEBUG對應(yīng)debug級別,文件名以log-debug-xxx.log形式命名
stdout將日志信息輸出到控制上大脉,為方便開發(fā)測試使用
-->
<contextName>SpringBootDemo</contextName>
<property name="LOG_PATH" value="D:\\JavaWebLogs" />
<!--設(shè)置系統(tǒng)日志目錄-->
<property name="APPDIR" value="SpringBootDemo" />
<!-- 日志記錄器搞监,日期滾動記錄 -->
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_error.log</file>
<!-- 日志記錄器的滾動策略,按日期镰矿,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日志文件的路徑琐驴,例如今天是2013-12-21日志,當(dāng)前寫的日志文件路徑為file節(jié)點(diǎn)指定,可以將此文件與file指定文件路徑設(shè)置為不同路徑绝淡,從而將當(dāng)前日志文件或歸檔日志文件置不同的目錄宙刘。
而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式牢酵,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日志記錄之外荐类,還配置了日志文件不能超過2M,若超過2M茁帽,日志文件會以索引0開始玉罐,
命名日志文件,例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日志 -->
<append>true</append>
<!-- 日志文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日志文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日志記錄器潘拨,日期滾動記錄 -->
<appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
<!-- 日志記錄器的滾動策略吊输,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日志文件的路徑铁追,例如今天是2013-12-21日志季蚂,當(dāng)前寫的日志文件路徑為file節(jié)點(diǎn)指定,可以將此文件與file指定文件路徑設(shè)置為不同路徑琅束,從而將當(dāng)前日志文件或歸檔日志文件置不同的目錄扭屁。
而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式涩禀,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日志記錄之外料滥,還配置了日志文件不能超過2M,若超過2M艾船,日志文件會以索引0開始葵腹,
命名日志文件,例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日志 -->
<append>true</append>
<!-- 日志文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日志文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日志記錄器屿岂,日期滾動記錄 -->
<appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_info.log</file>
<!-- 日志記錄器的滾動策略践宴,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日志文件的路徑爷怀,例如今天是2013-12-21日志阻肩,當(dāng)前寫的日志文件路徑為file節(jié)點(diǎn)指定,可以將此文件與file指定文件路徑設(shè)置為不同路徑运授,從而將當(dāng)前日志文件或歸檔日志文件置不同的目錄烤惊。
而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式徒坡,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日志記錄之外撕氧,還配置了日志文件不能超過2M瘤缩,若超過2M喇完,日志文件會以索引0開始,
命名日志文件,例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日志 -->
<append>true</append>
<!-- 日志文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日志文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--encoder 默認(rèn)配置為PatternLayoutEncoder-->
<encoder>
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--此日志appender是為開發(fā)使用锦溪,只配置最底級別不脯,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender>
<logger name="org.springframework" level="WARN" />
<logger name="org.hibernate" level="WARN" />
<!-- 生產(chǎn)環(huán)境下,將此級別配置為適合的級別刻诊,以免日志文件太多或影響程序性能 -->
<root level="INFO">
<appender-ref ref="FILEERROR" />
<appender-ref ref="FILEWARN" />
<appender-ref ref="FILEINFO" />
<!-- 生產(chǎn)環(huán)境將請stdout,testfile去掉 -->
<appender-ref ref="STDOUT" />
</root>
</configuration>