spring boot中的日志入门
日志通常不會在需求階段作為一個功能單獨提出來,也不會在產品方案中看到它的細節。但是,這絲毫不影響它在任何一個系統中的重要地位。
報警系統與日志系統的關系
為了保證服務的高可用,發現問題一定要及時,定位并解決問題一定要迅速。
生產環境一旦出現問題,預警系統就會通過郵件,短信甚至電話的方式實施多維轟炸模式,確保相關負責人不會錯過每一個可能的Bug。
而預警系統判斷疑似Bug大部分來源于日志系統。比如說某個微服務接口由于各種原因導致頻繁調用出錯,此時調用段就會捕獲這樣的異常并打印ERROR級別的日子,當該錯誤日志達到一定出現次數的時候就會觸發報警系統。
try {// 調用某服務 } catch(Exception e) {Logger.error("錯誤信息", e); }
因此日志十分重要。
Spring Boot的默認日志
Spring Boot默認使用Logback日志系統,如果不需要更改為其他日志系統,如Log4j2等,則無需多余的配置,Logback默認將日志打印到控制臺上。
要使用Logback,原則上是需要添加Maven依賴的。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId> </dependency>
但是由于Spring Boot項目中一般會引用spring-boot-starter或spring-boot-starter-web,這兩個起步依賴中都已經包含了對spring-boot-starter-logging的依賴,所以無需額外添加依賴,配置logback-spring.xml就可以了。以logback-spring.xml命名,spring會自動識別加載。
如果要切換成Log4j2的話,就需要在pom.xml中排除Spring Boot自帶的commons-logging,然后再引入log4j2的依賴,否則會導致jar包沖突。
<!--排除 commons‐logging--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>commons‐logging</groupId><artifactId>commons‐logging</artifactId></exclusion></exclusions> </dependency><!--引入log4j2 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
然后再引入log4j.properties文件就可以了。
### set log levels ### log4j.rootLogger = debug,stdout,D,E### 輸出到控制臺 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} ===== %5p %c{ 1 }:%L - %m%n### 輸出到日志文件 ### #log4j.appender.D = org.apache.log4j.DailyRollingFileAppender #log4j.appender.D.File = logs/log.log #log4j.appender.D.Append = true #log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級別以上的日志 #log4j.appender.D.layout = org.apache.log4j.PatternLayout #log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n### 保存異常信息到單獨文件 ### #log4j.appender.D = org.apache.log4j.DailyRollingFileAppender #log4j.appender.D.File = logs/error.log ## 異常日志文件名 #log4j.appender.D.Append = true #log4j.appender.D.Threshold = ERROR ## 只輸出ERROR級別以上的日志!!! #log4j.appender.D.layout = org.apache.log4j.PatternLayout #log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
日志的級別
日志的級別從低到高:trace(跟蹤)<debug(調試)<info(信息)<warm(警告)<error(錯誤),設置的級別越低,顯示的日志級別的信息越多。例如如果設置的日志級別是info的話,低于info級別的trace或debug的日志都不會顯示。
Spring Boot在不對日志進行任何設置的情況下,默認的日志root級別是info,即輸出的是info級別及以上的日志。
用一個測試類來測試日志的輸出級別:
@RunWith(SpringRunner.class) @SpringBootTest public class SpringbootCacheApplicationTests {private static final Logger log = LoggerFactory.getLogger(SpringbootCacheApplicationTests.class);/*** 測試 日志級別:* 級別由低到高: trace < debug < info < warm < error 設置的級別越低顯示的日志信息越多。* 可以調整輸出的日志級別,只會顯示高于設置級別的日志。*/@Testpublic void testLog() {log.trace("這是trace日志。。。");log.debug("這是debug日志。。。");// spring 默認設置的級別是info級別,沒有指定級別的情況下,會使用spring默認的root級別(顯示的是info級別的信息)log.info("這是info日志。。。");log.warn("這是warm日志。。。");log.error("這是error日志。。。");} }
測試的結果是只會輸出info級別以上的日志信息(trace和debug不打印在控制臺)。因此在開發環境中如果要打印SQL語句等debug調試信息的話,就要對日志級別進行設置。
日志輸出信息的組成部分
1.時間日期:精確到毫秒。
2.日志級別:ERROR, WARN, INFO, DEBUG 或 TRACE。
3.分隔符:標識實際日志的開始。
4.進程ID。
5.線程名:需要用方括號括起來,不然可能會截斷控制臺的輸出。
6.Logger的名稱:通常是源代碼的類名。
7.日志主要內容。
日志的配置
日志可以通過兩種方式配置,一種是application.properties或application.yml文件配置(Spring Boot全局配置文件);一種是Logback的xml文件配置。第一種方式需要把所有的日志配置寫在properties或者yml文件里面,配置遷移不方便,寫的感覺也有點亂,很繁雜,對log4j2的支持也不好。因此推薦使用的是第二種,配置遷移只要復制粘貼,然后改一下里面的配置就好了。
通過application.properties或application.yml文件配置。
這部分的內容就不說了,實際中用得比較少(其實是懶),如果需要的話可以到Spring Boot的官方文檔中查找相關的配置:https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/html/boot-features-logging.html#_environment_properties。
通過Logback的xml文件配置。
由于日志服務一般都在ApplicationContext(應用上下文)創建前就初始化了,它并不是必須通過Spring的配置文件控制。因此通過系統屬性和傳統的Spring Boot外部配置文件依然可以很好地支持日志控制和日志管理。
根據不同的日志系統,只要按照指定的規則組織配置文件名,就能被正常加載。
| Logback | logback-spring.xml logback-spring.groovy logback.xml logback.groovy |
| Log4j | log4j-spring.properties log4j-spring.xml log4j.properties log4j.xml |
| Log4j2 | log4j2-spring.xml log4j2.xml |
| JDK (Java Util Logging) | logging.properties |
Spring Boot官方推薦優先使用帶有-spring的文件名作為你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日志配置文件,Spring Boot可以為它添加一些Spring Boot特有的配置項(下面會提到)。
一般情況下都是按照默認的命名規則去命名,并把文件放在src/main/resources目錄下面即可。但是如果你想要完全掌控日志配置,但是又不想用locagback.xml作為Logback配置的名字,就需要通過logging.config屬性去執行自定義的名字,例如:
logging.config=classpath:logging-config.xml
雖然一般是并不需要改變配置文件的名字,但是如果你想要針對不同運行時Profile(不同的環境,比如生產環境和開發環境的切換)使用不同的日志配置,這個功能就會很有用。
這里示例一個logback-spring.xml的配置文件的內容:
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。 scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。 --> <configuration scan="false" scanPeriod="60 seconds" debug="false"><!-- 定義日志的根目錄 --><property name="LOG_HOME" value="/app/log" /><!-- 定義日志文件名稱 --><property name="appName" value="ll-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"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></layout></appender><!-- 滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件 --> <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 指定日志文件的名稱 --><file>${LOG_HOME}/${appName}.log</file><!--當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--滾動時產生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進行日志滾動%i:當文件大小超過maxFileSize時,按照i進行文件滾動--><fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern><!--可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每天滾動,且maxHistory是365,則只保存最近365天的文件,刪除之前的舊文件。注意,刪除舊文件是,那些為了歸檔而創建的目錄也會被刪除。--><MaxHistory>365</MaxHistory><!--當日志文件超過maxFileSize指定的大小是,根據上面提到的%i進行日志文件滾動 注意此處配置SizeBasedTriggeringPolicy是無法實現按文件大小進行滾動的,必須配置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:表示只用當前logger的appender-ref,true:表示當前logger的appender-ref和rootLogger的appender-ref都有效--><!--logger是記錄Logger對象輸出的日志級別的sercvice實現類引入日志對象可以查看方法的報錯信息以及打印sql語句,public static final Logger logger = LoggerFactory.getLogger(SysUserServiceImpl.class);生產環境:一般把level設為error,可以記錄錯誤的日志信息,畢竟主要是要記錄錯誤信息進行錯誤定位。開發環境:類中引入了logger日志對象時,level級別用info,debug都可以,都有錯誤信息輸出。--><!-- hibernate logger --><logger name="com.ll" level="info" /><!-- Spring framework logger --><logger name="org.springframework" level="debug" additivity="false"></logger><!-- root與logger是父子關系,沒有特別定義則默認為root,任何一個類只會和一個logger對應,要么是定義的logger,要么是root,判斷的關鍵在于找到這個logger,然后判斷這個logger的appender和level。 --><!-- 一般用默認的info就可以 --><root level="info"><!-- 控制臺輸出日志--><appender-ref ref="stdout" /><!--開發環境:不需要往文件記錄日志,可以把這個appender-ref ref="appLogAppender"注釋,上面那個往文件寫日志的appender也要注釋,不然每天都產生一個空文件;生產環境:需要往文件記錄日志,此時appender-ref ref="appLogAppender"就不能注釋了,不然沒日志記錄到文件,上面那個往文件寫日志的appender也要放開。--><appender-ref ref="appLogAppender" /></root> </configuration>
配置文件其實不需要記太多東西,只要知道在什么地方要改什么配置就行了。
日志的使用
在完成了日志系統的配置之后,就可以愉快地享受日志系統帶來的快樂了(滑稽)。
日志系統的使用方法就是在業務代碼中使用Logger對象調用相應的方法完成日志的輸出。
聲明并初始化一個Logger對象。
public static final Logger logger = LoggerFactory.getLogger(日志要監控的類.class);
調用相應的方法輸出日志。
try {// 業務代碼 } catch(Exception e) {logger.error("你的代碼出錯了,笨蛋。", e); }
這樣就能在程序運行時輸出相應的日志信息。
?
"我一個人在路上,偶爾想起你。"
轉載于:https://www.cnblogs.com/yanggb/p/10966888.html
總結
以上是生活随笔為你收集整理的spring boot中的日志入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jenkins ssl证书报错问题解决
- 下一篇: Educational Round 66