spring-boot集成slf4j(二)logback配置詳解

一、configuration

根節點:configuration,作為頂級標簽, 可以用來配置一些lockback的全局屬性,常見的屬性如下:

(1)scan=“true” :scan是否開啟自動掃描,監控配置文件更新,生效。
(2)scanPeriod=“60 seconds” :掃描的頻率
(3)debug=“false”:是否開啟logback的debug模式,注意這里和日志的debug無關,開啟后啟動之前會打印一些logback自身的信息。

二、property

1、作用:

property 標簽可以定義一些屬性變量,供其他配置地方通過${xxx}使用。

springProperty 標簽可以獲取spring上下文里的屬性。

三、conversionRule

1、作用:

定義轉換器,可以用來對日志進行特殊的轉換,比如,SpringBoot后啟動項目控制臺默認會帶有彩色日志樣式,是因為使用了org.springframework.boot.logging.logback.ColorConverter顏色轉換器,會把日志用AnsiOutput進行輸出。如果自定義了logback,會覆蓋默認的配置。

conversionRule一般在property中引用

2、自定義conversionRule

demo:

import ch.qos.logback.classic.pattern.MessageConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;public class LogabckMessageConverter extends MessageConverter {@Overridepublic String convert(ILoggingEvent event) {String msg = event.getMessage();if ("ERROR".equals(event.getLevel().toString())) {msg = "系統異常";}return msg;}
}
<configuration><conversionRule conversionWord="mycon" converterClass="org.demo.annotation.convert.LogabckMessageConverter"/><!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度 %msg:日志消息,%n是換行符--><property name="LOG_PATTERN"value="%d{yyyy-MM-dd HH:mm:ss.SSS}[%t][%highlight(%p)][%green(%c).%M:%yellow(%L)] %ex{3}- %mycon %n"/><!-- 定義日志存儲的路徑,不要配置相對路徑 --><property name="FILE_PATH" value="usr/logs/demo.%d{yyyy-MM-dd}.%i.log" /><!-- 控制臺輸出日志 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 按照上面配置的LOG_PATTERN來打印日志 --><pattern>${LOG_PATTERN}</pattern></encoder></appender><!--每天生成一個日志文件,保存15天的日志文件。rollingFile是用來切分文件的 --><appender name="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${FILE_PATH}</fileNamePattern><!-- keep 15 days' worth of history --><maxHistory>15</maxHistory><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- 日志文件的最大大小,超過這個大小重新生成一個文件 --><maxFileSize>1MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><pattern>${LOG_PATTERN}</pattern></encoder></appender><!-- project default level --><logger name="src" level="INFO" /><!-- 日志輸出級別 常用的日志級別按照從高到低依次為:ERROR、WARN、INFO、DEBUG。 --><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="FILE" /></root>
</configuration>

?測試:

  @RequestMapping("/test")public String test(@Valid ParamDTO paramDTO) {log.info("paramDTO:{}", paramDTO);log.error ("出錯了paramDTO:{}", paramDTO);return codes;}

查看控制臺打印:

四、appender

1、作用:

<appender>是<configuration>的子節點,是負責寫日志的組件。Appender是logback中的最核心組件之一,寫日志渠道包括:控制臺、日志文件、網絡輸出等。<appender>有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名。

2、結構

借用一張官方的繼承體系圖:

途中可以看出常用的appender有三個:

2.1、ConsoleAppender

日志寫入到控制臺,底層會調用jdk的?System.out?和?System.err。

有以下子節點:

    <encoder>?: 對日志進行格式化。

    <target> : 字符串?System.out?或者?System.err?,默認?System.out?;

<appender name="CONSOLE_OUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>UTF-8</charset></encoder>
</appender>
<!-- 表示打印到控制臺 --><appender name="limeFlogger" class="ch.qos.logback.core.ConsoleAppender"><!-- encoder 默認配置為PatternLayoutEncoder --> <encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><target>System.err</target></appender>
?2.2、FileAppender

