1.commons logging + log4j
maven
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
配置檔案---log4j
# 将等級為debug的日志資訊輸出到stdout和R這兩個目的地,stdout和R的定義在下面的代碼,可以任意起名
log4j.rootLogger=INFO,consoleAppender,logfile,MAIL
log4j.addivity.org.apache=true
#ConsoleAppender,控制台輸出
#FileAppender,檔案日志輸出
#DailyRollingFileAppender,每天産生一個日志檔案
#RollingFileAppender,檔案大小到達指定尺寸的時候産生一個新的檔案
#WriterAppender,将日志資訊以流格式發送到任意指定的地方
#SMTPAppender,發郵件輸出日志
#SocketAppender,Socket 日志
#NTEventLogAppender,Window NT 日志
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold = INFO//日志級别為INFO
#org.apache.log4j.HTMLLayout(以HTML表格形式布局),
#org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
#org.apache.log4j.SimpleLayout(包含日志資訊的級别和資訊字元串),
#org.apache.log4j.TTCCLayout(包含日志産生的時間、線程、類别等等資訊)
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout//輸出格式
#%p: 輸出日志資訊優先級,即DEBUG,INFO,WARN,ERROR,FATAL,
#%d: 輸出日志時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
#%r: 輸出自應用啟動到輸出該log資訊耗費的毫秒數
#%c: 輸出日志資訊所屬的類目,通常就是所在類的全名
#%t: 輸出産生該日志事件的線程名
#%l: 輸出日志事件的發生位置,相當于%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及行數。舉例:Testlog4.main(TestLog4.java:10)
#%x: 輸出和目前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。
#%%: 輸出一個”%”字元
#%F: 輸出日志消息産生時所在的檔案名稱
#%L: 輸出代碼中的行号
#%m: 輸出代碼中指定的消息,産生的日志具體資訊
#%n: 輸出一個回車換行符,Windows平台為”\r\n”,Unix平台為”\n”輸出日志資訊換行
#可以在%與模式字元之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
#%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,預設的情況下右對齊。
#%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,”-“号指定左對齊。
#%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會将左邊多出的字元截掉,但小于30的話也不會有空格。
#%20.30c:如果category的名稱小于20就補空格,并且右對齊,如果其名稱長于30字元,就從左邊交遠銷出的字元截掉
log4j.appender.consoleAppender.layout.ConversionPattern =%d %-5p %m %n//指定格式的配置
log4j.appender.consoleAppender.Target = System.err//預設情況下是:System.out,指定輸出控制台
#logfile--輸出日志到檔案
log4j.appender.logfile = org.apache.log4j.FileAppender
log4j.appender.logfile.Threshold = ERROR//日志級别為ERROR
log4j.appender.logfile.ImmediateFlush = true//預設值是true,意謂着所有的消息都會被立即輸出。
log4j.appender.logfile.File = mylog.txt//指定消息輸出到mylog.txt檔案。
log4j.appender.logfile.Append = true//預設值是true,即将消息增加到指定檔案中,false指将消息覆寫指定的檔案内容。
log4j.appender.logfile.layout = org.apache.log4j.PatternLayout//輸出格式
#RollingFileAppender--每天輸出一個檔案
log4j.appender.logfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.Threshold = ERROR//日志級别為ERROR
log4j.appender.logfile.ImmediateFlush = true//預設值是true,意謂着所有的消息都會被立即輸出。
log4j.appender.errorlogfile.File = ../logs/ERROR_log//指定檔案名稱
log4j.appender.logfile.Append = true//預設值是true,即将消息增加到指定檔案中,false指将消息覆寫指定的檔案内容。
# ' . ' yyyy - MM: 每個月更新一個 log 日志
# ' . ' yyyy - ww: 每個星期更新一個 log 日志
# ' . ' yyyy - MM - dd: 每天更新一個 log 日志
# ' . ' yyyy - MM - dd - a: 每天的午夜和正午更新一個 log 日志
# ' . ' yyyy - MM - dd - HH: 每小時更新一個 log 日志
# ' . ' yyyy - MM - dd - HH - mm: 每分鐘更新一個 log 日志
————————————————
log4j.appender.errorlogfile.DatePattern = ' . ' yyyy - MM - dd ' .log '
og4j.appender.errorlogfile.layout = org.apache.log4j.PatternLayout
log4j.appender.errorlogfile.layout.ConversionPattern =%d %p [ %c] - %m %n %d
# 列印日志到檔案,自動根據大小配置設定檔案數量
log4j.appender.file=org.apache.log4j.RollingFileAppender
#設定log檔案名
log4j.appender.file.file=logs/slf4j4json.log
#log是否追加
log4j.appender.file.append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n
#檔案大小
log4j.appender.file.MaxFileSize=100MB
#檔案保留個數
log4j.appender.file.MaxBackupIndex=5
#發送郵件:SMTPAppender
log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold = INFO
log4j.appender.MAIL.BufferSize = 10
log4j.appender.MAIL.From = [email protected]
log4j.appender.MAIL.SMTPHost = smtp.gmail.com
log4j.appender.MAIL.Subject = Log4J Message
log4j.appender.MAIL.To = [email protected]
log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern =%d - %c -%-4r [%t] %-5p %c %x - %m %n
#資料庫:JDBCAppender
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL = jdbc:oracle:thin:@ 210.51 . 173.94 : 1521 :YDB
log4j.appender.DATABASE.driver = oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user = ydbuser
log4j.appender.DATABASE.password = ydbuser
log4j.appender.DATABASE.sql = INSERT INTO A1 (TITLE3) VALUES ( ' %d - %c %-5p %c %x - %m%n
' )
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern =% d - % c -%- 4r [ % t] %- 5p % c %
x - % m % n
#資料庫的連結會有問題,可以重寫 org.apache.log4j.jdbc.JDBCAppender 的 getConnection() 使用資料庫連結池去得連結,可以避免 insert 一條就連結一次資料庫
#發送日志到kafka
log4j.appender.kafka=org.apache.kafka.log4jappender.KafkaLog4jAppender
log4j.appender.kafka.topic=pro-log
#設定kafka連接配接位址
log4j.appender.kafka.brokerList=localhost:9092
log4j.appender.kafka.compressionType=none
log4j.appender.kafka.requiredNumAcks=0
#設定是否異步
log4j.appender.kafka.syncSend=true
log4j.appender.kafka.level=DEBUG
log4j.appender.kafka.layout=org.apache.log4j.PatternLayout
log4j.appender.kafka.layout.ConversionPattern= %m
2.slf4j+logback
logback是Java的開源架構,性能比log4j要好。是springboot自帶的日志架構。該架構主要有3個子產品:
logback-core:核心代碼塊(不介紹)
log back-classic:實作了slf4j的api,加入該依賴可以實作log4j的api。
log back-access:通路子產品與servlet容器內建提供通過http來通路日志的功能(也就是說不需要通路伺服器,直接在網頁上就可以通路日志檔案)。
logback.xml格式詳解
根節點<configuration>包含的屬性
scan:
當此屬性設定為true時,配置檔案如果發生改變,将會被重新加載,預設值為true。
scanPeriod:
設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間機關,預設機關是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
debug:當此屬性設定為true時,将列印出logback内部日志資訊,實時檢視logback運作狀态。預設值為false。
二:根節點<configuration>的子節點:

2.1設定上下文名稱:<contextName>
每個logger都關聯到logger上下文,預設上下文名稱為“default”。但可以使用<contextName>設定成其他名字,用于區分不同應用程式的記錄。一旦設定,不能修改。
2.2設定變量:<property>
用來定義變量值的标簽,<property> 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過<property>定義的值會被插入到logger上下文中。定義變量後,可以使“${}”來使用變量。
例如使用<property>定義上下文名稱,然後在<contentName>設定logger上下文時使用。
2.3擷取時間戳字元串:<timestamp>
兩個屬性 key:辨別此<timestamp> 的名字;datePattern:設定将目前時間(解析配置檔案的時間)轉換為字元串的模式,遵循java.txt.SimpleDateFormat的格式。
2.4設定loger:
<loger>
用來設定某一個包或者具體的某一個類的日志列印級别、以及指定<appender>。<loger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
name:
用來指定受此loger限制的某一個包或者具體的某一個類。
level:
用來設定列印級别,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級别。
如果未設定此屬性,那麼目前loger将會繼承上級的級别。
addtivity:
是否向上級loger傳遞列印資訊。預設是true。
<loger>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個loger。
<root>
也是<loger>元素,但是它是根loger。隻有一個level屬性,應為已經被命名為"root".
level:
用來設定列印級别,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設定為INHERITED或者同義詞NULL。
預設是DEBUG。
<root>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個loger。
logback 常用配置詳解(二)<appender>
<appender>:
<appender>是<configuration>的子節點,是負責寫日志的元件。
<appender>有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名。
1.ConsoleAppender:
把日志添加到控制台,有以下子節點:
<encoder>:對日志進行格式化。(具體參數稍後講解 )
<target>:字元串 System.out 或者 System.err ,預設 System.out ;
2.FileAppender:
把日志添加到檔案,有以下子節點:
<file>:被寫入的檔案名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。
<append>:如果是 true,日志被追加到檔案結尾,如果是 false,清空現存檔案,預設是true。
<encoder>:對記錄事件進行格式化。(具體參數稍後講解 )
<prudent>:如果是 true,日志會被安全的寫入檔案,即使其他的FileAppender也在向此檔案做寫入操作,效率低,預設是 false。
3.RollingFileAppender:
滾動記錄檔案,先将日志記錄到指定檔案,當符合某個條件時,将日志記錄到其他檔案。有以下子節點:
<file>:被寫入的檔案名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。
<append>:如果是 true,日志被追加到檔案結尾,如果是 false,清空現存檔案,預設是true。
<encoder>:對記錄事件進行格式化。(具體參數稍後講解 )
<rollingPolicy>:當發生滾動時,決定RollingFileAppender 的行為,涉及檔案移動和重命名。
<triggeringPolicy>:告知RollingFileAppender合适激活滾動。
<prudent>:當為true時,不支援FixedWindowRollingPolicy。支援TimeBasedRollingPolicy,但是有兩個限制,1不支援也不允許檔案壓縮,2不能設定file屬性,必須留白。
rollingPolicy:
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:
SizeBasedTriggeringPolicy: 檢視目前活動檔案的大小,如果超過指定大小會告知RollingFileAppender 觸發目前活動檔案滾動。隻有一個節點:
<maxFileSize>:這是活動檔案的大小,預設值是10MB。
4.另外還有SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,并不常用
<encoder>:
負責兩件事,一是把日志資訊轉換成位元組數組,二是把位元組數組寫入到輸出流。
目前PatternLayoutEncoder 是唯一有用的且預設的encoder ,有一個<pattern>節點,用來設定日志的輸入格式。使用“%”加“轉換符”方式,如果要輸出“%”,則必須用“\”對“\%”進行轉義。
<pattern>裡面的轉換符說明:
轉換符 | 作用 | |
c { length } lo { length } logger { length } | 輸出日志的logger名,可有一個整形參數,功能是縮短logger名,設定為0表示隻輸入logger最右邊點符号之後的字元串。 | |
Conversion specifier | Logger name | Result |
%logger | mainPackage.sub.sample.Bar | mainPackage.sub.sample.Bar |
%logger{0} | mainPackage.sub.sample.Bar | Bar |
%logger{5} | mainPackage.sub.sample.Bar | m.s.s.Bar |
%logger{10} | mainPackage.sub.sample.Bar | m.s.s.Bar |
%logger{15} | mainPackage.sub.sample.Bar | m.s.sample.Bar |
%logger{16} | mainPackage.sub.sample.Bar | m.sub.sample.Bar |
%logger{26} | mainPackage.sub.sample.Bar | mainPackage.sub.sample.Bar |
C { length } class { length } | 輸出執行記錄請求的調用者的全限定名。參數與上面的一樣。盡量避免使用,除非執行速度不造成任何問題。 | |
contextName cn | 輸出上下文名稱。 | |
d { pattern } date { pattern } | 輸出日志的列印日志,模式文法與 java.text.SimpleDateFormat 相容。 | |
Conversion Pattern | Result | |
%d | 2006-10-20 14:06:49,812 | |
%date | 2006-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', ''}" |
格式修飾符,與轉換符共同使用:
可選的格式修飾符位于“%”和轉換符之間。
第一個可選修飾符是左對齊 标志,符号是減号“-”;接着是可選的最小寬度 修飾符,用十進制數表示。如果字元小于最小寬度,則左填充或右填充,預設是左填充(即右對齊),填充符為空格。如果字元大于最小寬度,字元永遠不會被截斷。最大寬度 修飾符,符号是點号"."後面加十進制數。如果字元大于最大寬度,則從前面截斷。點符号“.”後面加減号“-”在加數字,表示從尾部截斷
<filter>:
過濾器,執行一個過濾器會有傳回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。傳回DENY,日志将立即被抛棄不再經過其他過濾器;傳回NEUTRAL,有序清單裡的下個過濾器過接着處理日志;傳回ACCEPT,日志會被立即處理,不再經過剩餘過濾器。
過濾器被添加到<Appender> 中,為<Appender> 添加一個或多個過濾器後,可以用任意條件對日志進行過濾。<Appender> 有多個過濾器時,按照配置順序執行。
下面是幾個常用的過濾器:
LevelFilter: 級别過濾器,根據日志級别進行過濾。如果日志級别等于配置級别,過濾器會根據onMath 和 onMismatch接收或拒絕日志。有以下子節點:
<level>:設定過濾級别
<onMatch>:用于配置符合過濾條件的操作
<onMismatch>:用于配置不符合過濾條件的操作
ThresholdFilter: 臨界值過濾器,過濾掉低于指定臨界值的日志。當日志級别等于或高于臨界值時,過濾器傳回NEUTRAL;當日志級别低于臨界值時,日志會被拒絕。
EvaluatorFilter: 求值過濾器,評估、鑒别日志是否符合指定條件。有一下子節點:
<evaluator>:
鑒别器,常用的鑒别器是JaninoEventEvaluato,也是預設的鑒别器,它以任意的java布爾值表達式作為求值條件,求值條件在配置檔案解釋過成功被動态編譯,布爾值表達式傳回true就表示符合過濾條件。evaluator有個子标簽<expression>,用于配置求值條件。
求值表達式作用于目前日志,logback向求值表達式暴露日志的各種字段:
Name | Type | Description |
event | LoggingEvent | 與記錄請求相關聯的原始記錄事件,下面所有變量都來自event,例如,event.getMessage()傳回下面"message"相同的字元串 |
message | String | 日志的原始消息,例如,設有logger mylogger,"name"的值是"AUB",對于 mylogger.info("Hello {}",name); "Hello {}"就是原始消息。 |
formatedMessage | String | 日志被各式話的消息,例如,設有logger mylogger,"name"的值是"AUB",對于 mylogger.info("Hello {}",name); "Hello Aub"就是格式化後的消息。 |
logger | String | logger 名。 |
loggerContext | LoggerContextVO | 日志所屬的logger上下文。 |
level | int | 級别對應的整數值,是以 level > INFO 是正确的表達式。 |
timeStamp | long | 建立日志的時間戳。 |
marker | Marker | 與日志請求相關聯的Marker對象,注意“Marker”有可能為null,是以你要確定它不能是null。 |
mdc | Map | 包含建立日志期間的MDC所有值得map。通路方法是: mdc.get("myKey") 。mdc.get()傳回的是Object不是String,要想調用String的方法就要強轉,例如, ((String) mdc.get("k")).contains("val") .MDC可能為null,調用時注意。 |
throwable | java.lang.Throwable | 如果沒有異常與日志關聯"throwable" 變量為 null. 不幸的是, "throwable" 不能被序列化。在遠端系統上永遠為null,對于與位置無關的表達式請使用下面的變量 throwableProxy |
throwableProxy | IThrowableProxy | 與日志事件關聯的異常代理。如果沒有異常與日志事件關聯,則變量"throwableProxy" 為 null. 當異常被關聯到日志事件時,"throwableProxy" 在遠端系統上不會為null |
<onMatch>:用于配置符合過濾條件的操作
<onMismatch>:用于配置不符合過濾條件的操作
<matcher> :
比對器,盡管可以使用String類的matches()方法進行模式比對,但會導緻每次調用過濾器時都會建立一個新的Pattern對象,為了消除這種開銷,可以預定義一個或多個matcher對象,定以後就可以在求值表達式中重複引用。<matcher>是<evaluator>的子标簽。
<matcher>中包含兩個子标簽,一個是<name>,用于定義matcher的名字,求值表達式中使用這個名字來引用matcher;另一個是<regex>,用于配置比對條件。
例如
<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<property name="APP_NAME" value="MY_APP_NAME"/>
<property name="LOG_DIR" value="logs"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %boldYellow([%thread]) %cyan(%logger{15}) %msg%n"/>
<contextName>${APP_NAME}</contextName>
<appender name="ConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!-- 設定等級過濾器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<!-- 滿足則通過 -->
<onMatch>ACCEPT</onMatch>
<!-- 不滿足則丢棄 -->
<onMismatch>DENY</onMismatch>
</filter>
<!-- 設定日志格式 -->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<target>
System.out
</target>
</appender>
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<!-- 設定等級過濾器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 檔案名稱 -->
<file>./log/log_file.log</file>
<!-- 是否追加 -->
<append>true</append>
<!-- 設定日志格式 -->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="rollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 當發生滾動時,決定 RollingFileAppender 的行為,涉及檔案移動和重命名 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 最多保留30天的文檔 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 檔案大小如果超過5MB則觸發滾動機制生成新的日志檔案 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<!-- 是否追加 -->
<append>true</append>
<!-- 設定日志格式 -->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="rollingFileAppender"/>
</root>
</configuration>