spring mvc+logback日志(2)--日志規(guī)則技巧

參考資料

logback 中文手冊(cè)

一票罐、基本規(guī)則

使用
Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
//logger定義
package org.slf4j; 
public interface Logger { 
  public void trace(String message);
  public void debug(String message);
  public void info(String message); 
  public void warn(String message); 
  public void error(String message); 
}
logger打印規(guī)則

如果一條的日志的打印級(jí)別大于 logger 的有效級(jí)別,該條日志才可以被打印出來(lái)绅这。這條規(guī)則總結(jié)如下:
日志的打印級(jí)別為 p,Logger 實(shí)例的級(jí)別為 q,如果 p >= q悍手,則該條日志可以打印出來(lái)。
這條規(guī)則是 logbakc 的核心袍患。各級(jí)別的排序?yàn)椋篢RACE < DEBUG < INFO < WARN < ERROR坦康。
舉例

        ch.qos.logback.classic.Logger logger = 
                (ch.qos.logback.classic.Logger)LoggerFactory.getLogger("com.foo");
        // 設(shè)置 logger 的級(jí)別為 INFO
        logger.setLevel(Level.INFO);

        // 這條日志可以打印,因?yàn)?WARN >= INFO
        logger.warn("警告信息");
        // 這條日志不會(huì)打印诡延,因?yàn)?DEBUG < INFO
        logger.debug("調(diào)試信息");
appender疊加規(guī)則

如果 root logger 添加了一個(gè) console appender滞欠,所有允許輸出的日志至少會(huì)在控制臺(tái)打印出來(lái)。如果再給一個(gè)叫做 L 的 logger 添加了一個(gè) file appender肆良,那么 L 以及 L 的子級(jí) logger 都可以在文件和控制臺(tái)打印日志筛璧。可以通過(guò)設(shè)置 additivity = false 來(lái)改寫(xiě)默認(rèn)的設(shè)置惹恃,這樣 appender 將不再具有疊加性夭谤。

提前判定,避免損耗
if(logger.isDebugEnabled()) { 
  logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
更優(yōu)的日志格式化

下面兩行輸出的結(jié)果是一樣的巫糙,但是一旦禁止日志打印朗儒,第二個(gè)變量的性能至少比第一個(gè)變量好上 30 倍。

logger.debug("The new entry is " + entry + ".");  //不推薦
logger.debug("The new entry is {}", entry);
logger.debug("The new entry is {}, It replaces {}.", entry, oldEntry);//使用兩個(gè)參數(shù)的例子
Object[] paramArray = {newVal, below, above};
logger.debug("Value {} was inserted between {} and {}.", paramArray);//使用三個(gè)或三個(gè)以上的參數(shù)

一、配置相關(guān)

自動(dòng)化配置logback.xml

以下是 logback 的初始化步驟:

  1. logback 會(huì)在類路徑下尋找名為 logback-test.xml 的文件醉锄。
  2. 如果沒(méi)有找到疲牵,logback 會(huì)繼續(xù)尋找名為 logback.groovy 的文件。
  3. 如果沒(méi)有找到榆鼠,logback 會(huì)繼續(xù)尋找名為 logback.xml 的文件纲爸。
  4. 如果沒(méi)有找到,將會(huì)通過(guò) JDK 提供的 ServiceLoader 工具在類路徑下尋找文件 META-INFO/services/ch.qos.logback.classic.spi.Configurator妆够,該文件的內(nèi)容為實(shí)現(xiàn)了 Configurator 接口的實(shí)現(xiàn)類的全限定類名识啦。
  5. 如果以上都沒(méi)有成功,logback 會(huì)通過(guò)BasicConfigurator為自己進(jìn)行配置神妹,并且日志將會(huì)全部在控制臺(tái)打印出來(lái)颓哮。

最后一步的目的是為了保證在所有的配置文件都沒(méi)有被找到的情況下,提供一個(gè)默認(rèn)的(但是是非惩臆基礎(chǔ)的)配置冕茅。

下面的配置等同于通過(guò) BasicConfigurator進(jìn)行配置

<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>

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
在警告或錯(cuò)誤的情況下自動(dòng)打印狀態(tài)信息

編碼方式實(shí)現(xiàn)

        LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
        StatusPrinter.print(lc);

配置方式實(shí)現(xiàn),增加debug="true"

<configuration debug="true"></configuration>

等效配置

<configuration>
    <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    <!-- 剩下的配置跟之前的相同 -->
</configuration>

區(qū)別:
但是,如果配置文件沒(méi)有被找到蛹找,logback 不會(huì)打印它的內(nèi)部狀態(tài)信息姨伤,因?yàn)闆](méi)有檢測(cè)到錯(cuò)誤。通過(guò)編碼方式調(diào)用 StatusPrinter.print() 方法會(huì)在任何情況下都打印狀態(tài)信息庸疾。

