隨筆 - 22, 文章 - 0, 評論 - 1, 引用 - 0
          數(shù)據(jù)加載中……

          logback_doc_manual_03_configuration

          -------------------------------------------------------
          與spring的配置:
          貌似官網(wǎng)上沒有介紹,但是作者在github上建立了一個擴展項目用于logback與spring結(jié)合。
          目前最新版本是0.1.2,很多maven公開庫里已經(jīng)有了。
          maven配置:
          <dependency>  
               <groupId>org.logback-extensions</groupId>  
               <artifactId>logback-ext-spring</artifactId>  
               <version>0.1.2</version>  
          </dependency>
          web.xml配置日志框架啟動監(jiān)聽器:
          <!-- logback配置文件 -->
          <context-param>
               <param-name>logbackConfigLocation</param-name>
               <param-value>/WEB-INF/classes/logback.xml</param-value>
          </context-param>
          <!-- logback加載監(jiān)聽器 -->
          <listener>
               <listener-class>
                    ch.qos.logback.ext.spring.web.LogbackConfigListener
               </listener-class>
          </listener>
          -------------------------------------------------------
          logback中的配置:
          可以用java程序配置,也可以用xml或者groovy腳本配置。
          使用 http://logback.qos.ch/translator/ 可以把log4j的配置自動轉(zhuǎn)換過來。
          logback內(nèi)部查找配置的過程:
               1,在classpath查找“logback.groovy”
               2,在classpath查找“logback-test.xml”
               3,在classpath查找“logback.xml”
               4,使用自身的BasicConfigurator做基本配置,所有日志被輸出到控制臺。
               —— 一般把“logback-test.xml”放到maven的測試路徑,把“logback.xml”放到maven的正式路徑,前者優(yōu)先級更高。
          logback的狀態(tài),加載配置文件的過程:
               代碼打印:
                    LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
                    StatusPrinter.print(lc);
               配置文件形式打印:
                    <configuration debug="true">
                      ... 
                    </configuration>
               也可以通過設(shè)置StatusListener來監(jiān)聽logback的啟動和打印狀態(tài)——在生產(chǎn)環(huán)境挺有用,因為配置文件路徑挺深。
          通過在系統(tǒng)變量里加入"logback.configurationFile"指定logback配置文件路徑:
               java -Dlogback.configurationFile=/path/to/config.xml chapters.configuration.MyApp1
          設(shè)置自動掃描和遇到變更時重新加載配置文件(不指定周期的話默認(rèn)每1分鐘):
               <configuration scan="true" scanPeriod="30 seconds"> 
                 ... 
               </configuration> 
               每當(dāng)N個(logback會自動調(diào)節(jié))日志請求,logback會檢查一下掃描周期是否已經(jīng)到達(dá),如到達(dá)再檢查配置文件。
          通過web訪問狀態(tài)信息:
          在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>
          然后訪問:http://host/yourWebapp/lbClassicStatus
          注冊控制臺狀態(tài)監(jiān)聽器:
               java代碼方式:
                    LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
                    StatusManager statusManager = lc.getStatusManager();
                    OnConsoleStatusListener onConsoleListener = new OnConsoleStatusListener();
                    statusManager.add(onConsoleListener);
               用配置文件方式:
                    <configuration>
                      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
                      ...
                    </configuration>
               系統(tǒng)變量方式:
                    java -Dlogback.statusListenerClass=ch.qos.logback.core.status.OnConsoleStatusListener
          停止logback:
               java代碼方式:
                    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
                    loggerContext.stop();
               web應(yīng)用:
                    ServletContextListener.contextDestroyed()會自動調(diào)用上面的stop方法。
          -------------------------------------------------------
          配置文件格式:
               最外層是<configuration>元素,里面有<appender><logger><root>元素
          <logger>元素:
               level屬性可以這些值:TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF,也可以明確指定繼承:INHERITED或者NULL
               包含若干<appender-ref>元素,指定appender的名字。
          從DEBUG改為INFO級別:
          <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>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
              </encoder>
            </appender>
            <logger name="chapters.configuration" level="INFO"/>
            <!-- Strictly speaking, the level attribute is not necessary since -->
            <!-- the level of the root level is set to DEBUG by default.       -->
            <root level="DEBUG">          
              <appender-ref ref="STDOUT" />
            </root>  
          </configuration>
          -------------------------------------------------------
          配置Appender:
               name和class屬性
               內(nèi)嵌0個或1個layout元素,0個或多個encoder元素,0個或多個filter元素。還可以內(nèi)嵌任意數(shù)量的appdenter類的屬性(例如自定義的appender類)。
               layout元素應(yīng)該內(nèi)嵌具體的layout類,但是默認(rèn)就是PatternLayoutEncoder。
          Appender的累加性:
               logger會記錄在所有綁定在它自身的appender,同時也會記錄在該logger祖先的appender上,所以有可能重復(fù)記錄!
          配置Logger Context(可以用在“多個項目寫入同一個日志文件”這種情況):
          <configuration>
            <contextName>myAppName</contextName>
            ...
          </configuration>
          -------------------------------------------------------
          變量替換:
          <configuration>
            <property name="USER_HOME" value="/home/sebastien" />
            <appender name="FILE" class="ch.qos.logback.core.FileAppender">
              <file>${USER_HOME}/myApp.log</file>
              ...
            </appender>
             ...
          </configuration>
          ——上面的變量定義在系統(tǒng)屬性里也可以:java -DUSER_HOME="/home/sebastien" MyApp2
          變量也可以定義在文件里:
          <configuration>
            <property file="src/main/java/chapters/configuration/variables1.properties" />
            <appender name="FILE" class="ch.qos.logback.core.FileAppender">
               <file>${USER_HOME}/myApp.log</file>
               ...
             </appender>
             ...
          </configuration>
          ——對應(yīng)路徑的文件里應(yīng)該加入“USER_HOME=/home/sebastien”
          (這路徑挺詭異啊,是maven的結(jié)構(gòu),那打包后豈不是不能用了?)
          像這樣引用classpath的還靠譜些:
          <property resource="resource1.properties" />
          變量可以指定作用域:local,context,system
          變量可以相互引用:
               USER_HOME=/home/sebastien
               fileName=myApp.log
               destination=${USER_HOME}/${fileName}
          命名引用:如果"userid"會被替換為"alice",那么"${${userid}.password}"會被替換為"alice.password"對應(yīng)的值。
          變量可以指定默認(rèn)值:${aName:-golden}  ——這就指定了默認(rèn)值golden
          變量的默認(rèn)值也可以引用變量: "${id:-${userid}}
          預(yù)置變量:HOSTNAME,CONTEXT_NAME
          可以通過timestamp元素定義一個當(dāng)前的日期和時間的動態(tài)元素。
          可以自己繼承PropertyDefiner實現(xiàn)動態(tài)生成屬性,現(xiàn)在內(nèi)置了2個動態(tài)屬性生成器:
               FileExistsPropertyDefiner     如果指定路徑文件存在,則將指定屬性設(shè)為“true”,反之亦然
               ResourceExistsPropertyDefiner     如果指定資源存在,則將指定屬性設(shè)為“true”,反之亦然
          條件語句:
             <!-- if-then form -->
             <if condition="some conditional expression">
              <then>
                ...
              </then>
            </if>
            <!-- if-then-else form -->
            <if condition="some conditional expression">
              <then>
                ...
              </then>
              <else>
                ...
              </else>    
            </if>
          判斷條件只支持context變量和system變量,用property()或者p()來引用——如果沒有設(shè)定對應(yīng)變量,這兩個方法會返回空串(而不是null)
          isDefine()和isNull()分別判斷變量是否設(shè)置和變量是否為空。
               <if condition='property("HOSTNAME").contains("torino")'>
               ...
               </if>
          可以從JNDI讀取變量值(作用域為local)。也可以將從JNDI讀取的變量存入另一個不同作用域的變量。
               <configuration>
                 <insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />
                 ...
               </configuration>
          -------------------------------------------------------
          文件包含(可以使用相對路徑。當(dāng)前路徑已經(jīng)在當(dāng)前項目中定義,所以沒必要與配置文件路徑關(guān)聯(lián)):
          <configuration>
            <include file="src/main/java/chapters/configuration/includedConfig.xml"/>
            ...
          </configuration>     
          被包含的文件必須用<include>標(biāo)簽包裹:
          <included>
            <appender name="includedConsole" class="ch.qos.logback.core.ConsoleAppender">
              <encoder>
                <pattern>"%d - %m%n"</pattern>
              </encoder>
            </appender>
          </included>
          還可以關(guān)聯(lián)資源(例如classpath下的某個文件):
               <include resource="includedConfig.xml"/>
          還可以關(guān)聯(lián)URL:
               <include url="http://some.host.com/includedConfig.xml"/>
          可以指定此次文件包含為“可選的”:
               <include optional="true" ..../>
          -------------------------------------------------------
          LoggerContextListener
          其中一個實現(xiàn)LevelChangePropagator會監(jiān)聽日志環(huán)境的合適的生命周期,并把日志級別的變化傳播給JUL,這樣JUL關(guān)閉的日志不會再傳遞給slf4j,用這種方式對性能沖擊較小,適合jul-to-slf4j的橋接包。

          posted on 2014-07-13 18:56 王星游 閱讀(1281) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 喀喇沁旗| 平江县| 安国市| 涟源市| 泸水县| 鄢陵县| 石屏县| 屏山县| 江山市| 邵武市| 诸城市| 六盘水市| 汾西县| 当阳市| 乐亭县| 吴桥县| 乌拉特中旗| 云和县| 靖州| 荥阳市| 涪陵区| 榆树市| 高碑店市| 民乐县| 紫阳县| 建始县| 滨海县| 玉田县| 博罗县| 新巴尔虎右旗| 苏尼特左旗| 卢氏县| 巴林右旗| 浙江省| 保靖县| 镇雄县| 观塘区| 金湖县| 岗巴县| 武定县| 裕民县|