背景
spring boot在所有內部日志中使用commons logging,但是默認配置也提供了對常用日志的支持,如:java util logging,log4j, log4j2和logback。每種logger都可以通過配置使用控制臺或者文件輸出日志內容。
默認日志logback
slf4j——simple logging facade for java,它是一個針對于各類java日志框架的統一facade抽象。java日志框架眾多——常用的有java.util.logging, log4j, logback,commons-logging, spring框架使用的是jakarta commons logging api (jcl)。而slf4j定義了統一的日志抽象接口,而真正的日志實現則是在運行時決定的——它提供了各類日志框架的binding。
logback是log4j框架的作者開發的新一代日志框架,它效率更高、能夠適應諸多的運行環境,同時天然支持slf4j。
默認情況下,spring boot會用logback來記錄日志,并用info級別輸出到控制臺。在運行應用程序和其他例子時,你應該已經看到很多info級別的日志了。
springboot初始化了日志的默認實現,只要我們在配置文件添加對應的配置即可。
比如
1
2
3
4
5
6
7
8
9
|
logging: file: logs/application-debug.log pattern: console: "%d %-5level %logger : %msg%n" file: "%d %-5level [%thread] %logger : %msg%n" level: org.springframework.web: error com.howtodoinjava: info org.hibernate: error |
可以指定日志文件名,覆蓋默認的pattern,指定不同日志級別。
但依舊有很多局限性。比如,默認的文件方案是:
e:\maven\repository\org\springframework\boot\spring-boot\1.5.13.release\spring-boot-1.5.13.release.jar!\org\springframework\boot\logging\logback\file-appender.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<appender name= "file" class = "ch.qos.logback.core.rolling.rollingfileappender" > <encoder> <pattern>${file_log_pattern}</pattern> </encoder> <file>${log_file}</file> <rollingpolicy class = "ch.qos.logback.core.rolling.fixedwindowrollingpolicy" > <filenamepattern>${log_file}.%i</filenamepattern> </rollingpolicy> <triggeringpolicy class = "ch.qos.logback.core.rolling.sizebasedtriggeringpolicy" > <maxfilesize>10mb</maxfilesize> </triggeringpolicy> </appender> |
只是超過10m就生成一個新文件。而我們還遇到過日志把磁盤打滿的情況??隙ㄐ枰〞r清理,還想要按照日期生成文件。這樣,僅僅配置文件是不夠的,需要我們自己定義。
自定義
實現自定義就是在resource下新增logback-spring.xml, 然后編寫我們的配置方案。就是完全跳過spring的默認配置了。但我又想偷懶,還想用spring的配置,但只是修改個別,比如file。
spring默認配置文件 e:\maven\repository\org\springframework\boot\spring-boot\1.5.13.release\spring-boot-1.5.13.release.jar!\org\springframework\boot\logging\logback\base.xml
我們只要
1
|
<include resource= "org/springframework/boot/logging/logback/base.xml" /> |
就可以拿過來直接用。
最初我也是這樣做的,但后面發現有些東西是不能覆蓋的。比如內置的日志文件名,所以,最后把base里的內容單獨抽離出來用了。
logback-spring.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
<?xml version= "1.0" encoding= "utf-8" ?> <configuration scan= "true" scanperiod= "60 seconds" debug= "false" > <springproperty scope= "context" name= "appname" source= "spring.application.name" defaultvalue= "application" /> <springproperty scope= "context" name= "log.path" source= "logging.path" defaultvalue= "logs" /> <springproperty scope= "context" name= "logstashurl" source= "logstash.url" defaultvalue= "localhost:4560" /> <!--<include resource= "org/springframework/boot/logging/logback/base.xml" />--> <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" /> <!--輸出到文件--> <appender name= "time_file" class = "ch.qos.logback.core.rolling.rollingfileappender" > <!--<rollingpolicy class = "ch.qos.logback.core.rolling.timebasedrollingpolicy" >--> <!-- <filenamepattern>${log_file}.%d{yyyy-mm-dd}.log</filenamepattern>--> <!-- <maxhistory> 7 </maxhistory>--> <!--</rollingpolicy>--> <rollingpolicy class = "ch.qos.logback.core.rolling.sizeandtimebasedrollingpolicy" > <!-- daily rollover --> <filenamepattern>${log_file}.%d{yyyy-mm-dd}.%i.log</filenamepattern> <maxhistory> 7 </maxhistory> <maxfilesize>100mb</maxfilesize> <totalsizecap>1gb</totalsizecap> </rollingpolicy> <encoder> <!--<pattern>%d{yyyy-mm-dd hh:mm:ss.sss} ${appname} %x{req.remotehost} %x{req.requesturi} %x{req.useragent} %x{req.method} - [%thread] %-5level %logger{ 36 } - %msg%n</pattern>--> <pattern>${file_log_pattern}</pattern> </encoder> </appender> <!-- 輸出到logstash--> <appender name= "logstash" class = "net.logstash.logback.appender.logstashtcpsocketappender" > <destination>${logstashurl}</destination> <encoder charset= "utf-8" class = "net.logstash.logback.encoder.logstashencoder" /> </appender> <root level= "info" > <appender-ref ref= "console" /> <appender-ref ref= "time_file" /> </root> <springprofile name= "dev" > <logger name= "com.test.demo.mapper" level= "debug" > </logger> </springprofile> <springprofile name= "local, test, prod" > <root level= "warn" > <appender-ref ref= "logstash" /> </root> </springprofile> </configuration> |
同時,需要讀取配置文件, 配置文件依舊生效
1
2
3
|
logging: path: logs file: ${logging.path}/${spring.application.name} |
這里,include拿到spring默認配置,但移除了base里的root配置,去掉了file。并自定義file。file規則是保存7天,每100m分一個文件,總大小不超過1g。
1
2
3
4
5
6
|
<springproperty scope= "context" name= "appname" source= "spring.application.name" defaultvalue= "application" /> <springproperty scope= "context" name= "log.path" source= "logging.path" defaultvalue= "logs" /> <springproperty scope= "context" name= "logstashurl" source= "logstash.url" defaultvalue= "localhost:4560" /> |
這一塊配置并沒有使用,只是放這里備份。logback里想要使用spring的配置文件的變量,只能通過這種方式讀取。因為我配置了logstash,需要讀取logstash的url,所以這樣做。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.cnblogs.com/woshimrf/p/springboot-logback-config.html