本編文章主要介紹:
如何引入日志苍息?
日志輸出格式以及輸出方式如何配置庄敛?
代碼中如何使用伟叛?
Spring Boot在所有內(nèi)部日志中使用Commons Logging略就,但是默認配置也提供了對常用日志的支持兄墅,如:Java Util Logging踢星,Log4J, Log4J2和Logback。每種Logger都可以通過配置使用控制臺或者文件輸出日志內(nèi)容隙咸。
默認情況下沐悦,Spring Boot會用Logback來記錄日志,并用INFO級別輸出到控制臺
SLF4J——Simple Logging Facade For Java五督,它是一個針對于各類Java日志框架的統(tǒng)一Facade抽象藏否。Java日志框架眾多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)充包。而SLF4J定義了統(tǒng)一的日志抽象接口副签,而真正的日志實現(xiàn)則是在運行時決定的——它提供了各類日志框架的binding。
Logback是log4j框架的作者開發(fā)的新一代日志框架,它效率更高淆储、能夠適應(yīng)諸多的運行環(huán)境冠场,同時天然支持SLF4J。
1.如何引入日志
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
只需要引入 spring-boot -starter-logging 即可如果已經(jīng)引入spring-boot-starter則不需要再引入logging因為其中已經(jīng)包含logging引用本砰。如下圖所示
[圖片上傳失敗...(image-66dc51-1522074332943)]
2.日志輸出格式以及輸出方式如何配置
創(chuàng)建一個logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan 配置文件如果發(fā)生改變慈鸠,將會被重新加載 scanPeriod 檢測間隔時間-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>spring-boot-log</contextName>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!-- 普通日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log/spring-boot-log-info.log</file>
<!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志命名:單個文件大于128MB 按照時間+自增i 生成log文件 -->
<fileNamePattern>log/spring-boot-log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>128MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 最大保存時間:30天-->
<maxHistory>30</maxHistory>
</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>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 錯誤日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log/spring-boot-log-error.log</file>
<!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志命名:單個文件大于2MB 按照時間+自增i 生成log文件 -->
<fileNamePattern>log/spring-boot-log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 最大保存時間:180天-->
<maxHistory>180</maxHistory>
</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>
<!-- 日志級別過濾器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過濾的級別 -->
<level>ERROR</level>
<!-- 匹配時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 控制臺 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志格式 -->
<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>INFO</level>
</filter>
</appender>
<!-- additivity 避免執(zhí)行2次 -->
<logger name="com.wen" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
下面對節(jié)點屬性做一個簡單的介紹
根節(jié)點<configuration>
包含的屬性
scan:當此屬性設(shè)置為true時青团,配置文件如果發(fā)生改變,將會被重新加載咖楣,默認值為true督笆。
scanPeriod:設(shè)置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位诱贿,默認單位是毫秒娃肿。當scan為true時,此屬性生效珠十。默認的時間間隔為1分鐘料扰。
debug:當此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息焙蹭,實時查看logback運行狀態(tài)晒杈。默認值為false。
根節(jié)點<configuration>
的子節(jié)點:
<configuration>
下面一共有2個屬性孔厉,3個子節(jié)點拯钻,分別是:
屬性一:設(shè)置上下文名稱<contextName>
<contextName>spring-boot-log</contextName>
每個logger都關(guān)聯(lián)到logger上下文,默認上下文名稱為“default”撰豺。但可以使用設(shè)置成其他名字粪般,用于區(qū)分不同應(yīng)用程序的記錄。一旦設(shè)置污桦,不能修改,可以通過%contextName來打印日志上下文名稱亩歹。
屬性二:設(shè)置變量<property>
用來定義變量值的標簽, 有兩個屬性凡橱,name和value小作;其中name的值是變量的名稱,value的值時變量定義的值梭纹。通過定義的值會被插入到logger上下文中躲惰。定義變量后,可以使“${}”來使用變量变抽。
<property name="path" value="H:\\boot/log.log" />
子節(jié)點一<appender>
appender用來格式化日志輸出節(jié)點础拨,有倆個屬性name和class氮块,class用來指定哪種輸出策略,常用就是控制臺輸出策略和文件輸出策略诡宗。
控制臺
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志格式 -->
<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>INFO</level>
</filter>
</appender>
ThresholdFilter為系統(tǒng)定義的攔截器塔沃,例如我們用ThresholdFilter來過濾掉ERROR級別以下的日志不輸出到文件中蝠引。如果不用記得注釋掉,不然你控制臺會發(fā)現(xiàn)沒日志
輸出到文件RollingFileAppender
另一種常見的日志輸出到文件蛀柴,隨著應(yīng)用的運行時間越來越長螃概,日志也會增長的越來越多,將他們輸出到同一個文件并非一個好辦法鸽疾。RollingFileAppender用于切分文件日志:
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log/spring-boot-log-info.log</file>
<!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志命名:單個文件大于128MB 按照時間+自增i 生成log文件 -->
<fileNamePattern>log/spring-boot-log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>128MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 最大保存時間:30天-->
<maxHistory>30</maxHistory>
</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>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
子節(jié)點二<root>
root節(jié)點是必選節(jié)點吊洼,用來指定最基礎(chǔ)的日志輸出級別,只有一個level屬性制肮。
level:用來設(shè)置打印級別冒窍,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設(shè)置為INHERITED或者同義詞NULL豺鼻。
默認是DEBUG综液。
可以包含零個或多個元素,標識這個appender將會添加到這個loger儒飒。
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
子節(jié)點三<loger>
<logger name="com.itstyle" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</logger>
name:用來指定受此loger約束的某一個包或者具體的某一個類谬莹。
level:用來設(shè)置打印級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF约素,還有一個特俗值INHERITED或者同義詞NULL届良,代表強制執(zhí)行上級的級別。如果未設(shè)置此屬性圣猎,那么當前l(fā)oger將會繼承上級的級別。
3代碼中如何使用
使用的話只需要在使用的類中加入
private Logger logger = LoggerFactory.getLogger(this.getClass());
logger.info("index");
輸出日志既可運行項目發(fā)現(xiàn)
已經(jīng)生成了這兩個log文件
4.對于Logback的簡單說明:
1乞而、Logback為取代log4j而生
Logback是由log4j創(chuàng)始人Ceki Gülcü設(shè)計的又一個開源日志組件送悔。logback當前分成三個模塊:logback-core,logback- classic和logback-access。
2爪模、Logback的核心對象:Logger欠啤、Appender、Layout
Logback主要建立于Logger屋灌、Appender 和 Layout 這三個類之上洁段。
1 : Logger:日志的記錄器,把它關(guān)聯(lián)到應(yīng)用的對應(yīng)的context上后共郭,主要用于存放日志對象祠丝,也可以定義日志類型疾呻、級別。Logger對象一般多定義為靜態(tài)常量写半,如:
2: Appender:用于指定日志輸出的目的地岸蜗,目的地可以是控制臺,文件叠蝇,遠程套接字璃岳,Mysql,PostreSQL悔捶,Oracle铃慷,和其他數(shù)據(jù)庫
3:layout:負責把時間轉(zhuǎn)換成字符串,格式話的日志信息的輸出.
3 Level的幼小的級別蜕该,Logger可以分配級別犁柜,級別包括:trace,Debug蛇损,Info赁温,Warn,和Error淤齐,定義于
ch.qos.logback.classic.Level類股囊,程序會打印高于或者等于所設(shè)置級別的izhi,設(shè)置級別的日志等級越高更啄,打印出來的日
志就越少稚疹,如果設(shè)置級別為info的日志信息可以被輸出,小于該級別的如DEBUG不會被輸出祭务,為確保所有l(wèi)ogger都能最
終繼承一個級別内狗,因此根的logger也總是有級別,一般而言义锥,這個級別是DEBUG
4:三值邏輯
在logback的過濾器基于三值邏輯柳沙,允許把他們組裝成為鏈條,從而組裝成任意符合過濾策略拌倍,過濾器很大的程度上受到了 iptables的啟發(fā)赂鲤,這里所謂三值邏輯是說:
如果返回Deny, 那么記錄時間立即被拋棄柱恤,不在經(jīng)過剩余的過濾器
如果返回Neutral数初,那么有序列表里的下一個過濾器會接著處理記錄事件
如果返回Accept,那么記錄時間被立即處理梗顺,不再經(jīng)過剩余的過濾器
5 Filter 過濾
logback-classic 提供兩種類型的過濾:
5.1: 常規(guī)過濾器
5.2:TuroboFilter過濾器
參考文章:http://tengj.top/2017/04/05/springboot7/
文章鏈接:http://www.haha174.top/article/details/252573
源碼鏈接:https://github.com/haha174/boot.git
推薦一篇文章:http://mp.weixin.qq.com/s?__biz=MzA3MTU0MDg2OQ==&mid=2247483731&idx=1&sn=35332c0e058d02cacbacd30707db9a5a&chksm=9f2d48b9a85ac1af4dc84ee7fccdecd1be010f82f13a40c78516cb488965b24e8d427e93fb23&mpshare=1&scene=23&srcid=1015ORKoX6SDjipznhzALSvc#rd
歡迎關(guān)注泡孩,更多福利