Springboot 集成logback 日誌框架簡介

筆者聲明 該內容參考自 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效果圖算法

html效果圖

默認logback日誌打印效果圖spring

logback

從上圖能夠看到,日誌輸出內容元素以下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

logback 基本配置

建立 logback.xml

Spting-Boot 默認集成的 logback 雖然打印些日誌信息,可是不夠友好。知足不了咱們平常開發需求。所以,咱們能夠在根目錄下建立 logback.xmllogback-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 日誌配置文件。

logging-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.xmlconsole-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 的子元素。標籤屬於 loggerroot內部引用標籤。該標籤只有一個屬性 ref 用於指定 <appender> 標籤的 name 值!就是說被指定的 appender 輸出級別爲 rootlogger 指定的級別,若 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

指定具體的 appenderref 值爲 <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 ,不過它是一個負責寫日誌的組件。該組件強制使用兩個 屬性值 :nameclass

  • name :appender 的名稱,該值主要用於 <appender-ref>ref
  • class:定義appender 的權限定名或叫組件!

appender 組鍵說明

appender 的組鍵主要指的是 appender 標籤 class 引用的包類 組件分爲另種,一種是記錄本地,一種是記錄到遠程。

  • 本地 如:ConsoleAppenderFileAppender...
  • 遠程 如:SocketAppenderSSLSocketAppender

ConsoleAppender主鍵

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官網說明

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官網說明

RollingFileAppender 組件包類 ch.qos.logback.core.rolling.RollingFileAppender RollingFileAppender 繼承 FileAppender。當知足必定條件時,具備滾動寫入文件的特性。說以這是最經常使用的寫入文件權限定名,適用於本地。 該組件具備兩個很是重要的組件 :RollingPolicyTriggeringPolicy

有如下節點屬性

屬性名 類型 說明
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 滾動策略負責翻轉過程當中的文件路徑與重命名或命名。

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觸發策略

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 官網說明

SimpleSocketServer應用程序接受兩個命令行參數:portconfigFile 端口是要監聽的端口,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官網說明

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 and SSLServerSocketAppender官網說明

ServerSocketAppender 包類 ch.qos.logback.classic.net.server.ServerSocketAppender SSLServerSocketAppender 包類 ch.qos.logback.classic.net.server.SSLServerSocketAppender

SocketAppenderSSLSocketAppender 組件是爲了讓應用程序經過網絡鏈接到遠程日誌服務器,目的是向服務器交付日誌事件。在某些狀況下,讓應用程序啓動到遠程日誌服務器的鏈接可能不方便或不可行。對於這些狀況,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 組件

SMTPAppender官網說明

相關文章
相關標籤/搜索