今天翻筆記的時候突然翻到一個文檔, 上面是logback的相關內(nèi)容,也不知道從哪里搞的,貼到這里吧;噶昂才看到一篇比較好的關于logback的文章,帖在這里吧
一、logback的簡介
- logback當前分成三個模塊:
- logback-core是其它兩個模塊的基礎模塊;
- logback-classic是log4j的一個 改良版本。此外logback-classic完整實現(xiàn)SLF4J API使你可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logging;
- logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能;
二、logback的使用
-
添加依賴(logback-access.jar用到的時候再添加;實際上引用logback-classic即可,依賴的庫會被maven自動導入):
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> -
添加配置文件,下面是我項目中用到的,做了詳細的注釋:
<?xml version="1.0" encoding="UTF-8"?> <!-- 根節(jié)點configuration: - scan: 當此屬性設置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認值為true。 - scanPeriod: 設置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 - debug: 當此屬性設置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- property:用來定義變量值,它有兩個屬性name和value,通過<property>定義的值會被插入到logger上下文中,可以使"${}"來獲取變量。--> <!-- 應用名稱 --> <property name="APP_NAME" value="<app-name>" /> <!-- 日志輸出格式: [%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n --> <property name="ENCODER_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n" /> <!--日志文件的保存路徑,首先查找系統(tǒng)屬性-Dlog.dir,如果存在就使用其;否則,在當前目錄下創(chuàng)建名為logs目錄做日志存放的目錄 --> <property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" /> <property name="MAX_HISTORY" value="1" /> <!-- contextName: 用來設置上下文名稱,每個logger都關聯(lián)到logger上下文,默認上下文名稱為default。 但可以使用<contextName>設置成其他名字,用于區(qū)分不同應用程序的記錄。一旦設置,不能修改。--> <contextName>${APP_NAME}</contextName> <!-- timestamp:獲取時間戳字符串,他有兩個屬性key和datePattern key: 標識此<timestamp> 的名字; datePattern: 設置將當前時間(解析配置文件的時間)轉換為字符串的模式,遵循java.txt.SimpleDateFormat的格式。 <timestamp key="XMLParseTime" datePattern="yyyyMMdd'T'HHmmss"/> --> <!-- appender:負責寫日志的組件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名 --> <!-- ConsoleAppender 把日志輸出到控制臺 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoding>UTF-8</encoding> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>${ENCODER_PATTERN}</Pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> </appender> <!-- 各種Appender: 1. FileAppender:把日志添加到文件,有以下子節(jié)點: - <file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值。 - <append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現(xiàn)存文件,默認是true。 - <encoder>:對記錄事件進行格式化。負責兩件事,一是把日志信息轉換成字節(jié)數(shù)組,二是把字節(jié)數(shù)組寫入到輸出流。 * PatternLayoutEncoder 是唯一有用的且默認的encoder ,有一個<pattern>節(jié)點,用來設置日志的輸入格式。 使用"%"加"轉換符"方式,如果要輸出"%",則必須用"\"對"\%"進行轉義。 * <prudent>:如果是 true,日志會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是 false。 --> <!-- 2. RollingFileAppender:滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件。有以下子節(jié)點: - <file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值。 - <append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現(xiàn)存文件,默認是true。 - <rollingPolicy>:當發(fā)生滾動時,決定RollingFileAppender的行為,涉及文件移動和重命名。屬性class定義具體的滾動策略類: * class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy": 最常用的滾動策略,它根據(jù)時間來制定滾動策略,既負責滾動也負責出發(fā)滾動。有以下子節(jié)點: ~ <fileNamePattern>:必要節(jié)點,包含文件名及"%d"轉換符,"%d"可以包含一個java.text.SimpleDateFormat指定的時間格式,如:%d{yyyy-MM}。 如果直接使用 %d,默認格式是 yyyy-MM-dd。RollingFileAppender的file子節(jié)點可有可無,通過設置file,可以為活動文件和歸檔文件指定不同位置, 當前日志總是記錄到file指定的文件(活動文件),活動文件的名字不會改變;如果沒設置file,活動文件的名字會根據(jù)fileNamePattern 的值,每隔一段時間改變一次。 "/"或者"\"會被當做目錄分隔符。 ~ <maxHistory>:可選節(jié)點,控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件。假設設置每個月滾動,且<maxHistory>是6,則只保存最近6個月的文件,刪除之前的舊文件。 注意,刪除舊文件時,那些為了歸檔而創(chuàng)建的目錄也會被刪除。 * class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 查看當前活動文件的大小,如果超過指定大小會告知RollingFileAppender觸發(fā)當前活動文件滾動。只有一個節(jié)點: <maxFileSize>:這是活動文件的大小,默認值是10MB。 * <prudent>:當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1不支持也不允許文件壓縮,2不能設置file屬性,必須留空。 * <triggeringPolicy>: 告知 RollingFileAppender何時激活滾動。 * class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根據(jù)固定窗口算法重命名文件的滾動策略。有以下子節(jié)點: ~ <minIndex>:窗口索引最小值 ~ <maxIndex>:窗口索引最大值,當用戶指定的窗口過大時,會自動將窗口設置為12。 ~ <fileNamePattern>: 必須包含"%i",例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產(chǎn)生歸檔文件mylog1.log和mylog2.log。 還可以指定文件壓縮選項,例如,mylog%i.log.gz 或者 沒有l(wèi)og%i.log.zip 其他的Appender(SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender)參考官方文檔: http://logback.qos.ch/documentation.html --> <!-- 文件日志:輸出全部日志到文件 --> <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>${MAX_HISTORY}</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${ENCODER_PATTERN}</pattern> </encoder> </appender> <!-- 警告日志:用于將警告界別以上的日志輸出到獨立文件 --> <appender name="WARNING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/warning.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>${MAX_HISTORY}</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${ENCODER_PATTERN}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> </appender> <!-- logger:用來設置某一個包或具體的某一個類的日志打印級別、以及指定<appender>。<logger>僅有一個name必選屬性,一個可選的level和一個可選的addtivity屬性。 可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger name: 用來指定受此logger約束的某一個包或者具體的某一個類。 level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF, 還有一個特俗值INHERITED或者同義詞NULL,代表強制執(zhí)行上級的級別。如果未設置此屬性,那么當前l(fā)ogger將會繼承上級的級別。 addtivity: 是否向上級logger傳遞打印信息。默認是true。同<logger>一樣,可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。 --> <logger name="<package-name>" additivity="false" level="DEBUG" > <appender-ref ref="ALL_FILE"/> </logger> <!-- mybatis log 日志 --> <logger name="org.apache.ibatis" level="TRACE" /> <logger name="java.sql.Connection" level="DEBUG" /> <logger name="java.sql.Statement" level="DEBUG" /> <logger name="java.sql.PreparedStatement" level="DEBUG" /> <!-- <root>: 是所有<logger>的上級, 只有一個level屬性 level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能設置為INHERITED或者同義詞NULL。默認是DEBUG。 --> <root level="DEBUG"> <appender-ref ref="STDOUT"/> <appender-ref ref="ALL_FILE"/> <appender-ref ref="WARNING_FILE"/> </root> </configuration> -
在代碼中就可以使用Logger了
public class LogBackTest{ private final static Logger logger = LoggerFactory.getLogger(LogBackTest.class); public static void main(String[] args) { logger.info("logback 成功了"); logger.error("logback 成功了"); logger.debug("logback 成功了"); } }
三、logback的常用配置
-
Hibernate專屬配置
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /> <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" /> <logger name="org.hibernate.SQL" level="DEBUG" /> <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" /> <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> -
MyBatis專屬配置
<logger name="org.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> -
常用的logback.xml
- 開發(fā)環(huán)境的配置:
<?xml version="1.0" encoding="UTF-8"?> <!-- 開發(fā)環(huán)境的日志輸出配置 --> <configuration debug="true"> <property name="LOG_HOME" value="${catalina.base}/logs" /> <property name="MESSAGE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" /> <appender name="LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${MESSAGE_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> </appender> <logger name="java.sql.Connection" level="DEBUG" /> <logger name="java.sql.Statement" level="DEBUG" /> <logger name="java.sql.PreparedStatement" level="DEBUG" /> <logger name="org.apache.ibatis" level="TRACE" /> <root level="DEBUG"> <appender-ref ref="LOG_STDOUT" /> </root> </configuration> - 線上環(huán)境的配置:
<?xml version="1.0" encoding="UTF-8"?> <!-- 生產(chǎn)環(huán)境的日志輸出配置 --> <configuration debug="true"> <property name="LOG_HOME" value="${catalina.base}/logs" /> <property name="MESSAGE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" /> <!-- 日志記錄器,日期滾動記錄 --> <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/inquiry_current.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/inquiry_%d{yyyy-MM-dd}_%i.log</fileNamePattern> <maxFileSize>50MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${MESSAGE_PATTERN}</pattern> <charset>utf-8</charset> </encoder> </appender> <logger name="java.sql.Connection" level="DEBUG" /> <logger name="java.sql.Statement" level="DEBUG" /> <logger name="java.sql.PreparedStatement" level="DEBUG" /> <logger name="org.apache.ibatis" level="TRACE" /> <root level="DEBUG"> <appender-ref ref="LOG_FILE" /> </root> </configuration>- 需要注意的是,文件名規(guī)則中%d和%i都是不可或缺的部分,如果少了這些配置,日志就會不正常,如:少了%i,就會導致文件到了50M就不會再生成新的文件了...
- 開發(fā)環(huán)境的配置: