<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    logback_doc_manual_04_appenders

    http://logback.qos.ch/manual/appenders.html
    Appender都集成ch.qos.logback.core.Appender接口。
    每個Appender可以綁定若干個Filter。
    每個Appender可以將任務代理給Layout或者Encoder。
    每個Layout或者Encoder只能屬于1個Appender。
    Appener也可以不包含Layout或者encoder,例如SocketAppender,直接把Event序列化傳輸。
    ch.qos.logback.core.AppenderBase這是一個抽象類,對Appender接口提供了骨架實現(xiàn),線程安全。
    ch.qos.logback.core.UnsynchronizedAppenderBase是對應的線程不安全的類,但是可以將線程安全性委托給下一層的類(例如OutputStream)
    OutputStreamAppender是文件輸出和控制臺輸出Appender的父類,類層次結(jié)構(gòu)如下:


    ConsoleAppender
         輸出到System.out or System.err
    可配置屬性:
         encoder
         target:     默認是System.out
         withJansi:     默認false,用來在windows中支持控制臺色彩的
    樣例:
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
      </appender>
    ----------------------------------------------------------
    FileAppender
         寫入到文件(新消息到來,寫入前,才會判斷是否該分割文件等)
    可配置屬性:
         append:     文件追加,默認為true
         encoder:     
         file:     文件路徑和名詞(如果windows下,記得分隔符轉(zhuǎn)義)
         prudent:     謹慎模式,不同JVM(甚至存在于不同主機上)安全的寫入同一個文件。默認關(guān)閉。
    默認每行都flush到磁盤,可以修改Encoder的immediateFlush屬性來改變這一行為。
    樣例:
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>testFile.log</file>
        <append>true</append>
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    唯一名詞的記錄文件(通過啟動時間戳):
      <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>log-${bySecond}.txt</file>
        <encoder>
          <pattern>%logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    ——這樣就可以在每次項目啟動時生成一個新的文件。
    默認是使用xml解析的時間,也可以指定使用log context的創(chuàng)建時間:
         <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" 
                 timeReference="contextBirth"/>
    ----------------------------------------------------------
    RollingFileAppender
         滾動記錄日志文件
         有兩個子組件:
              RollingPolicy ——接管“滾動”操作,控制該操作如何發(fā)生
              TriggeringPolicy ——決定滾動操作是否發(fā)生,何時發(fā)生
         默認情況下,必須同時含有上述兩個組件。不過有的RollingPolicy也實現(xiàn)了后者的接口,那么可以身兼2職。
    可配置屬性:
         file:
         append:
         encoder:
         rollingPolicy:
         triggeringPolicy:
         prudent:
    RollingPolicy
         包含的操作:將當前的日志文件歸檔(并重命名),壓縮(如果需要)
    TimeBasedRollingPolicy
         最常用的,基于時間滾動,同時實現(xiàn)了RollingPolicy和TriggeringPolicy
         可配置屬性:
              fileNamePattern:     文件名匹配格式
                   文件名+日期定義器“%d”
                   日期定義器的格式在SimpleDateFormat中定義
                   滾動周期是通過日期定義器推斷出來的
                   其父元素RollingFileAppender中file屬性可以省略(因為可以用fileNamePattern猜測出當前時間的日志名)
                        也可以不省略,這樣可以為“當前日志文件”和“歸檔日志文件”分別制定不同的路徑
                   日志定義器中的正反斜杠都會被認為是目錄分隔符
                   可以指定多個日期定義器,但只能有1個是主要的,其余的必須標記為aux(輔助的)
              maxHistory:     最大文件數(shù)
              cleanHistoryOnStart:     啟動時清除歷史歸檔日志
         對fileNamePattern的更詳細的解釋和示例:
              /wombat/foo.%d   
                   按天分隔日志
                   未指定格式,所以默認為yyyy-MM-dd(按天滾動)
                   如果在RollingFileAppender中指定了file(默認日志文件名):
                        今天日志為 /wombat/foo.2006-11-24
                        昨天日志為 /wombat/foo.2006-11-23
                   如果沒有在RollingFileAppender中指定file為“/wombat/foo.txt”,
                        今天日志為 /wombat/foo.txt
                        昨天日志為 /wombat/foo.2006-11-23
                   ——其實不指定默認日志文件名的方式更好,因為避免了滾動時重命名操作,也就避免了潛在異常。
              /wombat/%d{yyyy/MM}/foo.txt
                   按“年/月”分兩級文件夾,文件名固定為“foo.txt”
                   如果在RollingFileAppender中指定了file(默認日志文件名):
                        2006年10月日志為 /wombat/2006/10/foo.txt
                        2006年11月日志為 /wombat/2006/11/foo.txt
                   如果沒有在RollingFileAppender中指定file為“/wombat/foo.txt”,
                        當前正在寫的日志永遠為 /wombat/foo.txt
                        歸檔的日志格式為 /wombat/2006/10/foo.txt
              /wombat/foo.%d{yyyy-ww}.log
                   每個星期歸檔一個新文件(注意具體“哪天算是一個星期的第一天”取決于系統(tǒng)locale屬性)
              /wombat/foo%d{yyyy-MM-dd_HH}.log
                   每小時一次歸檔
              /wombat/foo%d{yyyy-MM-dd_HH-mm}.log
                   每分鐘一次歸檔
              /foo/%d{yyyy-MM,aux}/%d.log
                   每天一次歸檔,但每個月一個新文件夾
                   
         如果fileNamePattern文件名是以.gz或者.zip結(jié)尾的,那么TimeBasedRollingPolicy會自動壓縮:
              /wombat/foo.%d.gz
         日志歸檔是“記錄日志的事件”觸發(fā)的,所以有一定延遲。例如第二天的第一條日志是臨晨01:00才過來,那么這個時候才會歸檔前一天的日志。
    配置樣例:
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
          <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    ----------------------------------------------------------
    FixedWindowRollingPolicy
         可配置屬性:
              minIndex:
              maxIndex:
              fileNamePattern:     
                   必須包含“%i”占位符,用來表示將當前索引值插入什么位置。
                   例如“MyLogFile%i.log”配合“最小1,最大3”,表示文件名為:MyLogFile1.log, MyLogFile2.log, MyLogFile3.log
                   同樣加上zip或gz后綴可以啟用壓縮
         因為每次需要很多重命名操作(重命名次數(shù)等于window size),所以如果設置size超過20,會被強制指定為20.
         配置樣例:
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>test.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <fileNamePattern>tests.%i.log.zip</fileNamePattern>
          <minIndex>1</minIndex>
          <maxIndex>3</maxIndex>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    ----------------------------------------------------------
    SizeAndTimeBasedFNATP(File Naming And Triggering Policy)——是TimeBasedRollingPolicy的一個子組件
         配置樣例:
      <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>mylog.txt</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <!-- rollover daily -->
          <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
          <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <!-- or whenever the file size reaches 100MB -->
            <maxFileSize>100MB</maxFileSize>
          </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
      </appender>
         ——每天滾動一個文件,如果文件體積達到100M,則也拆分。
         ——也支持自動刪除老文件,可以通過maxHistory指定保存的最多文件數(shù)(每天最多這么多,還是一共最多這么多?)
    ----------------------------------------------------------
    SizeBasedTriggeringPolicy——一般配合FixedWindowRollingPolicy使用
         指定文件超過“maxFileSize”指定大小時,上層RollingFileAppender觸發(fā)滾動操作。
         默認“10MB”,可以指定各種后綴:KB,MB,GB
    ----------------------------------------------------------
    ----------------------------------------------------------
    SocketAppender and SSLSocketAppender
    以及后面關(guān)于網(wǎng)絡,數(shù)據(jù)庫,遠程日志服務器,JNDI等……省略……
    ----------------------------------------------------------
    SiftingAppender
         可以根據(jù)指定的變量分割文件。例如根據(jù)用戶ID,則每個用戶一個日志文件。
         
         可配置參數(shù):
              timeout:如果一個關(guān)聯(lián)的appender如果超過默認30分鐘沒有被訪問,則被SiftingAppender卸載掉。
              maxAppenderCount:可以最大追蹤的關(guān)聯(lián)appender數(shù)量,默認int最大值。
         這個Appener會把日志記錄動作代理給關(guān)聯(lián)的appender。
         選擇條件由Discriminator指定,默認為MDCBasedDiscriminator。
         示例,假設應用程序這樣設置了MDC信息:
    logger.debug("Application started");
    MDC.put("userid", "Alice");
    logger.debug("Alice says hello"); 
         然后這樣配置:
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <!-- in the absence of the class attribute, it is assumed that the
             desired discriminator type is
             ch.qos.logback.classic.sift.MDCBasedDiscriminator -->
        <discriminator>
          <key>userid</key>
          <defaultValue>unknown</defaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}" class="ch.qos.logback.core.FileAppender">
            <file>${userid}.log</file>
            <append>false</append>
            <layout class="ch.qos.logback.classic.PatternLayout">
              <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
            </layout>
          </appender>
        </sift>
      </appender>          
         因為確定timeout和maxAppenderCount比較困難,所以如果程序可以知道“執(zhí)行到某個地方很可能應該關(guān)閉對應的appender”,那么可以明確指定一個FINALIZE_SESSION的marker。這樣siftingAppender關(guān)聯(lián)的對應appender,會在接到這個marker的幾秒鐘后關(guān)閉。例如:
    import static ch.qos.logback.classic.ClassicConstants.FINALIZE_SESSION_MARKER;
      void job(String jobId) {
        MDC.put("jobId", jobId);
        logger.info("Starting job.");
        
        // will cause the nested appender reach end-of-life. It will
        // linger for a few seconds.
        logger.info(FINALIZE_SESSION_MARKER, "About to end the job");
        try {
          .. perform clean up
        } catch(Exception e);  
          // This log statement will be handled by the lingering appender. 
          // No new appender will be created.
          logger.error("unexpected error while cleaning up", e);
        }
      }
    ----------------------------------------------------------
    SMTPAppender
         將日志事件緩存指定的數(shù)量,被特定事件觸發(fā)后,異步發(fā)送郵件。
              smtpHost     
              smtpPort     默認25
              to          發(fā)送目標,多個聯(lián)系人可以用逗號隔開,也可以用多個<to>元素
              from      發(fā)送者郵箱,如果想包含名字,可以用特定格式“Adam Smith &lt;smith@moral.org&gt;”
              subject     郵件標題,可以使用PatternLayout的轉(zhuǎn)義字符,會用“觸發(fā)該郵件的日志事件”的信息替換轉(zhuǎn)義字符
              discriminator     默認只有一個緩存。通過指定該屬性,可以有多個緩存,這樣可以根據(jù)事件信息發(fā)給不同的人或者ip
              evaluator     聲明一個<EventEvaluator/>元素,通過class屬性指定類型。默認為OnErrorEvaluator,也可以自己指定OnMarkerEvaluator,JaninoEventEvaluator,GEventEvaluator
              cyclicBufferTracker     環(huán)形緩存跟蹤器,基于discriminator的返回值工作。默認保存緩存大小為256
              username     
              password     
              STARTTLS     如果開啟,會發(fā)起STARTTLS命令,導致連接轉(zhuǎn)換為SSL。連接默認是不使用加密的。默認為false
              SSL          如果開啟,那么使用SSL連接。默認false。
              charsetEncoding     默認UTF-8
              localhost     如果SMTP發(fā)送方的hostname沒配置好,郵件服務器可能拒絕請求,這個時候可以設置這個值為客戶端全名。
              asynchronousSending     異步發(fā)送,默認true。特定情況下需要設置為false,例如應用程序發(fā)送完郵件就會立即關(guān)閉。
              includeCallerData     包含調(diào)用者信息,默認為false。
              sessionViaJNDI     logback依賴javax.mail.Session來發(fā)送郵件。該屬性默認為false,SMTPAppender會根據(jù)配置構(gòu)建新的Session。如果設為true,會去web容器尋找Session對象,此時應用程序不應該再依賴mail.jar等
              jndiLocation     查找JNDI的路徑,例如"java:comp/env/mail/Session"
         最多保存256條日志事件,否則內(nèi)存消耗太大(不建議自己指定其它值)。
         發(fā)郵件依賴JavaMail API (mail.jar)和JavaBeans Activation Framework (activation.jar) ——maven里引入前者會自動依賴后者。
         發(fā)送者和接收者都可以是動態(tài)屬性:
    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
      <smtpHost>${smtpHost}</smtpHost>
      <to>${to}</to>
      <from>${from}</from>
      <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
    </appender>
         注意上面的layout也可以用patternLayout:
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%date %-5level %logger{35} - %message%n</pattern>
        </layout>
    觸發(fā)事件:
         默認是OnErrorEvaluator,但可以自己定制。SMTPAppender僅維護一個Evaluator,這個Evaluator可以自己維護狀態(tài),例如可以實現(xiàn)一個CounterBasedEvaluator。
         
    基于標記Marker的事件觸發(fā):
    Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
    logger.error(notifyAdmin,
      "This is a serious an error requiring the admin's attention",
       new Exception("Just testing"));
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
          <marker>NOTIFY_ADMIN</marker>
          <!-- you specify add as many markers as you want -->
          <marker>TRANSACTION_FAILURE</marker>
        </evaluator>
      </appender>
    還可以使用更加通用的JaninoEventEvaluator或者GEventEvaluator,他們提供更復雜更強大的甄別功能(也包含了OnMarkerEvaluator的功能)。
    身份驗證/STARTTLS/SSL
         SMTPAppender支持用戶名和密碼的加密驗證。
         STARTTLS方式是先使用非加密方式建立連接,然后切換到SSL(常用于server-server交互)。
         SSL方式是直接建立SSL連接(一般用于client-sever交互)。
    Appender configuration for Gmail (SSL)
    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>smtp.gmail.com</smtpHost>
        <smtpPort>465</smtpPort>
        <SSL>true</SSL>
        <username>YOUR_USERNAME@gmail.com</username>
        <password>YOUR_GMAIL_PASSWORD</password>   
      </appender>
    SMTPAppender for Gmail (STARTTLS)
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>smtp.gmail.com</smtpHost>
        <smtpPort>587</smtpPort>
        <STARTTLS>true</STARTTLS>
        <username>YOUR_USERNAME@gmail.com</username>
        <password>YOUR_GMAIL_xPASSWORD</password>    
      </appender>
    Discriminator
         用MDCBasedDiscriminator做示例,根據(jù)MDC的值,維護多個緩存
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator">
          <key>req.remoteHost</key>
          <defaultValue>default</defaultValue>
        </discriminator>
        <subject>${HOSTNAME} -- %X{req.remoteHost} %msg"</subject>
        <layout class="ch.qos.logback.classic.html.HTMLLayout">
          <pattern>%date%level%thread%X{req.remoteHost}%X{req.requestURL}%logger%msg</pattern>
        </layout>
      </appender>
         上面的例子先利用了MDCInsertingServletFilter把請求方的hostname或ip設置到MDC中。
         每一個remoteHost都有一個自己的buffer,一旦某個remoteHost觸發(fā)了發(fā)送郵件的請求,那么該buffer里的256條信息會被發(fā)送出去。
    Buffer管理:
         上面的例子,每一個遠程地址都有自己的buffer,會極大的消耗內(nèi)存。
         默認情況下,logback內(nèi)部最多允許64個buffer同時存在,LRU算法換出。超過30分鐘未使用的buffer也會被換出。該值可以通過maxNumberOfBuffers來設置。
              這里有問題,通過各種手段都無法設置此值,貌似是個bug,我在盡我所能查遍所有資料后,在stackoverflowh和官方jira上提了這個問題:
         在高強度系統(tǒng)中,上面的2個保護機制不夠,需要加入手工管理:通過明確指定“FINALIZE_SESSION”這個Marker,來告訴logback去釋放對應的buffer,這樣就可以安全的將maxNumberOfBuffers設置為512乃至1024。(具體設置辦法參照SiftingAppender里描述的)
    這里是官方的一個SMTPAppender的例子:
    注意Marker可以疊加,所以如果有必要,可以把“發(fā)送郵件的Marker”和“終結(jié)Session(以便清理buffer)的Marker”關(guān)聯(lián)在一起。
         Marker SMTP_TRIGGER = MarkerFactory.getMarker("SMTP_TRIGGER");
         SMTP_TRIGGER.add(FINALIZE_SESSION_MARKER);
    ----------------------------------------------------------
    AsyncAppender
         類似于單獨的一個事件分發(fā)器,所以必須引用另一個appender。
         用一個BlockingQueue緩沖事件,然后創(chuàng)建一個線程,從隊列里獲取事件并分發(fā)給引用的appender。
         默認情況下,如果隊列達到80%的容量,則丟棄TRACE,DEBUG,INFO級別的日志。
         應用程序停止的時候,會通知LoggerContext停止,在停止各個Appender時,AsyncAppender會停止接收日志,并將信息flush到磁盤。
         配置參數(shù):
              queueSize:默認256
              discardingThreshold:默認隊列20%可用的時候開始選擇性拋棄信息,設為0表示不拋棄
              includeCallerData:是否包括調(diào)用者信息(重開銷),默認只復制線程名和MDC信息(因為切換了線程,其余信息會丟失)
         隊列全滿的時候,寫日志動作會被block,直到隊列有可用空間。
    ----------------------------------------------------------
    自定義Appender
         略
    ----------------------------------------------------------          
    ----------------------------------------------------------
    Logback Access
         大部分Appender,在logback-classic與logback-access中使用方式類似。


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

    主站蜘蛛池模板: 亚洲精品无码永久中文字幕| 中文字幕精品亚洲无线码二区 | 3d动漫精品啪啪一区二区免费| 伊人久久大香线蕉亚洲| 西西人体大胆免费视频| 四虎影视在线永久免费观看| 亚洲国产成人久久一区二区三区| 国内一级一级毛片a免费| 亚洲av中文无码乱人伦在线观看 | 67194熟妇在线永久免费观看| 久久亚洲国产精品成人AV秋霞| 日韩人妻一区二区三区免费| 久久99亚洲网美利坚合众国| 57pao一国产成视频永久免费| 亚洲专区中文字幕| 成全视频免费高清 | 久久久久久99av无码免费网站| 精品国产成人亚洲午夜福利| 成人毛片免费在线观看| 美女露100%胸无遮挡免费观看| 亚洲AV无码乱码精品国产| 美女网站在线观看视频免费的 | 免费观看成人久久网免费观看| 亚洲人成网站影音先锋播放| 91嫩草免费国产永久入口| 亚洲情A成黄在线观看动漫软件 | 日韩精品无码永久免费网站| 亚洲永久精品ww47| 57pao国产成视频免费播放| 亚洲精品国产suv一区88| 亚洲色中文字幕无码AV| 久久永久免费人妻精品下载 | 一级毛片视频免费| 青青草原精品国产亚洲av| 免费黄色小视频网站| 中文字幕在线视频免费| 亚洲区视频在线观看| 亚洲成?v人片天堂网无码| 日韩免费无码一区二区三区| 亚洲欧美国产欧美色欲| 亚洲欧洲成人精品香蕉网|