1. logback介紹
Logback是由log4j創始人設計的又一個開源日志組件。logback當前分成三個模塊:logback-core,logback- classic和logback-access。
- logback-core是其它兩個模塊的基礎模塊。
- logback-classic是log4j的一個 改良版本。此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日志系統如log4j或JDK14 Logging。
- logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能。
要引入logback,由于Logback-classic依賴slf4j-api.jar和logback-core.jar,所以要把slf4j-api.jar、logback-core.jar、logback-classic.jar,添加到要引入Logback日志管理的項目的class path中.
2. maven依賴
<!-- 添加slf4j日志api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!-- 添加logback-classic依賴 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 添加logback-core依賴 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
配置和使用
日志使用
一定要使用slf4j的jar包,不要使用apache commons的jar。否則滾動生成文件不生效,不滾動的時候卻生效~~
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
使用:
@Controller
@RequestMapping("/test")
public class TestController {
protected final Logger logger = LoggerFactory.getLogger(TestController .getClass());
@RequestMapping("/hello")
public void hello(HttpServletResponse response) throws IOException {
logger.debug("DEBUG TEST 這個地方輸出DEBUG級別的日志");
logger.info("INFO test 這個地方輸出INFO級別的日志");
logger.error("ERROR test 這個地方輸出ERROR級別的日志");
}
}
2.Logback的默認配置
logback的配置文件都放在/src/main/resource/文件夾下的logback.xml文件中。其中logback.xml文件就是logback的配置文件。只要將這個文件放置好了之后,系統會自動找到這個配置文件。
如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默認地會調用BasicConfigurator ,創建一個最小化配置。最小化配置由一個關聯到根 logger 的ConsoleAppender組成。輸出用模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的PatternLayoutEncoder 進行格式化。rootlogger 默認級別是 DEBUG。
logback配置文件
Logback 配置文件的語法非常靈活。正因為靈活,所以無法用 DTD 或 XML schema 進行定義。盡管如此,可以這樣描述配置文件的基本結構:以<configuration>開頭,后面有零個或多個<appender>元素,有零個或多個<logger>元素,有最多一個<root>元素。
Logback默認配置的采用的步驟
- 嘗試在 classpath 下查找文件 logback-test.xml;
- 如果文件不存在,則查找文件 logback.xml;
- 如果兩個文件都不存在,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。
3. 在控制臺輸出特定級別的日志
輸出特定的ERROR級別的日志:
<?xml version="1.0"?>
<configuration>
<!-- ch.qos.logback.core.ConsoleAppender 控制臺輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志級別 -->
<root>
<level value="error" />
<appender-ref ref="console" />
</root>
</configuration>
結果只在控制臺輸出ERROR級別的日志。
4. 設置輸出多個級別的日志
<?xml version="1.0"?>
<configuration>
<!-- ch.qos.logback.core.ConsoleAppender 控制臺輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志級別 -->
<root>
<level value="error" />
<level value="info" />
<appender-ref ref="console" />
</root>
</configuration>
5. 設置文件日志
這是一個比較簡單的配置,沒有不同級別的日志分別輸出。
<?xml version="1.0"?>
<configuration>
<!-- 定義日志的根目錄 -->
<property name="LOG_HOME" value="D:/logs" />
<!-- 定義日志文件名稱 -->
<property name="appName" value="SpringShiro"></property>
<!-- ch.qos.logback.core.ConsoleAppender 控制臺輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger{36} %line: %msg%n
</pattern>
</encoder>
</appender>
<!-- ch.qos.logback.core.rolling.RollingFileAppender 文件日志輸出 -->
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/${appName}.log</File>
<encoder>
<Pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%thread] %logger{36} : %n %msg %n</Pattern>
<charset>UTF-8</charset> <!--解決中文亂碼問題-->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log
</FileNamePattern>
<MaxHistory>10</MaxHistory>
<!--
當日志文件超過maxFileSize指定的大小是,根據上面提到的%i進行日志文件滾動
注意此處配置SizeBasedTriggeringPolicy是無法實現按文件大小進行滾動的,
必須配置timeBasedFileNamingAndTriggeringPolicy
-->
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>5MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- 將上面兩個 appender 關聯到我們的項目 -->
<logger name="com.zjw.shiro" level="DEBUG" additivity="false"> <!-- name 是項目包名,為了方便調試,輸出 DEBUG 級別及其以上的log -->
<appender-ref ref="console"/>
<appender-ref ref="file" />
</logger>
<!--
root與logger是父子關系,沒有特別定義則默認為root,任何一個類只會和一個logger對應,
要么是定義的logger,要么是root,判斷的關鍵在于找到這個logger,然后判斷這個logger的appender和level。
-->
<!-- 日志級別 -->
<root>
<!-- 定義了ERROR和INFO級別的日志,分別在FILE文件和控制臺輸出 -->
<level value="error" />
<level value="info" />
<appender-ref ref="file" />
<appender-ref ref="console" />
</root>
</configuration>
6. 精確設置每個包下面的日志
我經常用上面定義的 appender 關聯到我們的項目 ,當然也可以設置其他包的日志,例如 ,org.springframework
<logger name="com.zjw.xxx" additivity="false">
<level value="info" />
<appender-ref ref="file" />
<appender-ref ref="console" />
</logger>
最后有幾點需要注意:
1、logger 的日志級別若沒顯示定義,則繼承最近的祖先logger(該logger需顯示定義level,直到rootLogger)的日志級別。
logger的父子關系,由logger的名稱決定,例如有三個logger,分別為:java.lang.util 、 java.lang 、java,
則java是java.lang的父logger, 是java.lang.util的祖先logger. 而同時java.lang是java.lang.util的父logger
2、logger的appender默認具有累加性(默認日志輸出到當前logger的appender和所有祖先logger的appender中),可通過配置 “additivity”屬性修改默認行為
詳細的配置可以參考官方文檔:http://logback.qos.ch/manual/configuration.html
7.配置sevlet,通過網頁查看logback內部運行狀態
對于web項目,我們可以配置sevlet,然后通過網頁查看logback內部運行狀態
當然也加入相應的依賴
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.2.3</version>
</dependency>
在web.xml添加
<!-- 通過瀏覽器以html形式查看logback內部狀態 :http://host/yourWebapp/lbClassicStatus -->
<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>
8.分級別打印日志
對大項目來說,最好是分級別來打印日志
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定義log 文件的 home 目錄 -->
<property name="LOG_HOME" value="C:/Users/Administrator/Desktop/logs"></property>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- %.-1level 只顯示信息級別的首字母,%-5level 左對齊顯示信息級別全稱 -->
<Pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] --%mdc{client} %msg%n</Pattern>
</encoder>
</appender>
<appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoding>UTF-8</encoding>
<file>${LOG_HOME}/trace.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/trace.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line] --%mdc{client} %msg%n</pattern>
</layout>
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter> -->
</appender>
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoding>UTF-8</encoding>
<file>${LOG_HOME}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/info.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line] --%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoding>UTF-8</encoding>
<file>${LOG_HOME}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/debug.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line] --%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoding>UTF-8</encoding>
<file>${LOG_HOME}/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/warn.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line] --%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoding>UTF-8</encoding>
<file>${LOG_HOME}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/error.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line] --%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- <logger name="com.mchange" level="INFO"/>
<logger name="org.springframework" level="WARN"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.ResultSet" level="INFO"/>
<logger name="com.boaotech.util" level="DEBUG"/> -->
<root level="TRACE">
<appender-ref ref="STDOUT"/>
<appender-ref ref="TRACE_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
分別記錄上面trace, info, debug, warn, error 的日志。
參考文章
http://blog.csdn.net/initphp/article/details/40891821
http://blog.csdn.net/kittaaron/article/details/9151103
http://blog.csdn.net/zhangliao613/article/details/53007184