Logback淺析


1、Logback為取代log4j而生

     Logback是由log4j創始人Ceki Gülcü設計的又一個開源日志組件。logback當前分成三個模塊:logback-core,logback- classic和logback-access。

2、Logback的核心對象:Logger、Appender、Layout

     Logback主要建立於LoggerAppender  Layout 這三個類之上。

     Logger:日志的記錄器,把它關聯到應用的對應的context上后,主要用於存放日志對象,也可以定義日志類型、級別。Logger對象一般多定義為靜態常量,如:

 1 package com.logs;
 2 
 3 import org.slf4j.Logger;
 4 import org.slf4j.LoggerFactory;
 5 
 6 public class MyApp {
 7     final static Logger logger = LoggerFactory.getLogger("MyApp.class");
 8     public static void main(String[] args) {
 9         
10         logger.trace("trace");
11         logger.debug("debug str");
12         logger.info("info str");
13         logger.warn("warn");
14         logger.error("error");
15     }
16 }

     Appender:用於指定日志輸出的目的地,目的地可以是控制台、文件、遠程套接字服務器、 MySQL、 PostreSQL、Oracle和其他數據庫、 JMS和遠程UNIX Syslog守護進程等。

     Layout:負責把事件轉換成字符串,格式化的日志信息的輸出。具體的Layout通配符,可以直接查看幫助文檔。

3、Level 有效級別

    Logger可以被分配級別。級別包括:TRACE、DEBUG、INFO、WARN和ERROR,定義於ch.qos.logback.classic.Level類。程序會打印高於或等於所設置級別的日志,設置的日志等級越高,打印出來的日志就越少。如果設置級別為INFO,則優先級高於等於INFO級別(如:INFO、 WARN、ERROR)的日志信息將可以被輸出,小於該級別的如DEBUG將不會被輸出。為確保所有logger都能夠最終繼承一個級別,根logger總是有級別,默認情況下,這個級別是DEBUG。

4、 三值邏輯

   Logback的過濾器基於三值邏輯(ternary logic),允許把它們組裝或成鏈,從而組成任意的復合過濾策略。過濾器很大程度上受到Linux的iptables啟發。這里的所謂三值邏輯是說,過濾器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一個。

如果返回DENY,那么記錄事件立即被拋棄,不再經過剩余過濾器;

如果返回NEUTRAL,那么有序列表里的下一個過濾器會接着處理記錄事件;

如果返回ACCEPT,那么記錄事件被立即處理,不再經過剩余過濾器。

5、Filter 過濾器

    Logback-classic提供兩種類型的過濾器:常規過濾器和TuroboFilter過濾器。Logback整體流程:Logger 產生日志信息;Layout修飾這條msg的顯示格式;Filter過濾顯示的內容;Appender具體的顯示,即保存這日志信息的地方。

6、具體使用案例

     Java項目中一般都會應用比如struts、spring、hibernate等開源框架,而這些框架很多是應用log4j記錄日志的,所以我們考慮用log4j + slf4j + logback 。這樣我們需要導入log4j-over-slf4j-1.6.4.jar 、logback-classic-1.0.1.jar 、logback-core-1.0.1.jar 、slf4j-api-1.6.4.jar ,如果你要用到EvaluatorFilter過濾器來過濾日志Msg中的特殊字符需要導入其依賴包 janino-2.3.2.jar。其logback.xml

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <configuration>
  3 
  4     <!-- 控制台輸出 -->
  5     <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  6         <encoder>
  7             <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
  8         </encoder>
  9     </appender>
 10 
 11     <!-- 時間滾動輸出 level為 DEBUG 日志 -->
 12     <appender name="file—debug"
 13         class="ch.qos.logback.core.rolling.RollingFileAppender">
 14         <filter class="ch.qos.logback.classic.filter.LevelFilter">
 15             <level>DEBUG</level>
 16             <onMatch>ACCEPT</onMatch>
 17             <onMismatch>DENY </onMismatch>
 18         </filter>
 19         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
 20             <FileNamePattern>D:/logs/debug.%d{yyyy-MM-dd}.log</FileNamePattern>
 21             <MaxHistory>30</MaxHistory>
 22         </rollingPolicy>
 23         <encoder>
 24             <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
 25         </encoder>
 26     </appender>
 27 
 28     <!-- 時間滾動輸出 level為 ERROR 日志 -->
 29     <appender name="file—error"
 30         class="ch.qos.logback.core.rolling.RollingFileAppender">
 31         <filter class="ch.qos.logback.classic.filter.LevelFilter">
 32             <level>ERROR</level>
 33             <onMatch>ACCEPT</onMatch>
 34             <onMismatch>DENY </onMismatch>
 35         </filter>
 36         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
 37             <FileNamePattern>D:/logs/error.%d{yyyy-MM-dd}.log</FileNamePattern>
 38             <MaxHistory>30</MaxHistory>
 39         </rollingPolicy>
 40         <encoder>
 41             <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
 42         </encoder>
 43     </appender>
 44 
 45     <!-- 特定過濾含有某字符串的日志 -->
 46     <appender name="file-str"
 47         class="ch.qos.logback.core.rolling.RollingFileAppender">
 48         <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
 49             <evaluator>
 50                 <expression>message.contains("str")</expression>
 51             </evaluator>
 52             <onMatch>ACCEPT</onMatch>
 53             <onMismatch>DENY</onMismatch>
 54         </filter>
 55         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
 56             <FileNamePattern>D:/logs/contains.%d{yyyy-MM-dd}.log
 57             </FileNamePattern>
 58             <MaxHistory>30</MaxHistory>
 59         </rollingPolicy>
 60         <encoder>
 61             <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
 62         </encoder>
 63     </appender>
 64 
 65     <!-- 數據庫輸出 -->
 66     <appender name="db" class="ch.qos.logback.classic.db.DBAppender">
 67         <connectionSource
 68             class="ch.qos.logback.core.db.DriverManagerConnectionSource">
 69             <driverClass>com.mysql.jdbc.Driver</driverClass>
 70             <url>jdbc:mysql://host_name:3306/datebase_name</url>
 71             <user>username</user>
 72             <password>password</password>
 73         </connectionSource>
 74     </appender>
 75 
 76     <logger name="java.sql.Connection">
 77         <level value="DEBUG" />
 78     </logger>
 79     <logger name="java.sql.Statement">
 80         <level value="DEBUG" />
 81     </logger>
 82     <logger name="com.ibatis">
 83         <level value="DEBUG" />
 84     </logger>
 85     <logger name="com.ibatis.common.jdbc.SimpleDataSource">
 86         <level value="DEBUG" />
 87     </logger>
 88     <logger name="com.ibatis.common.jdbc.ScriptRunner">
 89         <level value="DEBUG" />
 90     </logger>
 91     <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate">
 92         <level value="DEBUG" />
 93     </logger>
 94     <logger name="com.danga.MemCached">
 95         <level value="INFO" />
 96     </logger>
 97     <logger name="org.springframework.test">
 98         <level value="DEBUG" />
 99     </logger>
100     <logger name="org.apache.struts2">
101         <level value="DEBUG" />
102     </logger>
103 
104     <root level="DEBUG">
105         <appender-ref ref="stdout" />
106         <appender-ref ref="file—debug" />
107         <appender-ref ref="file—error" />
108         <appender-ref ref="file-str" />
109         <appender-ref ref="db" />
110     </root>
111 
112 </configuration>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM