logback學習與配置使用
Logback介紹
Logback 分為三個模組:Core、Classic 和 Access。Core模組是其他兩個模組的基礎。 Classic模組擴充套件了core模組。 Classic模組相當於log4j的顯著改進版。Logback-classic 直接實現了 SLF4J API。要引入logback,由於Logback-classic依賴slf4j-api.jar和logback-core.jar,所以要把slf4j-api.jar、logback-core.jar、logback-classic.jar,新增到要引入Logbac日誌管理的專案的class path中.
Logback的配置
Logger、Appender和 Layout
Logback建立於三個主要類之上:Logger、Appender 和 Layout。Logger類是logback-classic模組的一部分,而Appender和Layout介面來自logback-core。作為一個多用途模組,logback-core 不包含任何 logger。Logger作為日誌的記錄器,把它關聯到應用的對應的context上後,主要用於存放日誌物件,也可以定義日誌型別、級別。Appender主要用於指定日誌輸出的目的地,目的地可以是控制檯、檔案、遠端套接字伺服器、 MySQL、 PostreSQL、 Oracle和其他資料庫、 JMS和遠端UNIX Syslog守護程序等。Layout 負責把事件轉換成字串,格式化的日誌資訊的輸出。
Logger context
各個logger 都被關聯到一個 LoggerContext,LoggerContext負責製造logger,也負責以樹結構排列各 logger。如果 logger的名稱帶上一個點號後是另外一個 logger的名稱的字首,那麼,前者就被稱為後者的祖先。如果 logger與其後代 logger之間沒有其他祖先,那麼,前者就被稱為子logger 之父。比如,名為 "com.foo""的 logger 是名為"com.foo.Bar"之父。root logger 位於 logger 等級的最頂端,root logger 可以通過其名稱取得,如下所示:
Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
其他所有logger也通過org.slf4j.LoggerFactory 類的靜態方法getLogger取得。 getLogger方法以 logger 名稱為引數。用同一名字呼叫LoggerFactory.getLogger 方法所得到的永遠都是同一個logger物件的引用。
有效級別與級別繼承
Logger 可以被分配級別。級別包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定義於 ch.qos.logback.classic.Level類。如果 logger沒有被分配級別,那麼它將從有被分配級別的最近的祖先那裡繼承級別。root logger 預設級別是 DEBUG。列印方法與基本選擇規則
列印方法決定記錄請求的級別。例如,如果 L 是一個 logger 例項,那麼,語句 L.info("..")是一條級別為 INFO 的記錄語句。記錄請求的級別在高於或等於其 logger 的有效級別時被稱為被啟用,否則,稱為被禁用。記錄請求級別為 p,其 logger的有效級別為 q, 只有則當 p>=q時, 該請求才會被執行。
該規則是 logback 的核心。級別排序為: TRACE < DEBUG < INFO < WARN < ERROR。
Logger、Appenders及layouts的關係
一個 logger 可以被關聯多個 appender。 方法 addAppender() 為指定的 logger 新增一個 appender。 對於 logger 的每個啟用了的記錄請求,都將被髮送到 logger 裡的全部 appender 及更高等級的 appender。換句話說,appender疊加性地繼承了 logger 的層次等級。Logger L的記錄語句的輸出會發送給 L及其祖先的全部 appender。如果 logger L的某個祖先 P設定疊加性標識為 false,那麼,L的輸出會發送給L 與 P之間(含P)的所有 appender,但不會發送給P的任何祖先的appender。
Logger 的疊加性預設為 true。如果希望定製輸出格式。這時為 appender 關聯一個 layout 即可。Layout 負責根據使用者意願對記錄請求進行格式化,appender 負責將格式化化後的輸出傳送到目的地。
例如,轉換模式"%-4relative [%thread] %-5level %logger{32} - %msg%n"在 PatternLayout裡會輸出形如:
176 [main] DEBUG manual.architecture.HelloWorld2 - Hello world.
第一個欄位是自程式啟動以來的逝去時間,單位是毫秒。
第二個地段發出記錄請求的執行緒。
第三個欄位是記錄請求的級別。
第四個欄位是與記錄請求關聯的 logger 的名稱。
"-"之後是請求的訊息文字。
Logback的預設配置
如果配置檔案 logback-test.xml 和 logback.xml 都不存在,那麼 logback 預設地會呼叫BasicConfigurator ,建立一個最小化配置。最小化配置由一個關聯到根 logger 的ConsoleAppender 組成。輸出用模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 進行格式化。root logger 預設級別是 DEBUG。logback配置檔案
Logback 配置檔案的語法非常靈活。正因為靈活,所以無法用 DTD 或 XML schema 進行定義。儘管如此,可以這樣描述配置檔案的基本結構:以<configuration>開頭,後面有零個或多個<appender>元素,有零個或多個<logger>元素,有最多一個<root>元素。Logback預設配置的採用的步驟
1. 嘗試在 classpath 下查詢檔案 logback-test.xml;2. 如果檔案不存在,則查詢檔案 logback.xml;
3. 如果兩個檔案都不存在,logback 用 Bas icConfigurator 自動對自己進行配置,這會導致記錄輸出到控制檯。
假設配置檔案 logback-test.xml 和 logback.xml 都不存在,那麼 logback 預設地會呼叫BasicConfigurator ,建立一個最小化配置。最小化配置由一個關聯到根 logger 的ConsoleAppender 組成。輸出用模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 進行格式化。還有,根 logger 預設級別是 DEBUG。
自動列印警告和錯誤訊息
當解析配置檔案有警告或出錯時,logback 會在控制檯上自動列印狀態資料。如果沒有警告或錯誤,還是想檢查 logback 的內部狀態的話, 可以呼叫 StatusPrinter 的 print()方法。
對應的配置檔案:
[html] view plaincopyprint?
- <?xmlversion="1.0"encoding="UTF-8"?>
- <configuration>
- <!--定義一個名為STDOUT的appender,並將其關聯到ch.qos.logback.core.ConsoleAppender-->
- <appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
- <!-- encoders 作用是將logger事件轉換成位元組陣列,並將位元組陣列寫入到輸出流-->
- <encoder>
- <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度 %msg:日誌訊息,%n是換行符-->
- <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
- </encoder>
- </appender>
- <rootlevel="debug"><!-- root logger,定義級別為debug-->
- <appender-refref="STDOUT"/><!--將名為STDOUT的appender新增到root logger下-->
- </root>
- </configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--定義一個名為STDOUT的appender,並將其關聯到ch.qos.logback.core.ConsoleAppender-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders 作用是將logger事件轉換成位元組陣列,並將位元組陣列寫入到輸出流-->
<encoder>
<!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度 %msg:日誌訊息,%n是換行符-->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug"> <!-- root logger,定義級別為debug-->
<appender-ref ref="STDOUT" /> <!--將名為STDOUT的appender新增到root logger下-->
</root>
</configuration>
控制檯輸出結果如下:
…………
20:12:33,359 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
20:12:33,359 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
20:12:33,359 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/D:/Workspaces/MyEclipse%208.5/logback_test/WebRoot/WEB-INF/classes/logback.xml]
20:12:33,484 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
20:12:33,484 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
20:12:33,500 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
20:12:33,593 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
20:12:33,593 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
20:12:33,593 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
20:12:33,593 |-INFO in [email protected] - Registering current configuration as safe fallback point
…………
Logback自定義配置
配置root logger
<root>元素配置根 logger。該元素有一個 level屬性。沒有 name 屬性,因為已經被命名為"ROOT"。 Level 屬性的值大小寫無關,其值為下面其中一個字串:TRACE、DEBUG、INFO、WARN、ERROR、ALL和 OFF。注意不能設定為"INHERITED" 或"NULL"。 <logger>元素可以包含零個或多個<appender-ref>元素。與<logger>元素類似,宣告<root>元素後,會先關閉然後移除全部當前 appender,只引用聲明瞭的 appender。如果 root 元素沒有引用任何 appender,就會失去所有 appender。假設我們不想看到"com.ttpod.file"包裡的任何元件的任何 DEBUG 資訊,可以設定如下:
[html] view plaincopyprint?
- <?xmlversion="1.0"encoding="UTF-8"?>
- <configuration>
- <appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
- </encoder>
- </appender>
- <!-- 設定configuration下的logger的級別為INFO,預設是繼承root logger的debug級別 -->
- <loggername="chapters.configuration"level="INFO"/>
- <!-- 嚴格來說, root logger 的level屬性沒有必要設定,因為 -->
- <!-- root logger的級別被預設設定為DEBUG -->
- <rootlevel="DEBUG">
- <!--在root標籤內沒有引入chapters.configuration,所有在此包下不會顯示任何元件的任何 DEBUG 資訊 -->
- <appender-refref="STDOUT"/><!-- 將appender引入到root logger -->
- </root>
- </configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 設定configuration下的logger的級別為INFO,預設是繼承root logger的debug級別 -->
<logger name="chapters.configuration" level="INFO" />
<!-- 嚴格來說, root logger 的level屬性沒有必要設定,因為 -->
<!-- root logger的級別被預設設定為DEBUG -->
<root level="DEBUG">
<!--在root標籤內沒有引入chapters.configuration,所有在此包下不會顯示任何元件的任何 DEBUG 資訊 -->
<appender-ref ref="STDOUT" /> <!-- 將appender引入到root logger -->
</root>
</configuration>
注意:由名為"chapters.configuration.Foo"的 logger 生成的 DEBUG 級別的資訊都被遮蔽了.同樣,也可以為任意數量的 logger 設定級別。
配置 Appenders
Appender 用<appender>元素配置,該元素必要屬性 name 和 class。 name 屬性指定 appender 的名稱,class 屬性指定 appender 類的全限定名。 <appender>元素可以包含零個或多個<layout>元素、零個或多個<encoder>元素和零個或多個<filter>元素。除了這三個常用元素之外,還可以包含 appender 類的任意數量的 javabean
屬性。下圖演示了常用結構,注意對 javabean 屬性的支援在圖中不可見。
記錄輸出到多個 appender 很簡單,先定義各種 appender,然後在 logger 裡進行引用,就行了。如下面的配置檔案所示:
[html] view plaincopyprint?
- <configuration>
- <appendername="FILE"class="ch.qos.logback.core.FileAppender">
- <file>myApp.log</file>
- <!-- encoders are assigned by default the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
- <encoder>
- <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
- </encoder>
- </appender>
- <appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>%msg%n</pattern>
- </encoder>
- </appender>
- <rootlevel="debug">
- <appender-refref="FILE"/>
- <appender-refref="STDOUT"/>
- </root>
- </configuration>
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myApp.log</file>
<!-- encoders are assigned by default the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
該配置檔案定義了兩個 appender,分別是"FILE"和"STDOUT"。 "FILE" 這個 appender 把記錄輸 出到檔案 "myapp.log " ,它的 encoder 是PatternLayoutEncoder,輸出了日期、級別、執行緒名、logger 名、檔名及記錄請求的行號、訊息和行分隔符。 "STDOUT"這個 appender 把記錄輸出到控制檯,它的 encoder 只是輸出訊息和行分隔符。 myApp.log檔案內容如下:
2011-12-25 16:56:48,593 INFO [main] c.t.c.c.MyApp3 [MyApp3.java:48] Entering application.
2011-12-25 16:56:48,593 DEBUG [main] c.t.c.c.Foo [Foo.java:24] Did it again!
2011-12-25 16:56:48,593 INFO [main] c.t.c.c.MyApp3 [MyApp3.java:52] Exiting application.
注意每個 appender 都有自己的 encoder。Encoder 通常不能被多個 appender 共享,layout也是。所以,logback 的配置檔案裡沒有共享 encoder 或 layout 的語法。
Appender累積
預設情況下,appender 是可累積的:logger 會把記錄輸出到它自身的 appender 和它所有祖先的 appender。因此,把同一 appender 關聯到多個 logger 會導致重複輸出,如下面的配置檔案會導致重複的輸出:
[html] view plaincopyprint?
- <configuration>
- <appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
- </encoder>
- </appender>
- <loggername="chapters.configuration">
- <appender-refref="STDOUT"/>
- </logger>
- <rootlevel="debug">
- <appender-refref="STDOUT"/> <!—這會導致重複輸出-->
- </root>
- </configuration>
<configuration>
<appender name="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="chapters.configuration">
<appender-ref ref="STDOUT" />
</logger>
<root level="debug">
<appender-ref ref="STDOUT" /> <!—這會導致重複輸出-->
</root>
</configuration>
輸出結果如下:
20:53:29.328 [main] INFO c.t.chapters.configuration.MyApp2 - Entering application.
20:53:29.328 [main] INFO c.t.chapters.configuration.MyApp2 - Entering application.
20:53:29.328 [main] DEBUG com.ttpod.chapters.configuration.Foo - Did it again!
20:53:29.328 [main] DEBUG com.ttpod.chapters.configuration.Foo - Did it again!
20:53:29.328 [main] INFO c.t.chapters.configuration.MyApp2 - Exiting application.
20:53:29.328 [main] INFO c.t.chapters.configuration.MyApp2 - Exiting application.
覆蓋預設的累積行為
如果你覺得預設的累積行為不合適,可以設定疊加性標識為 false 以關閉它。 這樣的話,logger 樹裡的某個分支可以輸出到與其他 logger 不同的 appender。
示例:疊加性標識
[html] view plaincopyprint?
- <configuration>
- …………
- <loggername="com.ttpod.chapters.configuration.Foo"additivity="false">
- <appender-refref="FILE"/>
- </logger>
- <rootlevel="debug">
- <appender-refref="STDOUT"/>
- </root>
- </configuration>
<configuration>
…………
<logger name="com.ttpod.chapters.configuration.Foo" additivity="false">
<appender-ref ref="FILE" />
</logger>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
輸出結果:
Entering application.
Exiting application.
此例中,logger"chapters.configuration.Foo"關聯 appender"FILE",它的疊加性標記為false,這樣它的記錄輸出僅會被髮送到 appender"FILE",不會被髮送到更高 logger 等級關聯的 appender。其他 logger 不受此影響。 用 additivityFlag.xml 配置 MyApp3 , 運 行 後 , 控 制 臺 上 由 輸 出 由"chapters.configuration.MyApp3"產生的記錄。而 logger" chapters.configuration.Foo"將且僅僅將輸出到檔案 foo.log。
Layout格式化輸出日誌
配置自定義 layout
配置自定義layout與配置其他layout是一樣的。 FileAppender和其子類需要一個encoder。如連結中的例子:http://logback.qos.ch/xref/chapters/layouts/MySampleLayout.html
此類中定義了一個處理格式的輸出類,為了滿足自定義的格式化的輸出,把包裹了 MySampleLayout 的 LayoutWrappingEncoder 例項傳遞給FileAppender。下面是配置檔案:
[html] view plaincopyprint?
- <configurationdebug="true">
- <appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
- <encoderclass="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
- <!—自定義的格式化輸出處理類-->
- <layoutclass="com.ttpod.chapters.layouts.MySampleLayout"/>
- </encoder>
- </appender>
- <rootlevel="DEBUG">
- <appender-refref="STDOUT"/>
- </root>
- </configuration>
<configuration debug="true">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<!—自定義的格式化輸出處理類-->
<layout class="com.ttpod.chapters.layouts.MySampleLayout" />
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
輸出結果如下:
250 DEBUG [main] com.ttpod.chapters.introduction.HelloWorld1 - Hello world.
layout轉換符
它和C語言的printf方法非常類似。格式轉換由普通字元和轉換字元組合而成。轉換字元由%開始,緊跟著的是可選的格式修飾符和轉換字元標示。使用%字首的表示符號將被轉換到實際的內容。如name, level, date, thread name.可用的轉換符有:
轉換符
描述
c
呼叫日誌事件的所在記錄器的名字,如一個logger的名字是my.test.bbb.ccc,呼叫的是WARN級別的日誌輸出,那麼輸出的是輸出my.test.bbb.ccc,可以在其右邊指定了精度,如%c{2}那麼輸出的是bbb.ccc
C
呼叫日誌事件的所在的類名,和c轉換符一樣,可以在右邊指定寬度,如%C{2}輸出%C{2}
d日誌呼叫所發生的時間,日期格式在其後跟著的大括號內的格式指定如%d{yyyy-MM-dd HH:mm:ss},我現在輸出的結果是2011-07-11 21:05:22,推薦使用的是log4j本身提供的日期格式,如%d{ISO8601},%d{ABSOLUTE},%d{DATE}
F
所處所在檔名,如上面說C轉換符的例子,輸出結果是LayoutTest.java
l
是的日誌事件發生的位置資訊,這個和虛擬機器的實現有點關係,一般境況下能得到類,方法,行數原始檔等資訊,
L
只是輸出觸發日誌事件程式碼所在的行號,效能損耗會小很多。
m
顯示應用給日誌提供的其他資訊,如訊息。logger.warn("Message 2");那麼%m將得到的是Message 2
M
輸出呼叫者所在的方法名
n
換行,和\r \r\n有相同功能,能識別系統的換行符,自動轉換成\r或者\r\n,log4j推薦使用這個轉換符,而不是\r或者\r\n
p
輸出呼叫的日誌的級別,如我是呼叫logger.debug方法,那麼級別就是debug
r
輸出自應用啟動後第一次呼叫logger的日誌輸出方法,到輸出該log資訊耗費的毫秒數
t
輸出所線上程的名字
x
輸出產生的日誌事件的執行緒的NDC(巢狀診斷上下文)
X
輸出與生成的日誌事件的執行緒關聯的MDC(對映診斷上下文)。X轉換符括號之間放置了一個key,就像在%X {clientNumber}中的clientNumberkey 一樣。在MDC correspondingvalue將被輸出。
%
寫上%%後將直接輸出一個%符號
layout格式修飾符
如給定的一個格式:%-5p [%t]: %m%n中,並沒有明確的分隔轉換字元和普通文字的字元存在。PatternLayout能自己區分普通文字和轉換字元。其中%-5p是日誌的呼叫級別。事件是左對齊的,5個字元寬度。
格式修飾符,放在%和轉換符之間。 第一個可選的格式修飾符是左對齊(-);第二個可選的格式修飾符是欄位最小寬度。一個整數。表示輸出的最小字元數。如果資料未達到指定最小大小,那麼它將以左填充(預設)或者右填充方式(左對齊情況下只能使用右填充了)。用空格填充,直到達到最小寬度。如果大於指定最小寬度,不會被截斷 。當然可以指定最大字元數,使用.符號加數字表示最大字元數。如果大於指定長度,多餘的字元會被刪除。它是從前面刪除,而不是從後面刪除的。如最大字元是8個,資料有10個字元,那麼前面兩個字元會被刪除。
%20c 右對齊,最少20字元,沒有左邊用空格填充
%-20c 左對齊,最少20字元,沒有右邊用空格填充
%.30c 右對齊,最多30字元,超過左邊的擷取掉
%20.30c 右對齊,最少20字元,最多30字元,填充或擷取規則略
%-20.30c 左對齊,最少20字元,最多30字元,填充或擷取規則略
在程式裡啟用logback記錄
三個必須步驟:
1. 配置 logback 環境。
2. 在每個需要執行記錄的類裡,呼叫 org.slf4j.LoggerFactory 類的 getLogger()方法獲
取一個 Logger 例項,以當前類名或類本身作為引數。
3. 呼叫取得的 logger 例項的列印方法,即 debug()、info()、warn()和 error(),把記錄
輸出到配置裡的各 appender。
直接呼叫JoranConfigurator
Logback 依賴Joran,Joran是 logback-core 的一部分,是個配置類庫。Logback 的預設配置機制是呼叫JoranConfigurator對classpath上的預設配置檔案進行處理。 不管出於什麼理由,如果你想重新實現 logback 的預設配置機制的話,你可以直接呼叫 JoranConfigurator。下面程式 MyApp1 就呼叫了 JoranConfigurator 對作為引數傳入的配置檔案進行處理。
此程式通過引數傳配置檔案的名字,對程式的日誌輸出配置,本例如下:
[html] view plaincopyprint?
- <configuration>
- <!-- 指定屬性檔案路徑 -->
- <propertyfile="src/com/ttpod/file/variables.properties"/>
- <!-- 指定日誌輸出到檔案-->
- <appendername="FILE"class="ch.qos.logback.core.FileAppender">
- <file>${destination}</file>
- <encoder>
- <!-- %msg表示日誌資訊,%n表示換行 -->
- <pattern>%msg%n</pattern>
- </encoder>
- </appender>
- <rootlevel="debug">
- <appender-refref="FILE"/><!—新增到根logger-->
- </root>
- </configuration>
<configuration>
<!-- 指定屬性檔案路徑 -->
<property file="src/com/ttpod/file/variables.properties" />
<!-- 指定日誌輸出到檔案-->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${destination}</file>
<encoder>
<!-- %msg表示日誌資訊,%n表示換行 -->
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" /><!—新增到根logger-->
</root>
</configuration>
對應的properties檔案,巢狀的設定了日誌檔案的輸出路徑及檔名,如下:
#指定USER_HOME目錄
USER_HOME=./log
#指定日誌檔名
fileName=myApp.log
#生成日誌檔案的目的地
destination=${USER_HOME}/${fileName}
配置好後,右鍵MyApp3 -> run as… -> run configurations -> 選擇MyApp3,及arguments ->
配置program Aguments:src/com/ttpod/MyApp1Config.xml,以指定配置檔案,然後執行即可,即可在當前就應用的/log資料夾下生成myApp.log ,輸出如下:
Entering application.demo class Foo >>>
test logger in other class!
Exiting application. demo class Foo <<<
運用滾動策略與觸發策略
RollingFileAppender 繼承 FileAppender,能夠滾動記錄檔案。例如,RollingFileAppender能先記錄到檔案"log.txt",然後當符合某個條件時,變成記錄到其他檔案。 RollingFileAppender 有兩個與之互動的重要子元件。第一個是RollingPolicy,負責滾動。第二個是 TriggeringPolicy,決定是否以及何時進行滾動。所以,RollingPolicy 負責"什麼", TriggeringPolicy 負責"何時"。
要想 RollingFileAppender 起作用,必須同時設定 RollingPolicy 和 TriggeringPolicy。不過,如果 RollingPolicy 也實現了 TriggeringPolicy 介面,那麼只需要設定 RollingPolicy。
// 沒有自定義它的logback所需的配置檔案,程式啟動時會自動載入classpath目錄下的查詢
// logback-test.xml;如果沒找到則logback-test.xml,則繼續在classpath下查詢lobback.xml。
此測試類,在定時器中定義了一個執行計劃,按照執行計劃生成日誌檔案。在file包中新增相的logback配置檔案,如下:
[html] view plaincopyprint?
- <?xmlversion="1.0"encoding="UTF-8"?>
- <configuration>
- <jmxConfigurator/>
- <!-- 配置檔案路徑 -->
- <propertyfile="src/com/ttpod/file/variables.properties"/>
- <!--logback的版本必須是0.9.21以上才支援-->
- <timestampkey="byDay"datePattern="yyyyMMdd"/>
- <!-- 控制檯輸出日誌 -->
- <appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
- <layoutclass="ch.qos.logback.classic.PatternLayout">
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
- </layout>
- </appender>
- <!-- 檔案輸出日誌 (檔案大小策略進行檔案輸出,超過指定大小對檔案壓縮(.zip)備份)-->
- <appendername="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender">
- <!-- 檔案的路徑及檔名 -->
- <File>${USER_HOME}/SystemOut.log</File>
- <!-- 定義視窗滾動策略 -->
- <rollingPolicyclass="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <!-- 每觸發一次,自動壓縮日誌檔案,%i在1-3之間迴圈變化 -->
- <FileNamePattern>${USER_HOME}/SystemOut_%i.log.zip</FileNamePattern>
- <MinIndex>1</MinIndex><!-- %i的最小值為1-->
- <MaxIndex>3</MaxIndex><!-- %i的最大值為3-->
- </rollingPolicy>
- <!-- 觸發策略,通常rollingPolicy與triggeringPolicy聯合使用 -->
- <triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <MaxFileSize>10KB</MaxFileSize>
- </triggeringPolicy>
- <!-- 格式化輸出 -->
- <!-- %d表示日期,格式為:yyyy-MM-dd HH:mm:ss.SSS ;%thread:執行緒名;%-5level:從左邊以5個字元的寬度顯示級別; %logger:顯示logger名;%msg:日誌訊息;%n:換行
- <layoutclass="ch.qos.logback.classic.PatternLayout">
- <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
- </layout>
- -->
- <!-- 或者用下面的形式格式(推薦)-->
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%relative%thread%mdc%level%logger%msg</pattern>
- </encoder>
- <!-- 以html檔案輸出 -->
- <!--
- <encoderclass="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
- <layoutclass="ch.qos.logback.classic.html.HTMLLayout">
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%relative%thread%mdc%level%logger%msg</
相關推薦
logback學習與配置使用
Logback介紹 Logback 分為三個模組:Core、Classic 和 Access。Core模組是其他兩個模組的基礎。 Classic模組擴充套件了core模組。 Classic模組相當於log4j的顯著改進版。Logback-classic 直接實現了 SLF4J API。 要引入lo
基礎LINUX學習與配置
src enable 小寫字母 gcc 中文 conf 個數字 man命令 zxvf 1.別名,內部命令,哈希表,外部命令,運行命令時的優先級別,以pwd為例 1.首先比較別名和內部命令的優先級 運行alias enable=‘pwd‘,enable是一個內部命令,現在我
logback使用與配置檔案logback.xml詳解
一、logback簡介 Logback由log4j創始人設計的另一個開源日誌元件,官網:http://logback.qos.ch。它當前分為下面三模組: logback-core:其它兩個模組的基礎模組 logback-classic:它是log4
logback學習與使用(三)
<filter>: 過濾器,執行一個過濾器會返回個列舉值,即DENY,NEUTRAL,ACCEPT。返回DENY,日誌將被拋棄不再經過其他過濾器,返回NEUTRAL,有序列表中的下個過濾器會接著處理日誌;返回ACCEPT,日誌會立即被處理,不再經過剩餘的過濾器。
【安全牛學習筆記】kali的安裝與配置
信息安全 kali security+ 虛擬機 vbox裝kali虛擬機1. 虛擬影像的選擇由於kali在某些軟件(ferret)上存在32位與64位的區別,為了兼容32位軟件我選擇了32位映像1、vbox下載與安裝vboxde下載與安裝就不細講,畢竟與linux沒太大關系,但安裝後的tool
Docker學習(六): 網絡使用與配置
sock AR -i 回顧 覆蓋 htm 參考 ble dock 特別聲明: 博文主要是學習過程中的知識整理,以便之後的查閱回顧。部分內容來源於網絡(如有摘錄未標註請指出)。內容如有差錯,也歡迎指正! =============系列文章============= 1
ELK學習記錄二 :elasticsearch、logstash及kibana的安裝與配置
jre_home 支持 number yml num des 安裝包 soft filters 註意事項: 1.ELK版本要求5.X以上,本人使用版本:elasticsearch-6.0.0、kibana-6.0.0-linux-x86_64、logstash-6.0.0.
【JAVA學習】03.MyEclipse安裝與配置Tomcat
-- tomcat-8 安裝 圖標 -s 服務器 director 找到 tomcat7 【提要】 Eclipse一般用於J2SE,MyEclipse用於J2EE; 【步驟】 1、安裝MyEclipse,網上隨便下載就好; 2、破解MyEclipse,待破解...
Git學習之路(01-Git簡介與配置)
一次 成了 好處 com 每次 客戶 寫上 時間 全局 前沿 作為程序員,Git的學習是必不可少的,不管項目代碼的開源還是跟蹤管理都離不開它。本人學習Git的過程中,特以在此整理筆記,方便以後查看筆記和解決問題。本人學習的是網上受歡迎的廖雪峰老師的Git教程,的確是簡單易懂
Kubernetes學習系列之簡單叢集安裝與配置
環境配置 CentOS Linux release 7.3.1611 (Core) etcd-v3.2.6 docker-ce-17.03.2.ce kubernetes-v1.6.9 192.168.108.128 節點1 192.168.108.129 節點2 19
Android學習(一)—— Android studio的安裝與配置
最近事比較少,想著做一系列Android的學習,把自己當時遇到的一些整理一下,方便新學android的人學習 首先先來安裝編寫Android的軟體,我這裡用的是android studio Android studio安裝與配
1109_Solr學習總結(二)Solr的安裝與配置
Solr學習總結(二)Solr的安裝與配置 接著前一篇,這裡總結下Solr的安裝與配置 1.準備 1.安裝Java8 和 Tomcat9 ,java和tomcat 的安裝這裡不再重複。需要注意的是這兩個的版本相容問題。貌似java8 不支援,tomcat7
學習python第一步:安裝與配置
半路出家學前端,幹了兩年,其他程式語言沒接觸過,被同事用python自動抓取網頁資料的小程式震撼,決定了解一下 配置:win10系統,python 3.7.1 ,Pycharm 2018.2.4 安裝 安裝python Python官
MySQL學習(一)資料庫安裝與配置全程圖解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
【Nginx】學習之路3 Centos安裝與配置
author:咔咔 wechat:fangkangfk CentOS7安裝詳解 本文基於vmware workstations進行CentOS7安裝過程展示,關於vmware workstations安裝配置本人這裡不再介紹,基本過程相當於windows下安裝個軟體
【Python學習】安裝與配置方法
Python安裝 作為熱門榜上上竄最快,也是當今一款非常流行的語言python!讓我們一起來學習吧 1.下載 官網下載地址:https://www.python.org/downloads/ 這裡我們選擇下載到E盤,下載完成後雙擊。 2.安裝 (
【Maven學習】安裝與配置方法
Maven安裝 1.下載並解壓 【 注意:安裝任何軟體、新專案等在路徑中都不要出現中文路徑。】 官方下載地址:http://maven.apache.org/download.cgi 2.更改配置檔案 (1)更
LInux 學習:Idea 的安裝與配置
第一步:解壓檔案到/usr/local tar zxvf ideaIU-2018.2.4.tar.gz -C /usr/local 第二步:通過命令開啟 /usr/local/idea-IU-18
高負載均衡學習haproxy之安裝與配置
ack 實例 人的 路徑 ESS fault 輸入 小型 .cn 有關高負載均衡的軟件,目前使用比較多的是haproxy、nginx和lvs。下面我們就開始學習haprxoy這款軟件。 一、haproxy介紹 以下開始介紹有關haproxy的原理及其優點。 1.1、hapr
Maven學習總結(2)-Maven的安裝與配置、eclipse整合Maven
Maven的安裝與配置 一、下載 官網地址:http://maven.apache.org/download.cgi 二、安裝 將下載好的壓縮包解壓到D盤 三、配置 1.環境變數配置 (1)在“環境變數-系統變數”中新增一行:變數名為MAVEN