筆者宣告 該內容參考自 logback官方網站 及一 國外部落格 ,其中關於日誌寫入遠端伺服器筆者沒來得及親自試,只是將官方文件進行了簡單翻譯,部分語法拿捏的並不準確。其中每部分都有指出官網的章節地址,建議看不懂的地方直接閱讀官網。(官網文章還未翻譯完,僅僅翻譯了一部分,筆者也在努力碼字中,未完待續。。。)
已整理為 gitbook,詳細閱讀連結:mingrn.gitbooks.io
Spring-Boot 作為微服務應用,預設整合
logback
日誌框架。
logback
是log4j框架的作者開發的新一代日誌框架,它效率更高、能夠適應諸多的執行環境,同時天然支援SLF4J。筆者剛好接觸SpringBoot不久,之前用spring開發時一直使用的是 log4j2,而SpringBoot 預設整合的 logback 框架日誌風格筆者覺得很贊。所以下決心閱讀下官網,並將自己理解的和原文進行了簡單翻譯,可以用於以後參考,希望也能幫助對logback 一知半解的童鞋。。。。。
關於table錯亂問題:因為筆者使用的markdown編輯器是飛象筆記,同步github(若覺得在此頁面閱讀不夠舒服,可以移步github,我已將markdown轉換成html,直接下載下來在瀏覽器中開啟進行閱讀也可以的[效果很贊!見下圖])以後再進行移植至掘金。所以會有些格式問題,如果發現筆者會馬不停蹄的糾正過來,也感謝各位前輩們的提醒!
markdown轉html效果圖
預設logback日誌列印效果圖
從上圖可以看到,日誌輸出內容元素如下
- 時間日期 :精確到毫秒
- 日誌級別 :ERROR, WARN, INFO, DEBUG or TRACE
- 程式ID
- 分隔符 :
---
標識實際日誌的開始- 執行緒名 :方括號括起來(可能會截斷控制檯輸出
- Logger名 :通常使用原始碼的類名
正如官網所說:
Assuming the configuration files logback-test.xml or logback.xml are not present, logback will default to invoking BasicConfigurator which will set up a minimal configuration. This minimal configuration consists of a ConsoleAppender attached to the root logger. The output is formatted using a PatternLayoutEncoder set to the pattern %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} – %msg%n. Moreover, by default the root logger is assigned the DEBUG level.
logback 基本配置
建立 logback.xml
Spting-Boot 預設整合的
logback
雖然列印些日誌資訊,但是不夠友好。滿足不了我們日常開發需求。因此,我們可以在根目錄下建立logback.xml
或logback-spring.xml
檔案,進行自定義配置In a Spring Boot application, you can specify a Logback XML configuration file as logback.xml or logback-spring.xml in the project classpath. The Spring Boot team however recommends using the -spring variant for your logging configuration, logback-spring.xml is preferred over logback.xml. If you use the standard logback.xml configuration, Spring Boot may not be able to completely control log initialization.
Sping-Boot 預設整合的
logback
列印的日誌樣式個人覺得比較喜歡,而且預設列印的日誌雖然不足以滿足我們日常開發需要。但是我們可以直接在其基礎上做些補充修改就能做到我們想要的日誌輸出,況且如果我們直接自定義日誌輸出的話想在控制檯又想對不同的資訊輸出不同的顏色資訊在進行定義的話也完全是脫褲子放棄多此一舉不是?更何況預設Spring-Boot預設就做了這些開箱即用操作,所以我們直接引用進來即可!筆者使用的 SpringBoot 開發版本為
2.0.2.REALEASE
版本,所以直接找到spring-boot-2.0.2.REALEASE
依賴包。可以看到該依賴包下org.springframework.boot
包級目錄有許多預設配置依賴包類
當然,這裡主要是看
logging
包,在該包中有個logback
包,這裡這裡面放的就是預設logback
日誌配置檔案。
其中主要有四個
xml
配置檔案,我在可以就在我們建立的logback-spring.xml
配置檔案中引入base.xml
配置檔案。
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
</configuration>
複製程式碼
現在我們重新啟動專案就會發現列印的日誌資訊跟沒建立自定義日誌配置檔案效果是一毛一樣。就是因為
springboot
預設配置logback
就是該配置檔案。現在在來看下
base.xml
配置檔案中都是些什麼東東。
<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>
複製程式碼
其中最惹人矚目的就是三個
<include>
defaults.xml
console-appender.xml
:控制檯輸出日誌資訊file-appender.xml
:日誌檔案儲存
所以,若是不直接引用
base.xml
配置檔案,引用另外三個配置檔案作用是相同的。建議單獨引用檔案,且只引用defaults.xml
和console-appender.xml
。因為多個app部署同一環境下可能會導致日誌輸出許可權問題。
logback 基本屬性
現在來看下自定義配置
logback
日誌輸出時需要準守的格式
基本示例(僅做參考)
<configuration debug="true">
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<property name="APP_NAME" value="Logback"/>
<property name="APP_HOME" value="/home/logback"/>
<property name="LOG_HOME_PATH" value="${APP_HOME}/logs"/>
<property name="DEBUG_LOG_FILE" value="${LOG_HOME_PATH}/debug/${APP_NAME}_debug" />
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${DEBUG_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>60</MaxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="INFO">
<appender-ref ref="DEBUG_FILE" />
</root>
<logger name="com.mingrn.logback" level="DEBUG">
<appender-ref ref="DEBUG_FILE"/>
</logger>
<logger name="com.mingrn.logback.repository" level="DEBUG" />
</configuration>
複製程式碼
configuration 標籤
configuration 屬於全域性配置標籤,在配置
logback
日誌時,所有的配置屬性都必須包含在該配置標籤中!
該配置標籤共有四個個節點屬性
scan
預設情況下:配置檔案將每分鐘掃描一次更改,配置檔案如果發生改變,將會被重新載入,預設值為true(官網說明)
<configuration scan="true">
<!--do something-->
</configuration>
複製程式碼
scanPeriod
配置檔案掃描週期,當不設定單位時預設為毫秒級。可以配合
scan
使用,當開啟scan
時,通過是設定該值用於控制配置檔案掃描週期,如每30秒掃描一次配置檔案(官網說明)
<configuration scan="true" scanPeriod="30 seconds" >
<!--do something-->
</configuration>
複製程式碼
###packagingData
在堆疊跟蹤中是否啟用打包資料,預設false。如設定 TRUE 時列印堆疊資料資訊(官網說明)
<configuration packagingData="true">
<!--do something-->
</configuration>
複製程式碼
日誌如下
14:28:48.835 [btpool0-7] INFO c.q.l.demo.prime.PrimeAction - 99 is not a valid value
java.lang.Exception: 99 is invalid
at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na]
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9]
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9]
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12]
at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na]
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12]
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12]
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12]
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]
複製程式碼
debug
實時檢視logback執行狀態,預設值為false。當該值設定為TRUE 時,將列印出logback內部日誌資訊,實時檢視logback執行狀態。(官網說明)
<configuration debug="true">
<include resource="org/springframework/boot/logging/logback/base.xml" />
</configuration>
複製程式碼
statusListener 標籤
statusListener
configuration 的子元素。是個狀態監聽器,通過註冊狀態監聽器以便可以立即採取行動響應狀態訊息,尤其是在logback配置之後發生的訊息。在沒有人工干預的情況下,註冊狀態監聽器是一種方便的方式來監視logback的內部狀態(官網說明)
<configuration>
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
<!--do something-->
</configuration>
複製程式碼
logger 標籤
<logger>
configuration 的子元素。用來設定某個包或及具體的某個類的日誌輸出以及指定<appender>
,logger
只用一個 name 、level
和一個可選的addtivity
屬性(官網說明)
name
name
屬性用來指定logger
約束的包或具體類。
<!--指定包-->
<logger name="com.mingrn.repository"/>
<!--指定類-->
<logger name="com.mingrn.repository.UserRepository"/>
複製程式碼
level
level
屬性設定日誌列印級別。TRACE,、DEBUG、 INFO、 WARN、 ERROR、 ALL 和 OFF,還有一個特俗值 INHERITED 或者同義詞 NULL,代表強制執行上級的級別。如果未設定此屬性,那麼當前 logger 將會繼承上級的級別(root)
<!--指定包-->
<logger name="com.mingrn.repository" level="DEBUG"/>
<!--指定類-->
<logger name="com.mingrn.repository.UserRepository" level="DEBUG"/>
複製程式碼
addtivity
addtivity
是否向上級loger傳遞列印資訊,預設是true。及若這裡設定 true
<logger name="com.mingrn.repository" level="DEBUG" additivity="true"/>
複製程式碼
在輸出日誌時,你會發現控制檯會輸出兩邊,就是因為設定了該屬性。所以一般指定
<logger>
指定包或具體類時該屬性設定為 FALSE。
<logger name="com.mingrn.repository" level="DEBUG" additivity="true"/>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="RUN_FILE" />
</root>
複製程式碼
root 標籤
<root>
configuration 的子元素。該標籤其實就是<logger>
,但他是根<logger>
。該標籤只有一個屬性level
即列印日誌級別。若<logger >
或<appender>
標籤為設定輸出級別時就會預設繼承該標籤設定的級別!同時,若設定<logger >
後並且additivity
設定值為 true 時就會進行傳遞導致 logger 列印日誌後 root 又列印一次日誌!(官網說明)
appender-ref 標籤
<appender-ref>
root 或 logger 的子元素。標籤屬於logger
和root
內部引用標籤。該標籤只有一個屬性ref
用於指定<appender>
標籤的name
值!就是說被指定的appender
輸出級別為root
、logger
指定的級別,若appender
指定級別後只輸出appender
指定的級別日誌。
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="RUN_FILE" />
</root>
<logger name="com.uhope.rl.electornic" level="DEBUG">
<appender-ref ref="DEBUG_FILE"/>
</logger>
複製程式碼
ref
指定具體的
appender
。ref
值為<appender>
的name
屬性值
<logger name="com.uhope.rl.electornic" level="DEBUG">
<appender-ref ref="DEBUG_FILE"/>
</logger>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--do something-->
</appender>
複製程式碼
contextName 標籤
<contextName>
:configuration 的子元素。用於定義 looger 關聯到的上下文,預設上下文名稱為 default。但是可以通過該標籤設定成其他名稱,用於區分不同引用程式的記錄,一旦設定,不能修改。
<configuration>
<contextName>myAppName</contextName>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %contextName [%t] %level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
複製程式碼
property 標籤
<property>
configuration 的子元素。 是個屬性標籤 。值定義
<configuration debug="true">
<!--路徑-->
<property name="USER_HOME" value="/home/sebastien" />
<!--日誌輸出規則-->
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${USER_HOME}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
</configuration>
複製程式碼
引用資源
<configuration>
<property resource="resource.properties" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${USER_HOME}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
複製程式碼
引用檔案
variables.properties 是個檔案
檔案內容:
USER_HOME=/home/sebastien
<configuration>
<property file="src/main/java/chapters/configuration/variables.properties" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${USER_HOME}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
複製程式碼
appender 標籤
appender
configuration 的子元素。它其實也是一種logger
,不過它是一個負責寫日誌的元件。該元件強制使用兩個 屬性值 :name
和class
。
name
:appender 的名稱,該值主要用於<appender-ref>
的ref
。class
:定義appender 的許可權定名或叫元件!
appender 組鍵說明
appender 的組鍵主要指的是 appender 標籤 class 引用的包類
元件分為另種,一種是記錄本地,一種是記錄到遠端。
- 本地 如:
ConsoleAppender
、FileAppender
…- 遠端 如:
SocketAppender
、SSLSocketAppender
ConsoleAppender
主鍵
ConsoleAppender 元件包類:
ch.qos.logback.core.ConsoleAppender
ConsoleAppender 主要作用是將日誌輸出到控制檯,適用於本地。有以下節點屬性
屬性名 | 型別 | 說明 |
---|---|---|
encoder | Encoder | 編碼 |
target | String | System.out 或者 System.err ,預設 System.out |
withJansi | boolean | 預設的jansi屬性設定為false。設定Jansi到true會啟用Jansi庫,它為Windows機器上的ANSI顏色程式碼提供支援。 |
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type -->
<!-- ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
複製程式碼
FileAppender
組鍵
FileAppender 元件包類
ch.qos.logback.core.FileAppender
FileAppender 主要作用是將日誌寫入一個檔案中。目標檔案由檔案選項指定。如果檔案已經存在,它要麼被追加,要麼根據附加屬性的值被截斷,適用於本地。有以下節點屬性
屬性名 | 型別 | 說明 |
---|---|---|
file | String | 被寫入的檔名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。 |
append | boolean | 如果設為true,日誌將會在檔案結尾處增加。如果為false就清空現有檔案。預設為true |
encoder | String | 編碼 |
prudent | boolean | 將日誌安全謹慎的寫入到指定檔案,即使有其他FileAppender也將日誌寫入此檔案中。效率低下,該模式預設值為false。注意:當該值設為true時,append將預設為true |
說明
預設情況下,日誌會立即寫入到底層輸出流。這種預設方式是安全的,因為如果應用程式沒有正確關閉的情況下退出,name日誌不會丟失。不過,為了顯著的增加日誌吞吐量應該將<immediateFlush>
顯示的設為false。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<!-- 為了更高的日誌吞吐量應將 immediateFlush 設為 false -->
<immediateFlush>true</immediateFlush>
<!-- encoders are assigned the type -->
<!-- ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
複製程式碼
RollingFileAppender
組鍵
RollingFileAppender 元件包類
ch.qos.logback.core.rolling.RollingFileAppender
RollingFileAppender 繼承 FileAppender。當滿足一定條件時,具有滾動寫入檔案的特性。說以這是最常用的寫入檔案許可權定名,適用於本地。
該元件具有兩個非常重要的元件 :RollingPolicy
和TriggeringPolicy
有以下節點屬性
屬性名 | 型別 | 說明 |
---|---|---|
file | String | 被寫入的檔名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。 |
append | boolean | 如果設為true,日誌將會在檔案結尾處增加。如果為false就清空現有檔案。預設為true |
encoder | String | 編碼 |
prudent | boolean | 將日誌安全謹慎的寫入到指定檔案,即使有其他FileAppender也將日誌寫入此檔案中。效率低下,該模式預設值為false。注意:當該值設為true時,append將預設為true |
rollingPolicy | RollingPolicy | 滾動出發策略,當發生滾動時,決定 RollingFileAppender 的行為,涉及檔案移動和重新命名。見下文 |
triggeringPolicy | TriggeringPolicy | 告知 RollingFileAppender 合適啟用滾動。見下文 |
RollingFileAppender
組鍵之 RollingPolicy
翻轉策略
RollingPolicy 滾動策略負責翻轉過程中的檔案路徑與重新命名或命名。
RollingPolicy
翻轉策略之 TimeBasedRollingPolicy
翻轉策略
TimeBasedRollingPolicy 包類
ch.qos.logback.core.rolling.TimeBasedRollingPolicy
TimeBasedRollingPolicy 翻轉策略可能是最最流行的翻轉策略。它定義了基於時間的翻轉策略,如日、月等!
TimeBasedRollingPolicy 有一個強制性的屬性<fileNamePattern>
和 幾個非必須的屬性。有以下節點屬性
屬性名 | 型別 | 說明 |
---|---|---|
fileNamePattern | String | 必須屬性,它的值應該包括檔案的名稱,以及適當放置的%d轉換說明符。%d轉換說明符可以包含一個由java.text.SimpleDateFormat 指定的日期和時間模式,如%d{yyyy-MM}。如果省略了日期和時間模式 如%d,則預設時間格式為 yyyy-MM-dd。翻轉週期是從 fileNamePattern 值中推斷出來的。 |
maxHistory | int | 日誌數量最大儲存時間,如設定的時間模式(fileNamePattern )為 yyyy-MM,maxHistory 設為 6。則意味日誌檔案最大儲存6個月。注意,當舊的歸檔日誌檔案被刪除時,為了日誌檔案存檔而建立的任何資料夾都將被適當地刪除。 |
maxFileSize | int | 每個檔案最大儲存大小,如 10M,100M |
totalSizeCap | int | 控制日誌文件儲存的總大,如 3GB、100M |
cleanHistoryOnStart | boolean | 通過將清理歷史記錄設定為true,在appender啟動時執行存檔刪除操作。預設false |
TimeBasedRollingPolicy fileNamePattern 值列舉:
fileNamePattern | Rollover schedule | file |
---|---|---|
/wombat/foo.%d | 預設:yyyy-MM-dd 每天滾動 | /wombat/foo.2018-6-1、 /wombat/foo.2018-6-2 |
/wombat/%d{yyyy/MM}/foo.txt | 每月滾動 | /wombat/2018/1/foo.txt 、/wombat/2018/2/foo.txt |
/wombat/foo.%d{yyyy-ww}.log | 每週滾動 | |
/wombat/foo%d{yyyy-MM-dd_HH}.log | 每時滾動 | |
/wombat/foo%d{yyyy-MM-dd_HH-mm}.log | 每分滾動 | |
/wombat/foo.%d.gz | 每日滾動,自動壓縮為 GZIP格式 | /wombat/foo.2018-6-1.gz |
設定日誌儲存最大時間和最大容量
<file>logFile.log</file>
可以不設
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logFile.log</file>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 30 days` worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
複製程式碼
允許多程式寫入同一日誌檔案
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- Support multiple-JVM writing to the same log file -->
<prudent>true</prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
複製程式碼
設定每個檔案儲存最大大小
<configuration>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="ROLLING" />
</root>
</configuration>
複製程式碼
RollingPolicy
翻轉策略 之 FixedWindowRollingPolicy
翻轉策略
FixedWindowRollingPolicy包類
ch.qos.logback.core.rolling.FixedWindowRollingPolicy
FixedWindowRollingPolicy在滾動時,根據一個固定的視窗演算法,FixedWindowRollingPolicy重新命名檔案
FixedWindowRollingPolicy有一個強制性的屬性<fileNamePattern>
和 幾個非必須的屬性。有以下節點屬性
屬性名 | 型別 | 說明 |
---|---|---|
fileNamePattern | String | 必須屬性,這個選項表示在重新命名日誌檔案時將遵循FixedWindowRollingPolicy的模式。它必須包含字串%i,它將指示插入當前視窗索引值的位置。如 MyLogFile%i.log 用最小索引1和最大索引3將產生檔案 MyLogFile1.log、MyLogFile2.log 和 MyLogFile3.log |
minIndex | int | 最小索引 |
maxIndex | int | 最大索引 |
TimeBasedRollingPolicy fileNamePattern 值列舉
Number of rollovers | Active output target | Archived log files | file |
---|---|---|---|
0 | foo.log | – | 沒有翻轉檔案,日誌將會記錄初始檔案 |
1 | foo.log | foo1.log | 第一次翻轉,檔案foo.log 將會被命名為foo1.log,新檔案 foo.log 將會被建立併成為活動輸出目標。 |
2 | foo.log | foo1.log、foo2.log | 第二次翻轉,檔案foo1.log 將會被命名為foo2.log,檔案foo.log 將會被命名為foo1.log,新檔案 foo.log 將會被建立併成為活動輸出目標。 |
3 | foo.log | foo1.log、foo2.log、foo3.log | 同上 |
4 | foo.log | foo1.log、foo2.log、foo3.log、foo4.log | 同上 |
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
複製程式碼
RollingFileAppender
組鍵之 triggeringPolicy
觸發策略
RollingPolicy 觸發策略實現負責指導RollingFileAppender在何時翻轉。
triggeringPolicy
觸發策略之 SizeBasedTriggeringPolicy
觸發策略
SizeBasedTriggeringPolicy觸發策略官網說明
SizeBasedTriggeringPolicy 包類
ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy
SizeBasedTriggeringPolicy 檢視當前活動檔案的大小,如果超過指定大小會告知 RollingFileAppender 觸發當前活動檔案滾動。
SizeBasedTriggeringPolicy 觸發策略只接受一個屬性maxFileSize
,預設值為10 MB。
maxFileSize
選項可以用位元組、千位元組、兆位元組或千兆位元組來指定,方法是用KB、MB和GB分別設定數值。例如,5000000,5000 KB,5 MB和2 GB都是有效值,前三個是等價的。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>test.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
複製程式碼
SocketAppender and SSLSocketAppender
組鍵
SocketAppender and SSLSocketAppender官網說明
SocketAppender 包類
ch.qos.logback.classic.net.SocketAppender
SSLSocketAppender 包類ch.qos.logback.classic.net.SSLSocketAppender
下方譯文僅供參考,詳細清閱讀官網說明
SocketAppender 和 SSLSocketAppender 許可權定名主要適用於遠端。前面講的許可權定名主要是將日誌記錄在當前伺服器本地機器中。而 SocketAppender 和 SSLSocketAppender 許可權定名則能完美的將日誌寫入遠端機器中。
SocketAppender 能將日誌寫到遠端機器上主要得力於 SocketAppender 被涉及為通過線上路上傳輸序列化的日誌事件體(這裡不知道說)實體。當線上路上使用 SocketAppender 時日誌事件會在 clear 中進行傳送。不過,當我們使用 SSLSocketAppender 時,日誌將會在安全通道中進行傳送。
序列化的實體型別是 LoggingEventVO,它實現了ILoggingEvent
介面。不過,就日誌事件而言,通過遠端記錄日誌是非法入侵的,在反序列化的接收端事件可以被記錄,就如它本地生成的一樣。在不同的機器上執行的多個SocketAppender例項可以將它們的日誌輸出引導到中央日誌伺服器,後者的格式是固定的。SocketAppender不採用相關聯的佈局,因為它將序列化的事件傳送到遠端伺服器。
SocketAppender在傳輸控制協議(TCP)層之上執行,它提供了一個可靠的、有序的、流控制的端到端octet流。因此,如果遠端伺服器是可訪問的,那麼日誌事件最終將到達那裡。否則,如果遠端伺服器當機或無法訪問,日誌事件將被簡單地刪除。如果伺服器重新啟動,則事件傳輸將被透明地恢復。這種透明的重新連線是由一個聯結器執行緒執行的,它定期嘗試連線到伺服器。
日誌事件由本機TCP實現自動緩衝。這意味著,如果與伺服器的連線速度較慢,但仍然比客戶機的事件生成速度快,那麼客戶機就不會受到慢網路連線的影響。但是,如果網路連線速度比事件生成速率慢,那麼客戶端只能在網路速率上取得進展。
尤其在極端情況下,網路連線到伺服器的情況下,客戶端最終會被阻塞。或者,如果網路連結在上升,但是伺服器當機了,客戶端將不會被阻塞,儘管由於伺服器不可用,日誌事件將會丟失。即使一個SocketAppender不再連線到任何記錄器,也不會在聯結器執行緒的存在中被垃圾收集。只有當連線到伺服器的連線被關閉時,聯結器執行緒才會存在。
為了避免這個垃圾收集問題,應該顯式關閉SocketAppender。長時間的應用程式建立、銷燬許多SocketAppender例項應該注意這個垃圾收集問題。大多數其他應用程式可以安全地忽略它。如果承載SocketAppender的JVM在SocketAppender關閉之前退出,無論是顯式的還是隨後的垃圾收集,那麼管道中可能會丟失未傳輸的資料。這是基於Windows系統的常見問題。
為了避免丟失的資料,通常在退出應用程式之前,可以顯式地關閉 socketAppender,或者通過呼叫紅上下文的 stop 方法。
遠端伺服器由remoteHost和port properties標識。SocketAppender 屬性列在下面的表中。SSLSocketAppender支援許多額外的配置屬性,後面詳細介紹。
有以下節點屬性
屬性名 | 型別 | 說明 |
---|---|---|
port | int | 遠端伺服器埠 |
remoteHost | String | 遠端伺服器名 |
ssl | SSLConfiguration | 僅支援SSLSocketAppender,該屬性提供了將由appender使用的SSL配置,參見:官網SSL所述 |
includeCallerData | boolean | 如果為true,那麼呼叫者的資料將對遠端主機可用。預設情況下,沒有傳送給伺服器的呼叫者資料 |
reconnectionDelay | Duration | 持續時間延遲字串,如 10 seconds 表示在每次失敗的連線嘗試到伺服器之間等待的時間。這個選項的預設值是30秒。將這個選項設定為0關閉了重新連線功能。注意,如果成功連線到伺服器,就不會出現聯結器執行緒。 |
queueSize | int | 大於0的整數表示要保留給遠端接收者的日誌事件的數量。當佇列大小為1時,對遠端接收器的事件傳遞是同步的。當佇列的size大於1時,如果列中有可用空間,則會排隊新事件。使用大於1的佇列長度可以通過消除由臨時網路延遲引起的延遲來提高效能。參考 eventDelayLimit 屬性 |
eventDelayLimit | Duration | 持續時間字串,比如 10 seconds 。它表示在刪除事件之前等待的時間,以防本地佇列滿了,也就是說已經包含排隊事件。如果遠端主機持續緩慢地接受事件,可能會發生這種情況。這個選項的預設值是100毫秒。 |
日誌伺服器選項
標準的Logback經典發行版包括兩個可用於從 SocketAppender 或 SSLSocketAppender 接收日誌事件的伺服器
ServerSocketReceiver
SimpleSocketServer
SocketAppender
元件之SimpleSocketServer
SimpleSocketServer應用程式接受兩個命令列引數:
port
和configFile
埠是要監聽的埠,configFile
是 XML 格式的配置指令碼。
<configuration>
<appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
<remoteHost>${host}</remoteHost>
<port>${port}</port>
<reconnectionDelay>10000</reconnectionDelay>
<includeCallerData>${includeCallerData}</includeCallerData>
</appender>
<root level="DEBUG">
<appender-ref ref="SOCKET" />
</root>
</configuration>
複製程式碼
SSLSocketAppender
元件之SimpleSSLSocketServer
SimpleSSLSocketServer要求SimpleSocketServer使用的埠和configFile命令列引數相同。另外,您必須使用命令列中指定的系統屬性來提供日誌伺服器的x.509證照的位置和密碼。
伺服器配置有debug=”true”,在根元素上指定,可以在在伺服器的啟動日誌中看到將要使用的SSL配置。這有助於驗證本地安全策略是否得到了正確的實施!
<configuration debug="true">
<appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
<remoteHost>${host}</remoteHost>
<port>${port}</port>
<reconnectionDelay>10000</reconnectionDelay>
<ssl>
<trustStore>
<location>${truststore}</location>
<password>${password}</password>
</trustStore>
</ssl>
</appender>
<root level="DEBUG">
<appender-ref ref="SOCKET" />
</root>
</configuration>
複製程式碼
ServerSocketAppender and SSLServerSocketAppender
元件
ServerSocketAppender 包類
ch.qos.logback.classic.net.server.ServerSocketAppender
SSLServerSocketAppender 包類ch.qos.logback.classic.net.server.SSLServerSocketAppender
SocketAppender
和SSLSocketAppender
元件是為了讓應用程式通過網路連線到遠端日誌伺服器,目的是向伺服器交付日誌事件。在某些情況下,讓應用程式啟動到遠端日誌伺服器的連線可能不方便或不可行。對於這些情況,Logback提供了ServerSocketAppender
- ServerSocketAppender:被動地監聽TCP套接字,等待來自遠端客戶端的連線。日誌事件被分發給每個連線的客戶端。當沒有客戶端連線時發生的日誌事件被立即丟棄
- SSLSocketAppender:使用一個安全的加密通道將日誌事件分發給每個連線的客戶端。此外,啟用ssl的appender完全支援基於證照的認證,這可以用來確保只有經過授權的客戶端才能連線到appender以接收伐木事件。
ServerSocketAppender、SSLServerSocketAppender 有一下節點屬性
屬性名 | 型別 | 說明 |
---|---|---|
address | String | 應用程式將監聽的本地網路介面地址。如果沒有指定該屬性,appender將偵聽所有網路介面。 |
port | int | 應用程式監聽的埠 |
includeCallerData | boolean | 如果為true時呼叫者資料將對遠端主機可用。預設情況下,沒有傳送給客戶端的呼叫者資料 |
ssl | SSLConfiguration | 僅支援SSLServerSocketAppender 元件,這個屬性提供了將由appender使用的SSL配置 |
ServerSocketAppender元件 示例
<configuration debug="true">
<appender name="SERVER" class="ch.qos.logback.classic.net.server.ServerSocketAppender">
<port>${port}</port>
<includeCallerData>${includeCallerData}</includeCallerData>
</appender>
<root level="debug">
<appender-ref ref="SERVER" />
</root>
</configuration>
複製程式碼
注意:在沒有remoteHost屬性的情況下——這個appender被動地等待來自遠端主機的入站連線,而不是開啟到遠端日誌伺服器的連線。
SSLServerSocketAppender 元件示例
<configuration debug="true">
<appender name="SERVER" class="ch.qos.logback.classic.net.server.SSLServerSocketAppender">
<port>${port}</port>
<includeCallerData>${includeCallerData}</includeCallerData>
<ssl>
<keyStore>
<location>${keystore}</location>
<password>${password}</password>
</keyStore>
</ssl>
</appender>
<root level="debug">
<appender-ref ref="SERVER" />
</root>
</configuration>
複製程式碼