日志寫入到指定文件,有以下子節點:

<file> : 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。

<append> : 如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。

<encoder> : 對記錄事件進行格式化。
<prudent> : 如果是 true,日志會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是 false。
immediateFlush:默認情況下true,每個日志事件都會立即刷新到文件輸出流中。這種方法更安全,因為如果應用程序退出時沒有正確關閉appender,則不會丟失日志記錄事件。但是,想顯著提高日志的吞吐量,可以將 limateFlush 屬性設置為 false。

<appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>testFile.log</file><append>true</append><immediateFlush>true</immediateFlush><encoder><pattern>${FILE_LOG_PATTERN}</pattern></encoder>
</appender>
2.3、RollingFileAppender

實際生產環境寫文件日志的首選appender,可以實現滾動式寫日志,在寫日志的過程中如果符合某些條件策略時,會重新寫入到新的文件,還可以將歷史日志進行歸檔、定期刪除等。解決了FileAppender方式會導致日志都在一個文件中,文件會越來越大,難以打開。常用屬性配置:

<file>?

被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。

<append>

?如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。

<encoder> : 對記錄事件進行格式化。

<rollingPolicy>?

當發生滾動時,決定?RollingFileAppender?的行為,涉及文件移動和重命名。常見的有:

①?TimeBasedRollingPolicy?

常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責觸發滾動。有以下子節點:

          <fileNamePattern> :?必要節點,包含文件名及“%d”轉換符,?“%d”可以包含一個Java.text.SimpleDateFormat指定的時間格式,如:%d{yyyy-MM}。如果直接使用 %d,默認格式是 yyyy-MM-dd。RollingFileAppender?的file字節點可有可無,通過設置file,可以為活動文件和歸檔文件指定不同位置,當前日志總是記錄到file指定的文件(活動文件),活動文件的名字不會改變;如果沒設置file,活動文件的名字會根據fileNamePattern?的值,每隔一段時間改變一次。“/”或者“\”會被當做目錄分隔符。

          <maxHistory> :?可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每個月滾動,且<maxHistory>是6,則只保存最近6個月的文件,刪除之前的舊文件。注意,刪除舊文件是,那些為了歸檔而創建的目錄也會被刪除。

 ②?FixedWindowRollingPolicy :?根據固定窗口算法重命名文件的滾動策略。有以下子節點:

          <minIndex> : 窗口索引最小值。

          <maxIndex> : 窗口索引最大值,當用戶指定的窗口過大時,會自動將窗口設置為12。

          <fileNamePattern?> :?必須包含“%i”例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產生歸檔文件mylog1.log和mylog2.log。還可以指定文件壓縮選項,例如,mylog%i.log.gz 或者 沒有log%i.log.zip。

<triggeringPolicy>?

告知?RollingFileAppender?何時激活滾動。

<prudent> : 當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1、不支持也不允許文件壓縮,2、不能設置file屬性,必須留空。

<appender name="FILE_OUT" class="ch.qos.logback.core.rolling.RollingFileAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_LOG_PATTERN}</pattern><charset>UTF-8</charset></encoder><file>${LOG_FILE}</file><!-- 滾動日志策略: SizeAndTimeBasedRollingPolicy 根據文件大小和時間進行分割歸檔--><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 指定滾動文件名稱的生成規則 --><fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern><!-- 超過最大磁盤限制后是否刪除歸檔文件 --><cleanHistoryOnStart>true</cleanHistoryOnStart><!-- 單個日志文件大小 --><maxFileSize>20MB</maxFileSize><!-- 歸檔文件占用磁盤總大小,超過后會根據cleanHistoryOnStart實行,決定是否刪除 --><totalSizeCap>1GB</totalSizeCap><!-- 保留的歷史歸檔日志文件個數 --><maxHistory>10</maxHistory></rollingPolicy>
</appender>
2.4、AsyncAppender

