实战SSM_O2O商铺_06logback配置与使用
文章目錄
- 日志概述
- logging
- log4j
- commons-logging
- slf4j
- logback
- 日志框架總結
- Maven依賴
- logback加載配置文件規則
- logback 日志級別
- 配置
- 測試
- Github地址
日志概述
log4j、Logging、commons-logging、slf4j、logback,都耳熟能詳吧,那么具體的區別和聯系呢,我們這里借o2o這個小項目的機會梳理一下。
logging
Java 自帶的日志工具類,在 JDK 1.5 開始就已經有了,在 java.util.logging 包下。
log4j
Log4j 是 Apache 的一個開源日志框架,也是市場占有率最多的一個框架,log4j 在 2015/08/05 Apache 宣布停止維護了,用戶需要切換到 Log4j2上面去。
commons-logging
log4j 是一個具體的日志框架的實現,而 commons-logging 就是日志的門面接口,它也是 apache 最早提供的日志門面接口,用戶可以根據喜好選擇不同的日志實現框架,而不必改動日志定義,這就是日志門面的好處,符合面對接口抽象編程。
slf4j
全稱:Simple Logging Facade for Java,即簡單日志門面接口,和 Apache 的 commons-logging 是一樣的概念,它們都不是具體的日志框架,你可以指定其他主流的日志實現框架。
Slf4j 也是現在主流的日志門面框架,使用 Slf4j 可以很靈活的使用占位符進行參數占位,簡化代碼,擁有更好的可讀性。
logback
Logback 是 Slf4j 的原生實現框架,同樣也是出自 Log4j 一個人之手,但擁有比 log4j 更多的優點、特性和更做強的性能,現在基本都用來代替 log4j 成為主流。
日志框架總結
-
commons-logging、slf4j 只是一種日志抽象門面,不是具體的日志框架。
-
log4j、logback 是具體的日志實現框架。
-
一般首選強烈推薦使用 slf4j + logback。當然也可以使用slf4j + log4j、commons-logging +log4j 這兩種日志組合框架。
一般情況下,Logback與slf4J組合使用。
logback的官方網站:http://logback.qos.ch
SLF4J的官方網站:http://www.slf4j.org
看出 slf4j 很強大,不但能和各種日志框架對接,還能和日志門面 commons-logging 進行融合。
logback的三個模塊
-
logback-core
-
logback-classic
-
logback-access
logback-core是logback-classic和logback-access模塊的基礎模塊。logback-classic是log4j的一個改良版本,均出自同一個作者之手。
Maven依賴
<!-- 1.日志 --> <!-- 實現slf4j接口并整合 --> <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.1</version> </dependency>logback加載配置文件規則
1. 在 classpath 中尋找 logback-test.xml文件
2. 如果找不到 logback-test.xml,則在 classpath 中尋找 logback.groovy 文件
3. 如果找不到 logback.groovy,則在 classpath 中尋找 logback.xml文件
4. 如果上述的文件都找不到,則 logback 會使用 JDK 的 SPI 機制查找
META-INF/services/ch.qos.logback.classic.spi.Configurator 中的 logback 配置實現類,這個實現類必須實現 Configuration 接口,使用它的實現來進行配置
5. 如果上述操作都不成功,logback 就會使用它自帶的 BasicConfigurator 來配置,并將日志輸出到 console
logback 日志級別
TRACE < DEBUG < INFO < WARN < ERROR
配置
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!--scan: 當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。 --> <!-- scanPeriod設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。注意掃描間隔要加上單位,可用的單位是 milliseconds,seconds,minutes 和 hours。如果只指定了數字,但沒有指定單位,這默認單位為 milliseconds。--> <!--debug當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。--> <configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 用來定義變量值,它有兩個屬性name和value,通過<property>定義的值會被插入到logger上下文中,可以使“${}”來使用變量--><property name="app.name" value="o2o" /> <property name="log.level" value="DEBUG"/><property name="log.maxHistory" value="30"/><!--<property name="log.filePath" value="${catalina.base}/logs/webapps"/> --><property name="log.filePath" value="D:/logs/${app.name}"/><!--格式化輸出,%d:日期;%thread:線程名;%-5level:級別,從左顯示5個字符寬度;%msg:日志消息;%n:換行符--><property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/><!-- 用來設置上下文名稱,每個logger都關聯到logger上下文,默認上下文名稱為default。但可以使用<contextName>設置成其他名字,用于區分不同應用程序的記錄。一旦設置,不能修改。 --><contextName>${app.name}</contextName> <!-- 子節點<appender>:負責寫日志的組件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名 --><!-- 控制臺設置 --><appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"><!-- 對記錄事件進行格式化 encoder默認配置為PartternLayoutEncoder --><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><patten>${log.pattern}</patten></encoder></appender><!-- DEBUG --><appender name="debugAppender"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- file被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。 --><file>${log.filePath}/debug.log</file><!-- append如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。 --><append>true</append><!-- rollingPolicy當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名。 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern><!--日志保存天數 --><maxHistory>${log.maxHistory}</maxHistory><!--滾動策略:日志文件大于1MB時生成一個新的日志文件,每天生成一個新的日志文件 --><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>1MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 日志格式 --><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${log.pattern}</pattern></encoder><!-- filter 只記錄debug信息 --><filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender><!-- INFO --><appender name="infoAppender"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- file被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。 --><file>${log.filePath}/info.log</file><!-- append如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。 --><append>true</append><!-- rollingPolicy當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名。 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern><!--日志保存天數 --><maxHistory>${log.maxHistory}</maxHistory><!--滾動策略:日志文件大于1MB時生成一個新的日志文件,每天生成一個新的日志文件 --><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>1MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 日志格式 --><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${log.pattern}</pattern></encoder><!-- filter 只記錄info信息 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- ERROR --><appender name="errorAppender"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- file被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。 --><file>${log.filePath}/error.log</file><!-- append如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。 --><append>true</append><!-- rollingPolicy當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名。 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.filePath}/error/error.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern><!--日志保存天數 --><maxHistory>${log.maxHistory}</maxHistory><!--滾動策略:日志文件大于1MB時生成一個新的日志文件,每天生成一個新的日志文件 --><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>1MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 日志格式 --><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${log.pattern}</pattern></encoder><!-- filter 只記錄error信息 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!--打印特定包下的日志 additivity:是否向上級logger傳遞打印信息。默認是true. 作用在于 children-logger是否使用 rootLogger配置的appender進行輸出。false:表示只用當前logger的appender-ref。true:表示當前logger的appender-ref和rootLogger的appender-ref都有效。--><logger name="com.artisan.o2o" level="${log.level}" additivity="true"><appender-ref ref="debugAppender" /><appender-ref ref="infoAppender" /><appender-ref ref="errorAppender" /></logger><!-- 【日志輸出級別】 表示把>=DEBUG級別的日志都輸出到debugAppender對應的file --><root level="${log.level}"><appender-ref ref="consoleAppender" /></root> </configuration>測試
我們在AreaController中加些log輸出
package com.artisan.o2o.web;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody;import com.artisan.o2o.entity.Area; import com.artisan.o2o.service.AreaService;@Controller @RequestMapping("/superadmin") public class AreaController {Logger logger = LoggerFactory.getLogger(AreaController.class);@AutowiredAreaService areaService;@RequestMapping(value = "/listArea", method = RequestMethod.GET)@ResponseBodypublic Map<String, Object> getAreas() {logger.info("-----begin getAreas------");Long beginTimeLong = System.currentTimeMillis();Map<String, Object> map = new HashMap<String, Object>();List<Area> areaList = new ArrayList<Area>();try {areaList = areaService.getAreaList();map.put("total", areaList.size());map.put("rows", areaList);for (Area area : areaList) {System.out.println("區域:" + area);}} catch (Exception e) {e.printStackTrace();map.put("success", false);map.put("errMsg", e.getMessage().toString());logger.error("exception happpens , desc [{}] ", e.getMessage());}Long endTimeLong = System.currentTimeMillis();logger.debug("cost [{}ms]", endTimeLong - beginTimeLong);logger.info("-----end getAreas------");return map;}}啟動服務,測試
rollingPolicy的配置
接下來,我們將AreaDao.xml中 id為 queryArea的statement sql 中的area_name 改成area_name1,因為數據庫tb_area表沒有該字段,驗證下,error的配置項。
同時 http://localhost:8080/o2o/superadmin/listArea
這里將不同級別的日志分別打印到了不同的文件中,日志的配置可以靈活配置,這里僅僅是闡述用法,日志的記錄方式后續會調整。
Github地址
代碼地址: https://github.com/yangshangwei/o2o
總結
以上是生活随笔為你收集整理的实战SSM_O2O商铺_06logback配置与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实战SSM_O2O商铺_05集成SSM后
- 下一篇: 实战SSM_O2O商铺_07【商铺注册】