當(dāng)配置文件更改時(shí)乍楚,自動(dòng)加載
 <!-- 默認(rèn)情況下,一分鐘掃描一次配置文件届慈,看是否有更改徒溪。通過(guò) <configuration> 標(biāo)簽上的 scanPeriod 屬性可以指定掃描周期。掃描周期的時(shí)間單位可以是毫秒金顿、秒臊泌、分鐘或者小時(shí)-->
<configuration scan="true" scanPeriod="30 seconds">
</configuration>

當(dāng)設(shè)置了 scan="true",會(huì)新建一個(gè) ReconfigureOnChangeTask 任務(wù)用于監(jiān)視配置文件是否變化揍拆。ReconfigureOnChangeTask 也會(huì)自動(dòng)監(jiān)視外部文件的變化渠概。

查看內(nèi)部狀態(tài)信息

logback-classic 包含一個(gè)名叫 ViewStatusMessagesServlet 的 servlet。這個(gè) servlet 打印當(dāng)前 LoggerContext 的 StatusManager 的內(nèi)容礁凡,通過(guò) html 進(jìn)行輸出高氮。
在 WEB-INF/web.xml 中添加如下代碼:

<servlet>
    <servlet-name>ViewStatusMessages</servlet-name>
    <servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ViewStatusMessages</servlet-name>
    <url-pattern>/lbClassicStatus</url-pattern>
</servlet-mapping>

然后可以通過(guò) http://host/yourWebapp/lbClassicStatus 進(jìn)行訪問(wèn)。

配置 <logger> 標(biāo)簽

【must】 name 屬性
【option】 level 屬性
【option】 additivity 屬性
【0-n】<appender-ref> 元素

配置<root> 元素

【option】 level 屬性
【0-n】<appender-ref> 元素

    <logger name="chapters.configuration" level="INFO" />

    <logger name="chapters.configuration.Foo" level="DEBUG" />

    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>

與 log4j 不同的是顷牌,logbakc-classic 不會(huì)關(guān)閉或移除任何之前在 logger 上定義好的的 appender剪芍。


配置<appender> 元素

【must】 name】、class 屬性
【0-n】<layout>窟蓝、<filter>罪裹、<encoder> 元素

<layout> 元素強(qiáng)制一個(gè) class 屬性去指定一個(gè)類的全限定名饱普,用于實(shí)例化。與 <appender> 元素一樣状共,<layout> 元素也可以包含與 layout 實(shí)例相關(guān)的屬性套耕。如果 layout 的 class 是 PatternLayout,那么 class 屬性可以被隱藏掉(參考:默認(rèn)類映射)峡继,因?yàn)檫@個(gè)很常見(jiàn)冯袍。.
<encoder 元素強(qiáng)制一個(gè) class 屬性去指定一個(gè)類的全限定名,用于實(shí)例化碾牌。如果 encoder 的 class 是 PatternLayoutEncoder康愤,那么基于默認(rèn)類映射,class 屬性可以被隱藏舶吗。

錯(cuò)誤示范征冷,會(huì)導(dǎo)致重復(fù)打印chapters.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>

    <logger name="chapters.configuration">
        <appender-ref ref="STDOUT" />
    </logger>

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
設(shè)置 context 的名字

默認(rèn)這個(gè) logger context 的名字為 "default"。但是你可以通過(guò) <contextName> 設(shè)置其它的名字誓琼。

<configuration>
    <contextName>myAppName</contextName>
</configuration>
變量的定義
<configuration>
      <!-- 定義方式一 -->
    <property name="USER_NAME" value="/data/logs" />
     <!-- 定義方式二 -->
    <property file="F:\project\logback-examples\src\main\resources\variables1.properties"/>
     <!-- 定義方式三 -->
   <property resource="resource1.properties" />

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${USER_NAME}/myApp.log</file>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="FILE" />
    </root>    
</configuration>
變量的作用域

屬性的作用域分別為本地(local scope)检激、上下文(context scope)、系統(tǒng)(system scope)腹侣。默認(rèn)為本地作用域叔收。

在進(jìn)行變量替換的時(shí)候,會(huì)先從本地范圍去找筐带,再?gòu)纳舷挛娜フ医翊購(gòu)南到y(tǒng)屬性中去找,最后會(huì)去系統(tǒng)的環(huán)境變量中去找伦籍。

可以通過(guò) <property>、<define>腮出、<insertFromJNDI> 元素的 scope 屬性來(lái)設(shè)置變量的作用范圍帖鸦。scope 屬性可能的值為:local,context胚嘲,system作儿。如果沒(méi)有指定,則默認(rèn)為 local馋劈。