異步寫日志,本身不做真是的日志寫入,需要配置包裹其它appender,在于高并發下,加如日志隊列緩存,減少寫磁盤日志的IO次數。可以根據實際情況決定是否使用 。

2.5、不常用的appender

SocketAppender 寫入socket、SMTPAppender 寫入郵件、DBAppender 寫入數據庫

五、encoder

1、作用

節點<appender>的子節點<encoder>,<encoder> ?負責兩件事,一是把日志信息轉換成字節數組,二是把字節數組寫入到輸出流。

Encoder在0.9.19中引入,作用負責將日志事件轉換為字節數組,并將字節數組輸出到輸出流中(具體的appender輸出流)。在此之前的版本主要使用Layout,Layout只能將日志事件轉換為String。Layout還無法控制何時寫出日志,因此Layout無法對日志事件進行批量控制,相比之下,Encoder不僅可以完全控制寫出的字節的格式,而且還可以控制何時(以及是否)寫出這些字節內容。

目前PatternLayoutEncoder?是唯一有用的且默認的encoder?,有一個<pattern>節點,用來設置日志的輸入格式。使用“%”加“轉換符”方式,如果要輸出“%”,則必須用“\”對“\%”進行轉義。

最常用的編碼器,通常指定:編碼和日志打印規則

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } [%15.15t] %-40.40logger{39} %-4line : %m%n%wEx</pattern><charset>UTF-8</charset>
</encoder>

<pattern>里面的轉換符說明:?‘

轉換符作用
c?{length?}?
lo?{length?}?
logger?{length?}?

輸出日志的logger名,可有一個整形參數,功能是縮短logger名,設置為0表示只輸入logger最右邊點符號之后的字符串。

Conversion specifierLogger nameResult
%loggermainPackage.sub.sample.BarmainPackage.sub.sample.Bar
%logger{0}mainPackage.sub.sample.BarBar
%logger{5}mainPackage.sub.sample.Barm.s.s.Bar
%logger{10}mainPackage.sub.sample.Barm.s.s.Bar
%logger{15}mainPackage.sub.sample.Barm.s.sample.Bar
%logger{16}mainPackage.sub.sample.Barm.sub.sample.Bar
%logger{26}mainPackage.sub.sample.BarmainPackage.sub.sample.Bar

C?{length?}?
class?{length?}?
輸出執行記錄請求的調用者的全限定名。參數與上面的一樣。盡量避免使用,除非執行速度不造成任何問題。
contextName?
cn?
輸出上下文名稱。
d?{pattern?}?
date?{pattern?}?
輸出日志的打印日志,模式語法與java.text.SimpleDateFormat?兼容。
Conversion PatternResult
%d2006-10-20 14:06:49,812
%date2006-10-20 14:06:49,812
%date{ISO8601}2006-10-20 14:06:49,812
%date{HH:mm:ss.SSS}14:06:49.812
%date{dd?MMM?yyyy?;HH:mm:ss.SSS}20 oct. 2006;14:06:49.812

F 或 file輸出執行記錄請求的java源文件名。盡量避免使用,除非執行速度不造成任何問題。
caller{depth}caller{depth, evaluator-1, ... evaluator-n}輸出生成日志的調用者的位置信息,整數選項表示輸出信息深度。

例如,?%caller{2}?? 輸出為:

0    [main] DEBUG - logging statement 
Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)

例如,?%caller{3}?? 輸出為:

16   [main] DEBUG - logging statement 
Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
Caller+2   at mainPackage.ConfigTester.main(ConfigTester.java:38)
L 或 line輸出執行日志請求的行號。盡量避免使用,除非執行速度不造成任何問題。
m 或msg 或 message

輸出應用程序提供的信息。

M 或者method輸出執行日志請求的方法名。盡量避免使用,除非執行速度不造成任何問題。
n輸出平臺先關的分行符“\n”或者“\r\n”。
p 或者 le 或者 level輸出日志級別。
r 或者 relative輸出從程序啟動到創建日志記錄的時間,單位是毫秒
t 或者thread輸出產生日志的線程名。
replace(p?){r, t}

