源碼:https://github.com/yulc-coding/java-note/tree/master/logback
相關(guān)文章: Spring Boot Log4j2 日志簡(jiǎn)單使用
功能點(diǎn)
- 按日志級(jí)別生成文件
- 自定義生成日志文件:
- 定時(shí)任務(wù)等需要獨(dú)立分析的日志存放獨(dú)立文件
- 將指定包或者類的日志生成獨(dú)立的文件
- 按日期生成文件
- 設(shè)定日志文件大小
- 設(shè)定日志文件過(guò)期時(shí)間
開始
- Spring Boot 默認(rèn)使用了Logback作為日志框架根欧,所以不需要引入其他jar包
- 在 src/main/resources 下新建XML文件 logback-spring.xml
基本結(jié)構(gòu)
<configuration>
<!-- 定義變量 通過(guò) ${name} 來(lái)使用 -->
<property name="", value =""></property>
<!-- 日志相關(guān)配置 -->
<appender></appender>
<!-- 設(shè)置具體的打印,并引用appender -->
<logger></logger>
<!-- 功能同logger, 是所有l(wèi)ogger的上級(jí)節(jié)點(diǎn) -->
<root></root>
</configuration>
property
配置自定義變量
<!-- 定義日志文件的存儲(chǔ)地址 -->
<property name="LOG_HOME" value="./logs"/>
<!-- 定義日志打印格式 -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{user}]-[%X{args}] [%thread] %-5level %logger{50} - %msg%n"/>
appender
日志的組件,name指定appender名稱耕肩,供<logger/> 和<root/> 引用。class指定appender的輸出方式
- ch.qos.logback.core.ConsoleAppender :
在控制臺(tái)打印
<!-- Console 控制臺(tái)輸出設(shè)置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<!-- 對(duì)日志進(jìn)行格式化 -->
<encoder>
<!-- 控制臺(tái)彩色打印 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %blue([%X{user}]-[%X{args}]) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{50}) - %cyan(%msg%n)</pattern>
<charset>utf8</charset>
</encoder>
</appender>
ch.qos.logback.core.FileAppender :
把日志添加到文件厨相,一直累加一個(gè)文件炼七,導(dǎo)致文件過(guò)大,查看不方便虱朵,不推薦使用ch.qos.logback.core.rolling.RollingFileAppender :
滾動(dòng)記錄文件莉炉,先將日志記錄到指定文件,當(dāng)符合某個(gè)條件時(shí)卧秘,將日志記錄到其他文件呢袱,比如:超過(guò)單個(gè)文件設(shè)定的大小,按天歸檔日志
<!-- 定時(shí)任務(wù)類設(shè)置單獨(dú)日志文件 -->
<appender name="SCHEDULE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 當(dāng)前日志文件的名字 -->
<File>${LOG_HOME}/schedule.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔日志文件輸出的文件名 -->
<FileNamePattern>${LOG_HOME}/schedule.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 日志文件保留天數(shù) -->
<MaxHistory>7</MaxHistory>
<!-- 單個(gè)日志文件最大的大小 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 對(duì)日志進(jìn)行格式化 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!-- 打印INFO及以上日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
以上表示每天生成一個(gè)新的日志文件翅敌,單個(gè)文件超過(guò)5M生成一個(gè)新的文件羞福,保留最近7天的日志文件
logger
單獨(dú)日志打印:
name 屬性:
1蚯涮、name屬性和LoggerFactory.getLogger("schedule") 中的屬性一樣
2治专、name屬性為指定的包或者類路徑
level: 指定日志級(jí)別
additivity:內(nèi)容是否向上傳遞卖陵,如果為true,否則會(huì)同時(shí)顯示在root配置的認(rèn)日志中
<!--這里的name和業(yè)務(wù)類中的getLogger中的字符串是一樣的-->
<logger name="schedule" level="INFO" additivity="false">
<appender-ref ref="SCHEDULE-APPENDER"/>
</logger>
<!-- org.ylc.note.logback.service 包下的所有日志獨(dú)立打印 (也可以指定到類上)-->
<logger name="org.ylc.note.logback.service" level="INFO" additivity="false">
<appender-ref ref="SERVICE-APPENDER"/>
</logger>
root
根loger张峰,所有的 logger 的上級(jí)泪蔫,設(shè)置需要打印的日志組件
單元測(cè)試
@SpringBootTest
class LogbackApplicationTests {
/**
* 普通類日志
*/
private final Logger normalLogger = LoggerFactory.getLogger(LogbackApplicationTests.class);
/**
* 定時(shí)任務(wù)類日志,這里的name必須和XML中l(wèi)ogger 的name一致喘批,這里為 schedule
*/
private final Logger scheduleLogger = LoggerFactory.getLogger("schedule");
@Autowired
private MyService myService;
/**
* 普通日志測(cè)試
*/
@Test
void normalLogTest() {
normalLogger.info("this is a info log with out args");
normalLogger.error("this is a error log with out args");
}
/**
* 帶參數(shù)的日志測(cè)試
*/
@Test
void argsLogTest() {
MDC.put("user", "魚大仙");
MDC.put("args", "參數(shù)");
normalLogger.info("this is a info log with args");
normalLogger.error("this is a error log with args");
}
/**
* 獨(dú)立日志測(cè)試
* 1撩荣、指定日志名稱
* 2、指定包或者類
*/
@Test
void independentLogTest() {
// 指定名稱
scheduleLogger.info("this is a schedule info log");
scheduleLogger.error("this is a schedule error log");
// 指定包或者類
myService.myLog();
}
}