當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringBoot和日志框架:缘由,日志框架的选择,使用,自定义配置,日志框架切换
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot和日志框架:缘由,日志框架的选择,使用,自定义配置,日志框架切换
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
日志框架
緣由
如果像我們初學(xué)者,想知道代碼運行到哪里了,一般都是會System.out.println() 進行輸出到控制臺查看代碼運行的情況,好知道代碼錯誤在哪里 但是大型的系統(tǒng)里面,如果有很多的打印語句嵌套在里面的話, 就是很多多余的無效語句,只是為了讓程序員知道而已 后來呢大家就想寫一些框架來記錄和知道系統(tǒng)運行時的一些運行消息 就變成了日志框架,但是后來需求就越來越多了,如果需要更新系統(tǒng)里面的 日志框架的話,也需要重新修改一下系統(tǒng)的API,這樣就很麻煩 所以后來聰明的程序員就寫了一個統(tǒng)一的接口層:日志門面 它就是一個日志的抽象層 然后我們系統(tǒng)里面就只需要導(dǎo)入日志的實現(xiàn)就可以了框架
現(xiàn)在市面上的日志框架JUL(java.util.logging),JCL(ApacheCommons Logging),Log4j,Log4j2,Logback、SLF4j、jboss-logging| 日志門面 | 日志實現(xiàn) |
| JCL(Jakarta Commons Logging) ,SLF4j(Simple Logging Facade for Java) ,jboss-logging | Log4j , JUL(java.util.logging),Log4j2, Logback |
使用
官網(wǎng)
以后開發(fā)的時候,日志記錄方法的調(diào)用, 不應(yīng)該來直接調(diào)用日志的實現(xiàn)類,而是調(diào)用日志抽象層里面的方法; 給系統(tǒng)里面導(dǎo)入slf4j的jar和 logback的實現(xiàn)jar每一個日志的實現(xiàn)框架都有自己的配置文件。 使用slf4j以后,配置文件還是做成日志實現(xiàn)框架自己本身的配置文件;比如下面的官網(wǎng)給的圖中, SLF4J是統(tǒng)一的接口層,如果沒有導(dǎo)入實現(xiàn)層,就調(diào)用的啥都沒 如果導(dǎo)入的是logback,就是調(diào)用這個的實現(xiàn)類的方法 如果想使用老的log4j層,就需要加入一個適配器layer就行了 適配器一般是實現(xiàn)SLF4J的方法,然后實際調(diào)用的是log4j的方法 官網(wǎng)給的例子: import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class HelloWorld {public static void main(String[] args) {Logger logger = LoggerFactory.getLogger(HelloWorld.class);logger.info("Hello World");} } 但是上面只是單個框架進行整合的時候進行切換日志的實現(xiàn)的方法 但是實際上我們在寫項目的時候肯定是不止只有一個框架的,而是多個框架進行整合 比如Spring我們導(dǎo)包的時候需要導(dǎo)入commons-logging日志包, Hibernate需要導(dǎo)入的是jboss-logging日志包 但是這樣五花八門的怎么進行統(tǒng)一呢?官網(wǎng)進行了說明
SpringBoot的日志選擇
里面導(dǎo)入了這個 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 所以SpringBoot底層也是使用slf4j+logback的方式進行日志記錄 SpringBoot也把其他的日志都替換成了slf4j;注意: 如果我們要引入其他框架,一定要把這個框架的默認日志依賴移除掉SpringBoot能自動適配所有的日志,而且底層使用slf4j+logback的方式記錄日志,引入其他框架的時候,只需要把這個框架依賴的日志框架排除掉即可;我們來看看SpringBoot是不是將這些框架的依賴日志框架排除<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions> </dependency> 我們還可以看下中間轉(zhuǎn)換包是如何進行轉(zhuǎn)換的 就是下面這樣進行偷梁換柱SpringBoot的日志使用
@org.junit.Testpublic void MyLogger(){//這是記錄器Logger logger = LoggerFactory.getLogger(getClass());logger.trace("trace級別日志");logger.debug("debug級別日志");logger.info("info級別日志");logger.warn("warn級別日志");logger.error("error級別日志");/*日志的級別;由低到高 trace<debug<info<warn<error可以調(diào)整輸出的日志級別;日志就只會在這個級別以以后的高級別生效SpringBoot默認給我們使用的是info級別的,沒有指定級別的就用SpringBoot默認規(guī)定的級別;root級別*/} #這是修改日志級別,只是修改了jane包下的日志級別的輸出 logging.level.jane=trace#這是指定日志輸出的文件 #可以指定完整的絕對路徑,如果沒有指定路徑就在當前項目下生成對應(yīng)的日志文件 #logging.file=G:/springboot.log#這是在當前磁盤根路徑(c盤)創(chuàng)建spring文件夾和子文件夾log, #然后創(chuàng)建默認的文件spring.log作為默認文件輸出 #logging.path=/spring/log#logging.file和logging.path兩個本來是沖突的,指定其中一個就行了# 在控制臺輸出的日志的格式 logging.pattern.console=%d{yyyy‐MM‐dd} [%thread] %‐5level %logger{50} ‐ %msg%n # 指定文件中日志輸出的格式 logging.pattern.file=%d{yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{50} ==== %msg%n日志輸出格式:%d表示日期時間,%thread表示線程名,%‐5level:級別從左顯示5個字符寬度%logger{50} 表示logger名字最長50個字符,否則按照句點分割。%msg:日志消息,%n是換行符 例如:%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%nSpringBoot的日志自定義配置
SpringBoot的日志框架的默認配置寫在的地方 官網(wǎng)的自定義配置說法 給類路徑下放上每個日志框架自己的配置文件即可;SpringBoot就不使用他默認配置的了 就好比如上面說的,我們使用的是Logback框架 然后在類路徑里面放一個 logback-spring.xml , logback-spring.groovy , logback.xml or logback.groovy 這些中的其中一個就可以了 然后下面還介紹了一個更加高級點的東西 如果你寫的是:logback.xml:直接就被日志框架識別了; 如果你寫的是logback-spring.xml:日志框架就不直接加載日志的配置項,由SpringBoot解析日志配置,可以使用SpringBoot的高級Profile功能比如你寫的是logback-spring.xml,就可以在里面寫:<springProfile name="dev"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern></springProfile> 如果你寫的是logback.xml還寫上面的高級功能,就會報錯:no applicable action for [springProfile] 下面是一個例子:logback-spring.xml <?xml version="1.0" encoding="UTF-8"?> <!-- scan:當此屬性設(shè)置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認值為true。 scanPeriod:設(shè)置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 debug:當此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。 --> <configuration scan="false" scanPeriod="60 seconds" debug="false"><!-- 定義日志的根目錄 --><property name="LOG_HOME" value="/app/log" /><!-- 定義日志文件名稱 --><property name="appName" value="atguigu-springboot"></property><!-- ch.qos.logback.core.ConsoleAppender 表示控制臺輸出 --><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><!--日志輸出格式:%d表示日期時間,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%logger{50} 表示logger名字最長50個字符,否則按照句點分割。 %msg:日志消息,%n是換行符--><layout class="ch.qos.logback.classic.PatternLayout"><springProfile name="dev"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern></springProfile><springProfile name="!dev"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern></springProfile></layout></appender><!-- 滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件 --> <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 指定日志文件的名稱 --><file>${LOG_HOME}/${appName}.log</file><!--當發(fā)生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名TimeBasedRollingPolicy: 最常用的滾動策略,它根據(jù)時間來制定滾動策略,既負責(zé)滾動也負責(zé)出發(fā)滾動。--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--滾動時產(chǎn)生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進行日志滾動 %i:當文件大小超過maxFileSize時,按照i進行文件滾動--><fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern><!-- 可選節(jié)點,控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件。假設(shè)設(shè)置每天滾動,且maxHistory是365,則只保存最近365天的文件,刪除之前的舊文件。注意,刪除舊文件是,那些為了歸檔而創(chuàng)建的目錄也會被刪除。--><MaxHistory>365</MaxHistory><!-- 當日志文件超過maxFileSize指定的大小是,根據(jù)上面提到的%i進行日志文件滾動 注意此處配置SizeBasedTriggeringPolicy是無法實現(xiàn)按文件大小進行滾動的,必須配置timeBasedFileNamingAndTriggeringPolicy--><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 日志輸出格式: --> <layout class="ch.qos.logback.classic.PatternLayout"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern></layout></appender><!-- logger主要用于存放日志對象,也可以定義日志類型、級別name:表示匹配的logger類型前綴,也就是包的前半部分level:要記錄的日志級別,包括 TRACE < DEBUG < INFO < WARN < ERRORadditivity:作用在于children-logger是否使用 rootLogger配置的appender進行輸出,false:表示只用當前l(fā)ogger的appender-ref,true:表示當前l(fā)ogger的appender-ref和rootLogger的appender-ref都有效--><!-- hibernate logger --><logger name="jane" level="debug" /><!-- Spring framework logger --><logger name="org.springframework" level="debug" additivity="false"></logger><!-- root與logger是父子關(guān)系,沒有特別定義則默認為root,任何一個類只會和一個logger對應(yīng),要么是定義的logger,要么是root,判斷的關(guān)鍵在于找到這個logger,然后判斷這個logger的appender和level。 --><root level="info"><appender-ref ref="stdout" /><appender-ref ref="appLogAppender" /></root> </configuration>SpringBoot的切換日志框架
將SLF4J+logback切換成SLF4J+log4j
想按照官網(wǎng)提供的那個圖排除logback‐classic,log4j‐over‐slf4j這些依賴然后導(dǎo)入slf4j-log4j12依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><artifactId>logback-classic</artifactId><groupId>ch.qos.logback</groupId></exclusion><exclusion><artifactId>log4j-over-slf4j</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions> </dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId> </dependency>將SLF4J+logback切換成SLF4J+log4j2
這個是將spring-boot-starter-logging進行排除 然后將它替換成spring-boot-starter-log4j2 所以后面導(dǎo)入spring-boot-starter-log4j2就行了 因為默認使用的是spring-boot-starter-logging <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions> </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId> </dependency>總結(jié)
以上是生活随笔為你收集整理的SpringBoot和日志框架:缘由,日志框架的选择,使用,自定义配置,日志框架切换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring原理学习(一):BeanFa
- 下一篇: gradle idea java ssm