在開發(fā)中打印內(nèi)容,使用 System.out.println() 和 Log4j 應(yīng)當(dāng)是人人皆知的方法了。
其實在開發(fā)中我們不建議使用 System.out 因為大量的使用 System.out 會增加資源的消耗。
而Log4j 更為靈活在性能上也相比 System.out 要高,我們可以配置輸出級別,可以指定多個日志文件分別記錄不同的日志。
使用 System.out 是在當(dāng)前線程執(zhí)行的,寫入文件也是寫入完畢后才繼續(xù)執(zhí)行下面的程序。而使用Log工具不但可以控制日志是否輸出,怎么輸出,它的處理機制也是通知寫日志,繼續(xù)執(zhí)行后面的代碼不必等日志寫完。
如非必要,建議大家不要使用控制臺輸出,因為控制臺輸出沒有優(yōu)先級會顯得輸出太亂。
個人推薦使用 SLF4J(Simple Logging Facade For Java)的logback來輸出日志,其比log4j 要好,因為他效率更高。
spring Boot 提供了一套日志系統(tǒng),logback是最優(yōu)先的選擇。配置了logback.xml可以利用Spring Boot提供的默認日志配置:
1
2
3
4
5
|
<? xml version = "1.0" encoding = "UTF-8" ?> < configuration > < include resource = "org/springframework/boot/logging/logback/base.xml" /> < logger name = "org.springframework.web" level = "DEBUG" /> </ configuration > |
這樣就定義了一個 捕獲 org.springframework.web 的日志,日志級別是 DEBUG,上面引用的base.xml 文件內(nèi)容為:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<? xml version = "1.0" encoding = "UTF-8" ?> <!-- Base logback configuration provided for compatibility with Spring Boot 1.1 --> < included > < include resource = "org/springframework/boot/logging/logback/defaults.xml" /> < property name = "LOG_FILE" value = "${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}" /> < include resource = "org/springframework/boot/logging/logback/console-appender.xml" /> < include resource = "org/springframework/boot/logging/logback/file-appender.xml" /> < root level = "INFO" > < appender-ref ref = "CONSOLE" /> < appender-ref ref = "FILE" /> </ root > </ included > |
Spring Boot的日志系統(tǒng)預(yù)先定義了一些系統(tǒng)變量:
PID,當(dāng)前進程ID{LOG_FILE},Spring Boot配置文件(application.properties|.yml)中l(wèi)ogging.file的值
${LOG_PATH}, Spring Boot配置文件中l(wèi)ogging.path的值
同時默認情況下包含另個appender——一個是控制臺,一個是文件,分別定義在console-appender.xml和file-appender.xml中。同時對于應(yīng)用的日志級別也可以通過application.properties進行定義:
1
2
|
logging.level.org.springframework.web=DEBUG logging.level.org.springboot.sample=TRACE |
這樣相當(dāng)于我們在logback.xml 中配置的對應(yīng)的日志級別。名稱以logging.level開頭,后面跟要輸入日志的包名。
如果在 logback.xml 和 application.properties 中定義了相同的配置(如都配置了 org.springframework.web)但是輸出級別不同,則實際上 application.properties 的優(yōu)先級高于 logback.xml *
我們既然使用了maven來管理項目,我們就可以根據(jù)不同環(huán)境來定義不同的日志輸出,在 logback-spring.xml 中使用 springProfile 節(jié)點來定義,方法如下:
注意文件名稱不是logback.xml,想使用spring擴展profile支持,要以logback-spring.xml命名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<? xml version = "1.0" encoding = "UTF-8" ?> < configuration > < include resource = "org/springframework/boot/logging/logback/base.xml" /> < logger name = "org.springframework.web" level = "INFO" /> < logger name = "org.springboot.sample" level = "TRACE" /> < springProfile name = "dev" > < logger name = "org.springboot.sample" level = "DEBUG" /> </ springProfile > < springProfile name = "staging" > < logger name = "org.springboot.sample" level = "INFO" /> </ springProfile > </ configuration > |
如上我們默認為 org.springboot.sample 定義了TRACE級別的輸出,下面又定義兩個 springProfile ,分別是 dev 和 staging,輸出級別分別是 DEBUG 和 INFO
我們可以啟動服務(wù)的時候指定 profile (如不指定使用默認),如指定staging 的方式為:
1
|
java -jar myapp.jar --spring.profiles.active=staging |
下面介紹兩種常用的Appender
ConsoleAppender
Logback使用appender來定義日志輸出,在開發(fā)過程中最常用的是將日志輸出到控制臺:
1
2
3
4
5
6
7
8
|
< appender name = "consoleAppender" class = "ch.qos.logback.core.ConsoleAppender" > < encoder > < Pattern >.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n</ Pattern > </ encoder > < filter class = "ch.qos.logback.classic.filter.ThresholdFilter" > < level >TRACE</ level > </ filter > </ appender > |
表示對日志進行編碼
- %d{HH:mm:ss.SSS}——日志輸出時間
- %thread——輸出日志的進程名字,這在Web應(yīng)用以及異步任務(wù)處理中很有用
- %-5level——日志級別,并且使用5個字符靠左對齊
- %logger{36}——日志輸出者的名字
- %msg——日志消息
- %n——平臺的換行符
在這種格式下一條日志的輸出結(jié)果如下:
1
|
10:12:51.012 [threadName] DEBUG o.c.d.r.util.LoggingResponseFilter |
RollingFileAppender
另一種常見的日志輸出到文件,隨著應(yīng)用的運行時間越來越長,日志也會增長的越來越多,將他們輸出到同一個文件并非一個好辦法。RollingFileAppender用于切分文件日志:
1
2
3
4
5
6
7
8
9
10
11
12
|
< appender name = "dailyRollingFileAppender" class = "ch.qos.logback.core.rolling.RollingFileAppender" > < File >/data/log/app.log</ File > < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <!-- daily rollover --> < FileNamePattern >rest-demo.%d{yyyy-MM-dd}.log</ FileNamePattern > <!-- keep 30 days' worth of history --> < maxHistory >30</ maxHistory > </ rollingPolicy > < encoder > < Pattern >%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</ Pattern > </ encoder > </ appender > |
其中重要的是rollingPolicy的定義,上例中rest-demo.%d{yyyy-MM-dd}.log定義了日志的切分方式——把每一天的日志歸檔到一個文件中,30表示只保留最近30天的日志,以防止日志填滿整個磁盤空間。同理,可以使用%d{yyyy-MM-dd_HH-mm}來定義精確到分的日志切分方式。
Sentry
Sentry是一個統(tǒng)一的日志跟蹤平臺,在傳統(tǒng)的日志管理中,都是在服務(wù)器上通過tail, vim等工具查看日志,并且不同的日志位置也個不相同,而Sentry則是將這些日志(主要是錯誤日志)通過統(tǒng)一的接口收集起來,并且提供跟蹤、管理的功能,使得應(yīng)用程序的錯誤、Bug能夠即時被解決。
Sentry提供了Java庫——Raven Java,Java應(yīng)用程序能夠在捕獲異常后將其發(fā)送到Sentry服務(wù)器中,另一方面它包含了各類日志框架的支持,以Logbakc為例:
1
2
3
4
5
|
< dependency > < groupId >net.kencochrane.raven</ groupId > < artifactId >raven-logback</ artifactId > < version >6.0.0</ version > </ dependency > |
在logback.xml中定義appender:
1
2
3
4
5
6
7
8
9
10
11
|
< configuration > < appender name = "Sentry" class = "net.kencochrane.raven.logback.SentryAppender" > < dsn >https://publicKey:secretKey@host:port/1?options</ dsn > < tags >tag1:value1,tag2:value2</ tags > <!-- Optional, allows to select the ravenFactory --> <!--<ravenFactory>net.kencochrane.raven.DefaultRavenFactory</ravenFactory>--> </ appender > < root level = "warn" > < appender-ref ref = "Sentry" /> </ root > </ configuration > |
我們推薦在這個中加入用于過濾 ERROR 級別的日志。
總結(jié)
在Spring Boot 中記錄日志只需兩步:
1、在 src/main/resources 下面創(chuàng)建logback.xml 文件,并按上面講述的進行配置。
或者使用最簡單的方法在 application 配置文件中配置。
2、在Java代碼中創(chuàng)建實例,并在需要輸出日志的地方使用。
1
2
3
4
5
6
7
8
|
// 在Java類中創(chuàng)建 logger 實例 private static final Logger logger = LoggerFactory.getLogger(SpringBootSampleApplication. class ); // 在方法中使用日志輸出,如 public void logTest() { logger.debug( "日志輸出測試 Debug" ); logger.trace( "日志輸出測試 Trace" ); logger.info( "日志輸出測試 Info" ); } |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/catoop/article/details/50501714