p?為日志內容,r?是正則表達式,將p?中符合r?的內容替換為t?。

例如, "%replace(%msg){'\s', ''}"

格式修飾符,與轉換符共同使用:

    可選的格式修飾符位于“%”和轉換符之間。

    第一個可選修飾符是左對齊?標志,符號是減號“-”;接著是可選的最小寬度?修飾符,用十進制數表示。如果字符小于最小寬度,則左填充或右填充,默認是左填充(即右對齊),填充符為空格。如果字符大于最小寬度,字符永遠不會被截斷。最大寬度?修飾符,符號是點號"."后面加十進制數。如果字符大于最大寬度,則從前面截斷。點符號“.”后面加減號“-”在加數字,表示從尾部截斷。

    例如:%-4relative 表示,將輸出從程序啟動到創建日志記錄的時間 進行左對齊 且最小寬度為4。

六、Layout

layout根據pattern規則,將日志事件轉換為具體的日志字符串,我們配置的各種日志打印格式,都是由layout解析翻譯成字符串。由于官方規則太多,我們以一個具體的例介紹一些常用的規則符號:

七、Filters

1、作用

 過濾器,執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日志將立即被拋棄不再經過其他過濾器;返回NEUTRAL,有序列表里的下個過濾器過接著處理日志;返回ACCEPT,日志會被立即處理,不再經過剩余過濾器。

過濾器被添加到<appender>?中,為<appender>?添加一個或多個過濾器后,可以用任意條件對日志進行過濾。<appender>?有多個過濾器時,按照配置順序執行。

2、常用的過濾器?

(1)LevelFilter?

級別過濾器,根據日志級別進行過濾。如果日志級別等于配置級別,過濾器會根據 onMath 和 onMismatch 接收或拒絕日志。

    有以下子節點 :?

      <level> : 設置過濾級別。

      <onMatch> : 用于配置符合過濾條件的操作。

      <onMismatch> : 用于配置不符合過濾條件的操作。

    例如:將過濾器的日志級別配置為info,所有info級別的日志交給appender處理,非info級別的日志,被過濾掉。

(2)ThresholdFilter?

?臨界值過濾器,過濾掉低于指定臨界值的日志。當日志級別等于或高于臨界值時,過濾器返回NEUTRAL;當日志級別低于臨界值時,日志會被拒絕。

    有以下子節點 :?

      <level> : 設置過濾級別。

    例如:過濾掉所有低于info級別的日志。

(3)EvaluatorFilter?

求值過濾器,評估、鑒別日志是否符合指定條件。

    有以下子節點:

      <evaluator> :?鑒別器,常用的鑒別器是JaninoEventEvaluato,也是默認的鑒別器,它以任意的Java布爾值表達式作為求值條件,求值條件在配置文件解釋過成功被動態編譯,布爾值表達式返回true就表示符合過濾條件。

        evaluator有個子標簽<expression>,用于配置求值條件。

        求值表達式作用于當前日志,logback向求值表達式暴露日志的各種字段:

NameTypeDescription
eventLoggingEvent與記錄請求相關聯的原始記錄事件,下面所有變量都來自event,例如,event.getMessage()返回下面"message"相同的字符串
messageString日志的原始消息,例如,設有logger mylogger,"name"的值是"AUB",對于 mylogger.info("Hello {}",name); "Hello {}"就是原始消息。
formatedMessageString日志被各式化的消息,例如,設有logger mylogger,"name"的值是"AUB",對于 mylogger.info("Hello {}",name); "Hello Aub"就是格式化后的消息。
loggerStringlogger 名。
loggerContextLoggerContextVO日志所屬的logger上下文。
levelint級別對應的整數值,所以?level > INFO?是正確的表達式。
timeStamplong創建日志的時間戳。
markerMarker與日志請求相關聯的Marker對象,注意“Marker”有可能為null,所以你要確保它不能是null。
mdcMap包含創建日志期間的MDC所有值得map。訪問方法是:mdc.get("myKey")?。mdc.get()返回的是Object不是String,要想調用String的方法就要強轉,例如,

