一、spring整合logback
logback介紹
(1)、根節點<configuration>有三個屬性debug 、scan 、scanPeriod
- debug : 默認為false ,設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。
- scan : 配置文件如果發生改變,將會重新加載,默認值為true。
- scanPeriod : 檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位時毫秒,當scan為true時,這個屬性生效,默認時間間隔為1min。
<configuration>有<appender>、<logger>、<root>三個子節點。
基本結構可以描述為:以<configuration>開頭,后面有零個或多個<appender>元素,有零個或多個<logger>元素,有最多一個<root>元素
(2)、<appender> 是負責寫日志的組件。
appender 有兩個必要屬性 name ,class 。name指定appender 的名稱, class 指定appender的全限定名
class 包括 :ch.qos.logback.core.ConsoleAppender / ch.qos.logback.core.FileAppender/ ch.qos.logback.core.RollingFileAppender。
- ConsoleAppender:把日志添加到控制台
- <encoder> : 對日志進行格式化。
- <target> : 字符串System.out 或者 System.err, 默認 System.out;
- FileAppender:把日志添加到文件
- <file>: 被寫入的文件名,可以是相對目錄 , 也可以是絕對目錄 , 如果目錄不存在則會自動創建
- <append> : 如果是true , 日志被追加到文件結尾 , 如果是false,清空現存文件 , 默認是true
- <encoder> : 對日志進行格式化
- <prodent> : 如果是true,日志會被安全的寫入文件 , 即使其他的FileAppender也會向此文件做寫入操作 , 默認是false
- RollingFileAppender [常用]:滾動記錄文件,先將日志記錄到指定文件,當符合某種條件時,將日志記錄到其他文件
- <file> : 被寫入的文件名,可以是相對目錄,也可以解決目錄,如果目錄不存在則自動創建。
- <append> : 如果是true,日志被追加到文件結尾,如果是false,清空現存文件,默認是true;
- <encoder> : 對日志進行格式化
- <rollingPolicy> : 當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名。
- TimeBaseRollingPolicy :最常用的滾動策略,根據時間來制定滾動策略,即負責滾動也負責觸發滾動。
- <fileNamePattern> :必要節點,包含文件及“%d” 轉換符,“%d”可以包含一個java.text.SimpleDateFormat 制定的時間格式,如:%d{yyyy-MM},如果直接使用 %d ,默認格式是 yyyy-MM-dd。必須包含“%i” 例如:設置最小值,和最大值分別為1和2,命名模式為 log%i.log,會產生歸檔文件log1.log和log2.log,還可以指定文件壓縮選項,例如:log%i.log.gz 或者 log%i.log.zip
- <maxHistory>:可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件,假設設置每個月滾動,且<maxHistory> 是6,則只保存最近6個月的文件,刪除之前的舊文件,注意:刪除舊文件是哪些為了歸檔而創建的目錄也會被刪除。
- <triggeringPolicy> :告知RollingFileAppender 激活RollingFileAppender滾動
- SizeBasedTriggeringPolicy :查看當前活動文件的大小 , 如果超過指定大小會告知 RollingFileAppender , 觸發當前活動滾動 , 只有一個節點 , 用來規定文件大小
- <maxFileSize> : 活動文件的大小 , 默認10MB
- TimeBaseRollingPolicy :最常用的滾動策略,根據時間來制定滾動策略,即負責滾動也負責觸發滾動。
(3) logger節點用來設置某一個包或者具體的某一個類的日志打印級別,以及指定<appender>, logger 僅有一個name屬性,兩個可選屬性 level/addtivity 。
- name : 用來指定受此loger約束的某一個包或者具體的某一個類
- level:用來設置打印級別,大小寫無關,TRACE,DEBUG,INFO,WARE,ERROR,ALL和OFF,還有一個特殊值INHERITED 或者 同義詞NULL,代表強制執行上級的級別。
- 如果未設置此屬性,那么當前logger將會繼承上級的級別。
- level大小:ERROR > WARN > INFO > DEBUG > TRACE,程序會打印高於或等於所設置級別的日志。
- addtivity : 是否向上級loger傳遞打印信息,默認為true;
<logger> 可以包含零個或多個<appender-ref>元素,表示這個appender將會添加到logger。
(4)、root節點:元素配置根 logger。該元素有一個 level 屬性。沒有 name 屬性,因為已經被命名 為“root”
level 屬性的值大小寫無關,其值為下面其中一個字符串:TRACE、DEBUG、INFO、 WARN、ERROR、ALL 和 OFF。注意不能設置為“INHERITED” 或“NULL”。 元素可以包含零個或多個元素。與元素類似,聲明 元素后,會先關閉然后移除全部當前 appender,只引用聲明了的 appender。如果 root 元素沒 有引用任何 appender,就會失去所有 appender。
(5)、filter過濾節點
Logback 的過濾器基於三值邏輯(ternary logic),允許把它們組裝或成鏈,從而組成任 意的復合過濾策略。
這里的所謂三值邏輯是說,過濾器的返回值只能是 ACCEPT、DENY 和 NEUTRAL 的其中一個。
過濾器一般分為如下幾類 :
- 級別過濾器(LevelFilter):LevelFilter 根據記錄級別對記錄事件進行過濾。如果事件的級別等於配置的級別,過濾器會根據 onMatch 和 onMismatch 屬性接受或拒絕事件。
- 臨界值過濾器(ThresholdFilter):ThresholdFilter 過濾掉低於指定臨界值的事件 . 當記錄的級別等於或高於臨界值時 , ThresholdFilter 的decide()方法會返回NEUTRAL ; 當記錄級別低於臨界值時 , 事件會被拒絕。
- 求值過濾器(EvaluatorFilter):EvaluatorFilter 封裝了 EventEvaluator(ch.qos.logback.core.boolex.EventEvaluator) , 評估 是否符合指定的條件。
添加logback依賴
<!-- 日志文件管理包 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.logback-extensions</groupId> <artifactId>logback-ext-spring</artifactId> <version>0.1.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.30</version> </dependency> <!-- 日志文件管理包 -->
logback-classic:包含了logback本身所需的slf4j-api.jar、logback-core.jar及logback-classsic.jar。
logback-ext-spring:由官方提供的對Spring的支持,它的作用就相當於log4j中的Log4jConfigListener。
jcl-over-slf4j:用來把Spring源代碼中大量使用到的commons-logging替換成slf4j,只有在添加了這個依賴之后才能看到Spring框架本身打印的日志–即info文件中打印出的spring啟動日志信息,否則只能看到開發者自己打印的日志。
掃描xml
盡量的在pom的build標簽中加入如下內容,以掃描到logback.xml文件。
<build> <!--掃描全局xml, 以便掃描到相關配置文件--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
引入logback.xml日志配置文件
這里特別注意引入位置(maven工程)在src/main/resource這個根目錄下。
logback.xml配置信息
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 模塊名 --> <contextName>OS_PRO</contextName> <!--定義日志文件的存儲地址 logs為當前項目的logs目錄 還可以設置為../logs --> <property name="LOG_HOME" value="logs" /> <!--控制台日志, 控制台輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!--文件日志, 按照每天生成日志文件 --> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <fileNamePattern>${LOG_HOME}/error-%d{yyyy-MM-dd}.log</fileNamePattern> <!--日志文件保留天數--> <maxHistory>30</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>10MB</maxFileSize> </triggeringPolicy> <!-- 過濾掉 低於ERROR級別的--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> </appender> <!--文件日志, 按照每天生成日志文件 --> <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <fileNamePattern>${LOG_HOME}/debugAndInfo-%d{yyyy-MM-dd}.log</fileNamePattern> <!--日志文件保留天數--> <maxHistory>30</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>10MB</maxFileSize> </triggeringPolicy> <!-- 過濾掉 低於DEBUG級別的--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> </appender> <!-- spring及apache--> <logger name="org.springframework" level="INFO" /> <logger name="org.apache.http" level="INFO" /> <!-- show parameters for hibernate sql 專為 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 log configure--> <logger name="com.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"/> <!--日志的輸出級別由低到高(越來問題越嚴重)trace->debug->info->warn->error --> <!-- 日志輸出級別 生成上禁止DEBUG, 至少INFO級別--> <root level="INFO"> <!-- 生產上 STDOUT 要注釋掉 --> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE_DEBUG"/> <appender-ref ref="FILE_ERROR"/> </root> </configuration>
這樣使用:
private static Logger logger = LoggerFactory.getLogger(當前類.class);
二、spring整合log4j
log4j介紹
關於配置文件的名稱以及在項目中的存放位置
log4j 2.x版本不再支持像1.x中的.properties后綴的文件配置方式,2.x版本配置文件后綴名只能為".xml",".json"或者".jsn"。
系統選擇配置文件的優先級(從先到后)如下:
(1)、classpath下的名為log4j2-test.json 或者log4j2-test.jsn的文件.
(2)、classpath下的名為log4j2-test.xml的文件.
(3)、classpath下名為log4j2.json 或者log4j2.jsn的文件.
(4)、classpath下名為log4j2.xml的文件.
我們一般默認使用log4j2.xml進行命名。如果本地要測試,可以把log4j2-test.xml放到classpath,而正式環境使用log4j2.xml,則在打包部署的時候不要打包log4j2-test.xml即可。
缺省默認配置文件
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
配置文件節點解析
(1)、根節點Configuration有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger)。
- status用來指定log4j本身的打印日志的級別。
- monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s。
(2)、Appenders節點,常見的有三種子節點:Console、RollingFile、File
- Console節點用來定義輸出到控制台的Appender
- name:指定Appender的名字。
- target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設置默認SYSTEM_OUT。
- PatternLayout:輸出格式,不設置默認為:%m%n.
- File節點用來定義輸出到指定位置的文件的Appender
- name:指定Appender的名字。
- fileName:指定輸出日志的目的文件帶全路徑的文件名。
- PatternLayout:輸出格式,不設置默認為:%m%n。
- RollingFile節點用來定義超過指定大小自動刪除舊的創建新的的Appender
- name:指定Appender的名字.
- fileName:指定輸出日志的目的文件帶全路徑的文件名.
- PatternLayout:輸出格式,不設置默認為:%m%n.
- filePattern:指定新建日志文件的名稱格式. Policies:指定滾動日志的策略,就是什么時候進行新建日志文件輸出日志
- TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1hour。modulate=true用來調整時間:比如現在是早上3am,interval是4,那么第一次滾動是在4am,接着是8am,12am...而不是7am。
- SizeBasedTriggeringPolicy:Policies子節點,基於指定文件大小的滾動策略,size屬性用來定義每個日志文件的大小。
- DefaultRolloverStrategy:用來指定同一個文件夾下最多有幾個日志文件時開始刪除最舊的,創建新的(通過max屬性)。
(3)、Loggers節點,常見的有兩種:Root和Logger。
- Root節點用來指定項目的根日志,如果沒有單獨指定Logger,那么就會默認使用該Root日志輸出。
- level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
- AppenderRef:Root的子節點,用來指定該日志輸出到哪個Appender.
- Logger節點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。
- level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
- name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節點.
- AppenderRef:Logger的子節點,用來指定該日志輸出到哪個Appender,如果沒有指定,就會默認繼承自Root.如果指定了,那么會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設置Logger的additivity="false"只在自定義的Appender中進行輸出。
(4)、關於日志level。
共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
- All:最低等級的,用於打開所有日志記錄.
- Trace:是追蹤,就是程序推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關系,我們可以設置最低日志級別不讓他輸出.
- Debug:指出細粒度信息事件對調試應用程序是非常有幫助的.
- Info:消息在粗粒度級別上突出強調應用程序的運行過程.
- Warn:輸出警告及warn以下級別的日志.
- Error:輸出錯誤信息日志.
- Fatal:輸出每個嚴重的錯誤事件將會導致應用程序的退出的日志.
- OFF:最高等級的,用於關閉所有日志記錄.
程序會打印高於或等於所設置級別的日志,設置的日志等級越高,打印出來的日志就越少。
引入log4j依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.14.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.14.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.0</version> </dependency>
log4j.xml配置信息
在src/main/resource這個根目錄下創建,比較完整的內容如下:
<?xml version="1.0" encoding="UTF-8"?> <!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration后面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出--> <!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數--> <configuration status="WARN" monitorInterval="30"> <!--先定義所有的appender--> <appenders> <!--這個輸出控制台的配置--> <console name="Console" target="SYSTEM_OUT"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日志消息,%n是換行符--> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/> </console> <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用--> <File name="log" fileName="logs/test.log" append="false"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/> </File> <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔--> <RollingFile name="RollingFileInfo" fileName="./logs/info.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> <!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> <RollingFile name="RollingFileWarn" fileName="./logs/debug.log" filePattern="./logs/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 --> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="RollingFileError" fileName="./logs/error.log" filePattern="./logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> </appenders> <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效--> <loggers> <!--過濾掉spring和mybatis的一些無用的DEBUG信息--> <logger name="org.springframework" level="INFO"></logger> <logger name="org.mybatis" level="INFO"></logger> <root level="all"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileInfo"/> <appender-ref ref="RollingFileWarn"/> <appender-ref ref="RollingFileError"/> </root> </loggers> </configuration>
使用方法:
private static final Logger log = LoggerFactory.getLogger(當前類.class);