<property scope="context" name="nodeId" value="firstNode"/>
變量的默認(rèn)值

攻锰。在 bash shell 中,默認(rèn)值可以通過(guò) ":-" 來(lái)指定妓雾。例如:假設(shè)變量 aName 沒(méi)有被定義娶吞,"${aNme:-golden}" 會(huì)被解釋成 "golden" 。

<file>${USER_NAME:-jack js}/myApp.log</file>
變量的嵌套
USER_HOME=/data/logs
fileName=myApp.log
destination=${USER_HOME}/${fileName}
系統(tǒng)預(yù)定義屬性
<pattern>${HOSTNAME} - %msg%n</pattern>
<pattern>${CONTEXT_NAME} - %msg%n</pattern>
引入文件

通過(guò) <include> 元素可以引入外部的配置文件械姻。

<configuration>
    <include file="src/main/resources/includedConfig.xml" />

    <root level="DEBUG">
        <appender-ref ref="includedConsole" />
    </root>
</configuration>

目標(biāo)文件必須是由 <included> 元素包裹的妒蛇。

<included>
    <appender name="includedConsole" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d - %m%n</pattern>
        </encoder>
    </appender>
</included>

如果 logback 沒(méi)有通過(guò) include 元素找到指定的配置文件,會(huì)在控制臺(tái)打印出內(nèi)部狀態(tài)信息。如果引入的外部配置文件是可選的绣夺,可以設(shè)置 optional=true吏奸。

<include optional="true" ..../>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市陶耍,隨后出現(xiàn)的幾起案子奋蔚,更是在濱河造成了極大的恐慌,老刑警劉巖烈钞,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旺拉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡棵磷,警方通過(guò)查閱死者的電腦和手機(jī)蛾狗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仪媒,“玉大人沉桌,你說(shuō)我怎么就攤上這事∷惴裕” “怎么了留凭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)偎巢。 經(jīng)常有香客問(wèn)我蔼夜,道長(zhǎng),這世上最難降的妖魔是什么压昼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任求冷,我火速辦了婚禮,結(jié)果婚禮上窍霞,老公的妹妹穿的比我還像新娘匠题。我一直安慰自己,他們只是感情好但金,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布韭山。 她就那樣靜靜地躺著,像睡著了一般冷溃。 火紅的嫁衣襯著肌膚如雪钱磅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天似枕,我揣著相機(jī)與錄音盖淡,去河邊找鬼。 笑死菠净,一個(gè)胖子當(dāng)著我的面吹牛禁舷,可吹牛的內(nèi)容都是我干的彪杉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼牵咙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼派近!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起洁桌,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渴丸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后另凌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谱轨,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年吠谢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了土童。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡工坊,死狀恐怖献汗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情王污,我是刑警寧澤罢吃,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站昭齐,受9級(jí)特大地震影響尿招,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阱驾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一就谜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啊易,春花似錦吁伺、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捆愁。三九已至割去,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昼丑,已是汗流浹背呻逆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菩帝,地道東北人咖城。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓茬腿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宜雀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子切平,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一 logback簡(jiǎn)介 Logback是一個(gè)開(kāi)源日志組件。Logback一般和SLF4結(jié)合起來(lái)使用辐董。外層使用S...
    tuacy閱讀 1,770評(píng)論 0 3
  • 前言 今天來(lái)介紹下Spring Boot如何配置日志logback,我剛學(xué)習(xí)的時(shí)候悴品,是帶著下面幾個(gè)問(wèn)題來(lái)查資料的,...
    嘟爺MD閱讀 3,109評(píng)論 1 26
  • 一:根節(jié)點(diǎn)包含的屬性: scan: 當(dāng)此屬性設(shè)置為true時(shí)简烘,配置文件如果發(fā)生改變苔严,將會(huì)被重新加載,默認(rèn)值為tru...
    把愛(ài)放下會(huì)走更遠(yuǎn)閱讀 631評(píng)論 0 0
  • logback 標(biāo)簽(空格分隔): java 1.概述 LogBack是一個(gè)日志框架. 1.1 LogBack孤澎、S...
    李米學(xué)閱讀 1,174評(píng)論 0 2
  • 《按自己的意愿過(guò)一生》1 不得不跟一個(gè)無(wú)比討厭的人挑起新的一輪拉鋸戰(zhàn)届氢。今天吹起戰(zhàn)爭(zhēng)的號(hào)角,冰冷的風(fēng)吹的人無(wú)比清醒覆旭,...
    3a08e03e222a閱讀 59評(píng)論 0 1