((String)?mdc.get("k")).contains("val")?.MDC可能為null,調用時注意。

throwablejava.lang.Throwable如果沒有異常與日志關聯"throwable" 變量為 null. 不幸的是, "throwable" 不能被序列化。在遠程系統上永遠為null,對于與位置無關的表達式請使用下面的變量throwableProxy
throwableProxyIThrowableProxy與日志事件關聯的異常代理。如果沒有異常與日志事件關聯,則變量"throwableProxy" 為 null. 當異常被關聯到日志事件時,"throwableProxy" 在遠程系統上不會為null

 <onMatch>:用于配置符合過濾條件的操作

      <onMismatch>:用于配置不符合過濾條件的操作

    例如:過濾掉所有日志消息中不包含“billing”字符串的日志。

<matcher> :?

          匹配器,盡管可以使用String類的matches()方法進行模式匹配,但會導致每次調用過濾器時都會創建一個新的Pattern對象,為了消除這種開銷,可以預定義一個或多個matcher對象,定以后就可以在求值表達式中重復引用。<matcher>是<evaluator>的子標簽。

          <matcher>中包含兩個子標簽,一個是<name>,用于定義matcher的名字,求值表達式中使用這個名字來引用matcher;另一個是<regex>,用于配置匹配條件。

filter 日志過濾器,

logback 的內置 filter 有一下幾種:

級別過濾器 ch.qos.logback.classic.filter.LevelFilter。對指定級別的日志進行具體的操作

閥值過濾器 ch.qos.logback.classic.filter.ThresholdFilter。

表達式過濾器 ch.qos.logback.core.filter.EvaluatorFilter。

Groovy的表達式 ch.qos.logback.classic.boolex.GEventEvaluator。

Java的表達式ch.qos.logback.classic.boolex.JaninoEventEvaluator。使用 Janino 解析java script。

包含標記 ch.qos.logback.classic.boolex.OnMarkerEvaluator

<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 過濾的級別 --><level>INFO</level><!-- 匹配時的操作:接收(記錄) --><onMatch>ACCEPT</onMatch><!-- 不匹配時的操作:拒絕(不記錄) --><onMismatch>DENY</onMismatch>
</filter>

八、root

<root level="WARN"><appender-ref ref="FILE"/><appender-ref ref="ERROR"/><if condition='property("env").contains("local")'><then><!-- this only enable in local --><appender-ref ref="CONSOLE"/></then></if></root>

?1、定義日志文件的存儲地址
  <!-- 應用名稱 --><property name="APP_NAME" value="log-test"/><!--定義日志文件的存儲地址--><property name="LOG_HOME" value="/logs/${APP_NAME}"/>
2、定義日志格式?

(1)普通格式

    <!-- 定義日志格式  --><property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>
參數含義
%d表示日期(也可以使用"%date")
%-5level表示級別從左顯示5個字符寬度
%thread表示線程名稱
%-30.30logger{30}表示如果logger的名稱小于30,就“-”指定左對齊;如果其名稱長于30字符,就從左邊較遠輸出的字符截掉,保持logger的名字長度最終限制為30個字符
%msg表示日志消息
%n表示換行符

(2)高亮

   <!-- 高亮日志格式  --><property name="HIGHLIGHT_PATTERN" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
