筆者聲明 該內容參考自 logback官方網站 及一 國外博客 ,其中關於日誌寫入遠程服務器筆者沒來得及親自試,只是將官方文檔進行了簡單翻譯,部分語法拿捏的並不許確。其中每部分都有指出官網的章節地址,建議看不懂的地方直接閱讀官網。(官網文章還未翻譯完,僅僅翻譯了一部分,筆者也在努力碼字中,未完待續。。。)html
已整理爲 gitbook,詳細閱讀連接:mingrn.gitbooks.iojava
Spring-Boot 做爲微服務應用,默認集成
logback
日誌框架。logback
是log4j框架的做者開發的新一代日誌框架,它效率更高、可以適應諸多的運行環境,同時自然支持SLF4J。git筆者恰好接觸SpringBoot不久,以前用spring開發時一直使用的是 log4j2,而SpringBoot 默認集成的 logback 框架日誌風格筆者以爲很贊。因此下決心閱讀下官網,並將本身理解的和原文進行了簡單翻譯,能夠用於之後參考,但願也能幫助對logback 只知其一;不知其二的童鞋。。。。。github
關於table錯亂問題:由於筆者使用的markdown編輯器是飛象筆記,同步github(若以爲在此頁面閱讀不夠舒服,能夠移步github,我已將markdown轉換成html,直接下載下來在瀏覽器中打開進行閱讀也能夠的[效果很贊!見下圖])之後再進行移植至掘金。因此會有些格式問題,若是發現筆者會快馬加鞭的糾正過來,也感謝各位前輩們的提醒!web
markdown轉html效果圖算法
默認logback日誌打印效果圖spring
從上圖能夠看到,日誌輸出內容元素以下apache
- 時間日期 :精確到毫秒
- 日誌級別 :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.api
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
日誌輸出時須要準守的格式
<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 屬於全局配置標籤,在配置
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
configuration 的子元素。是個狀態監聽器,經過註冊狀態監聽器以即可以當即採起行動響應狀態消息,尤爲是在logback配置以後發生的消息。在沒有人工干預的狀況下,註冊狀態監聽器是一種方便的方式來監視logback的內部狀態(官網說明)
<configuration>
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
<!--do something-->
</configuration>
複製代碼
<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>
configuration 的子元素。該標籤其實就是<logger>
,但他是根<logger>
。該標籤只有一個屬性level
即打印日誌級別。若<logger >
或<appender>
標籤爲設置輸出級別時就會默認繼承該標籤設置的級別!同時,若設置<logger >
後而且additivity
設置值爲 true 時就會進行傳遞致使 logger 打印日誌後 root 又打印一第二天志!(官網說明)
<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>
: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>
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
configuration 的子元素。它其實也是一種logger
,不過它是一個負責寫日誌的組件。該組件強制使用兩個 屬性值 :name
和class
。
name
:appender 的名稱,該值主要用於<appender-ref>
的ref
。class
:定義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-一、 /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>
複製代碼
SMTPAppender
組件