參數含義
%yellow()%green(%highlight()顏色高亮
%d表示日期(也可以使用"%date")
%-5level表示級別從左顯示5個字符寬度
%thread表示線程名稱
%-30.30logger{30}表示如果logger的名稱小于30,就“-”指定左對齊;如果其名稱長于30字符,就從左邊較遠輸出的字符截掉,保持logger的名字長度最終限制為30個字符
%msg表示日志消息
%n表示換行符
3、定義日志的輸出級別
<!-- 日志輸出級別 --><logger name="org.springframework" level="INFO"/><logger name="com.wtyy.*" level="INFO"/><root level="INFO"><appender-ref ref="CONSOLE-WITH-HIGHLIGHT"/><appender-ref ref="FILE"/></root>

(1)?標簽:logger

僅有一個name屬性,一個可選的level和一個可選的additivity屬性

屬性name: 用來指定受此logger約束的某一個包或者具體的某一個類。
屬性level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。 如果未設置此屬性,那么當前logger將會繼承上級的級別
屬性additivity: 是否向上級logger傳遞打印信息。默認是true。同一樣,可以包含零個或多個元素,標識這個appender將會添加到這個logger
(2)標簽:root
root也是logger元素,但是它是根loger并且只有一個level屬性,可以包含零個或多個元素,標識這個appender將會添加到這個loger
level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。默認是DEBUG。

trace(跟蹤):一般用來追蹤詳細的程序運行流,比如程序的運行過程中,運行到了哪一個方法,進入了哪一條分支。通過 trace程序的運行流程,可以判斷程序是否按照期望的邏輯在運行
debug(調試 ):這類日志往往用在判斷是否有出現bug的場景,且往往記錄了代碼運行的詳細信息,比如方法調用傳入的參數信息
info(消息):用來記錄程序運行的一些關鍵信息,它不像trace那樣記錄程序運行的整個流程,也不像debug那樣為了解決問題而記錄詳細的信息。info記錄的是整個系統的運行信息,比如系統運行到了哪一個階段,到達了哪一個狀態
warn(警告):用來記錄一些警告信息。警告信息表示,程序進入了一個特殊的狀態,在該狀態下程序可以繼續運行,但是不建議讓程序進入該狀態,因為該狀態可能導致結果出現問題
error(錯誤):用來記錄運行時的錯誤信息,表示程序運行過程中出現了需要被解決的問題,往往是一些異常。使用error日志的時候,一般會將詳細的異常出現的原因記錄
日志優先級從高到低依次為trace、debug、info、warn、error。相對而言,打印的日志會越來越少。

4、定義控制臺輸出
<!-- 控制臺輸出-高亮 --><appender name="CONSOLE-WITH-HIGHLIGHT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${HIGHLIGHT_PATTERN}</pattern></encoder></appender>
標簽含義
appender負責寫日志的組件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名
encoder對日志進行格式化
pattern用來設置日志的輸入格式。使用“%”加“轉換符”方式,如果要輸出“%”,則必須用“\”對“%”進行轉義
5、?定義日志文件輸出參數?
<!--文件輸出的格式設置 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 如果是 true,日志會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是 false --><prudent>false</prudent><!-- 日志日常打印日志文件,生成日志示例:/logs/log-test/info.log --><file>${LOG_HOME}/info.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 壓縮日志的路徑和日志格式,示例:info-2023-05-26_21.log.zip,%d{yyyy-MM-dd}:表示文件名稱包含日期,%i:表示當前是第幾個壓縮文件 --><fileNamePattern>${LOG_HOME}/info-%d{yyyy-MM-dd}_%i.log.zip</fileNamePattern><!-- 如果按天來回滾,則最大保存時間為7天,7天之前的都將被清理掉 --><maxHistory>7</maxHistory><!-- 日志總保存量為10GB,超過該日志總量的日志壓縮包會被清除 --><totalSizeCap>10GB</totalSizeCap><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!--文件達到 最大100MB時會被壓縮和切割 --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 文件輸出的日志 的格式 --><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14512.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14512.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14512.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

el-table 組件實現 “合并單元格 + N行數據小計” 功能

目錄 需求 - 要實現的效果初始代碼代碼升級&#xff08;可供多個表格使用&#xff09;CommonTable.vue 子組件 使用子組件1 - 父組件 - 圖1~圖3使用效果展示 使用子組件2 - 父組件 - 圖4使用效果展示 注意【代碼優化 - 解決bug】 需求 - 要實現的效果 父組件中 info 數據示例 …

內網安全之證書服務基礎知識

PKI公鑰基礎設施 PKI(Public Key Infrastructure)公鑰基礎設施&#xff0c;是提供公鑰加密和數字簽名服務的系統或平臺&#xff0c;是一個包括硬件、軟件、人員、策略和規程的集合&#xff0c;用來實現基于公鑰密碼體制的密鑰和證書的產生、管理、存儲、分發和撤銷等功能。企業…

Android Debug Bridge(ADB)命令使用

引言 Android Debug Bridge&#xff08;ADB&#xff09;是一套功能強大的命令行工具&#xff0c;它為Android開發者和高級用戶提供了與Android設備通信的能力。無論是進行應用開發、測試還是執行日常設備管理任務&#xff0c;ADB都是不可或缺的工具。本文將詳細介紹一些常用的…

element-plus:踩坑日記

el-table Q&#xff1a;有fixed屬性時&#xff0c;無數據時&#xff0c;可能出現底部邊框消失的bug 現象&#xff1a; 解決方法&#xff1a; .el-table__empty-block {border-bottom: 1px solid var(--el-table-border-color); } el-collapse 折疊面板 Q&#xff1a;標題上…

云平臺的安全能力提升解決方案

提升云平臺的安全能力是確保數據和服務安全的關鍵步驟。針對大型云平臺所面臨的云上安全建設問題&#xff0c;安全狗提供完整的一站式云安全解決方案&#xff0c;充分匹配云平臺安全管理方的需求和云租戶的安全需求。協助大型云平臺建設全網安全態勢感知、統一風險管理、統一資…

加強堆(大根堆)

way&#xff1a;看上去好像就是加了個indexMap記錄節點在數組heap中的下標&#xff0c;然后就是可以查到某個元素是否在堆里并且可以進行位置的調整&#xff0c;普通的堆是沒法知道元素是不是在的&#xff0c;只能彈堆頂元素&#xff0c;插入到堆尾這樣子。如果覺得heapSize有點…

PCIE協議-4-物理層邏輯模塊

4.1 簡介 物理層將事務層和數據鏈路層與用于鏈路數據交換的信令技術隔離開來。物理層被劃分為邏輯物理層和電氣物理層子模塊&#xff08;見圖4-1&#xff09;。 4.2 邏輯物理層子模塊 邏輯子模塊有兩個主要部分&#xff1a;一個發送部分&#xff0c;它準備從數據鏈路層傳遞過…

Spring 中常用的手動裝載 bean 方法

在 Spring 的 bean 裝載條件中&#xff0c;雖然 Spring 給我們提供了非常好用便捷的 Condition 相關注解&#xff0c;但是很多時候 Condition 相關注解并不滿足我們的需求&#xff0c;我需要更復雜的條件手動控制是否裝置 bean。這個時候我們就可以實現 Spring 為我們提供的幾個…

域名DNS添加CAA記錄

目錄 概述 檢測CAA記錄 添加CAA記錄 概述 DNS CAA(Certificate Authority Authorization)記錄是一種不太常見的DNS記錄類型,它主要用于鎖定證書頒發機構(CA)列表,以確保只有特定的CA可以為某個域名頒發SSL/TLS證書。CAA記錄是保護域名免受釣魚攻擊的安全措施,通過限制…

v-md-editor和SSE實現ChatGPT的打字機式輸出

概述 不論是GPT還是文心一言&#xff0c;在回答的時候類似于打字機式的將答案呈現給我們&#xff0c;這樣的交互一方面比較友好&#xff0c;另一方面&#xff0c;當答案比較多、生成比較慢的時候也能爭取一些答案的生成時間。本文后端使用express和stream&#xff0c;使用SSE將…

Boosting Cache Performance by Access Time Measurements——論文泛讀

TOC 2023 Paper 論文閱讀筆記整理 問題 大多數現代系統利用緩存來減少平均數據訪問時間并優化其性能。當緩存未命中的訪問時間不同時&#xff0c;最大化緩存命中率與最小化平均訪問時間不同。例如&#xff1a;系統使用多種不同存儲介質時&#xff0c;不同存儲介質訪問時間不同…

【C++初階】—— 類和對象 (上)

&#x1f4dd;個人主頁&#x1f339;&#xff1a;EterNity_TiMe_ ?收錄專欄?&#xff1a;C “ 登神長階 ” &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 類和對象 1. 初步認識C2. 類的引入3. 類的定義聲明和定義全部放在類體中聲明和定義分開存放 4.…

8個實用網站和軟件,收藏起來一定不后悔~

整理了8個日常生活中經常能用得到的網站和軟件&#xff0c;收藏起來一定不會后悔~ 1.ZLibrary zh.zlibrary-be.se/這個網站收錄了超千萬的書籍和文章資源&#xff0c;國內外的各種電子書資源都可以在這里搜索&#xff0c;98%以上都可以在網站內找到&#xff0c;并且支持免費下…

Android系統的/etc/mkshrc文件

/etc/mkshrc 文件是用于配置 mksh&#xff08;MirBSD Korn Shell&#xff09;環境的啟動腳本。mksh 是 Android 默認使用的 shell&#xff0c;在 shell 啟動時會讀取并執行這個文件中的配置。以下是關于 /etc/mkshrc 文件的詳細信息及其用途。 /etc/mkshrc 文件的作用 環境配…

sql server專題實驗4 復雜查詢

SQL Server 是微軟開發的數據庫管理系統&#xff0c;它支持復雜的查詢操作&#xff0c;允許用戶從數據庫中檢索、分析和處理數據。在進行復雜查詢時&#xff0c;通常會用到以下幾種SQL語句和概念&#xff1a; 連接&#xff08;Join&#xff09;: INNER JOIN&#xff1a;只返回兩…

設計模式--備忘錄模式

備忘錄模式是一種行為設計模式&#xff0c;它用于在不破壞封裝的前提下&#xff0c;保存一個對象的內部狀態&#xff0c;以便以后可以恢復到這個狀態。這種模式在許多應用場景中非常有用&#xff0c;例如在實現撤銷操作、保存游戲進度、恢復文件備份以及保持工作狀態等。 備忘…

linux中ansible整理筆記

一、工作模式 1. adhoc臨時命令 語法&#xff1a; ansible 主機或者組列表 -m 模塊 -a “參數” 2. playbook 語法&#xff1a; ansible-playbook xxx.yml 二、模塊 1. ping 2.command:默認模塊&#xff08;不支持重定向&#xff0c;管道&#xff09; 3.shell:類似com…

IP地址顯示“不安全”怎么辦|已解決

解決IP地址顯示“不安全”的問題&#xff0c;通常需要確保網站或服務使用HTTPS協議進行加密通信&#xff0c;可以通過部署SSL證書來解決&#xff0c;以下是具體的解決步驟&#xff1a; 1 申請IP地址SSL證書&#xff1a;網站管理員應向證書頒發機構&#xff08;CA&#xff09;申…

網絡拓撲—WEB-IIS服務搭建

文章目錄 WEB-IIS服務搭建網絡拓撲配置網絡IISPC 安裝IIS服務配置IIS服務&#xff08;默認站點&#xff09;PC機訪問網頁 配置IIS服務&#xff08;新建站點&#xff09;PC機訪問網頁 WEB-IIS服務搭建 網絡拓撲 //交換機忽略不計 IIS服務IP&#xff1a;192.168.1.1 PC機IP&…

人類交互2 聽覺處理和語言中樞

人類聽覺概述 人類聽覺是指通過耳朵接收聲音并將其轉化為神經信號&#xff0c;從而使我們能夠感知和理解聲音信息的能力。聽覺是人類五種感覺之一&#xff0c;對我們的日常生活和交流至關重要。 聽覺是人類交流和溝通的重要工具。通過聽覺&#xff0c;我們能夠聽到他人的語言…