springmvc+log4j操作日誌記錄,詳細配置
阿新 • • 發佈:2018-11-30
需要匯入包:
log包:log4j-12.17.jar
第一步:web.xml配置
<!-- log4j配置,檔案路徑,因為是跟隨專案啟動 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.xml</param-value> </context-param> <!-- 配置log4j.xml變數,如果需要動態的就使用下面方式,使用方法${name}--> <context-param> <param-name>controller</param-name> <param-value>controller-log</param-value> </context-param>
<context-param> <param-name>loggingLevel</param-name> <param-value>info</param-value> </context-param><!-- 載入log4j配置檔案 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
第二步log4j.xml配置
(配置檔案可以有兩種方式,一種是xml,一種是properties。個人比較喜歡xml,一目瞭然)
先講解一下核心物件:
logger物件: Logger物件負責捕獲日誌資訊及它們儲存在一個空間的層次結構。
Appender物件:
layout物件: 該層提供其用於格式化不同風格的日誌資訊的物件。佈局層提供支援Appender物件到釋出日誌資訊之前。
打個比方:logger是個情報站,負責收集他 所在地方(用name="xxx包"指定)下的所有資訊。appender是傳送出去的方式,如寫信(FileAppender)、電報(SMTPAppender)等多種。layout就是傳送內容以什麼格式書寫,如自定義格式(PatternLayout),html(HTMLLayout)格式。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- 可以配置多個appender來對應不同的輸出,如檔案輸出,sql輸出,控制檯輸出,郵件輸出等 --> <!-- [控制檯STDOUT] 不同的輸出型別對應著不同的calss,如控制檯輸出class對應著 org.apache.log4j.ConsoleAppender --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <!-- name提供給logger或者root呼叫 --> <param name="encoding" value="GBK" /> <!-- 儲存字符集 --> <param name="target" value="System.out" /> <!-- 輸出到控制檯 --> <layout class="org.apache.log4j.PatternLayout"> <!-- loyout表示輸出方式,可以多種,class值區分,PatternLayout表示自定義格式 --> <param name="ConversionPattern" value="%d{ISO8601} 耗時:%r [日誌來自:%-40.40c{3} 日誌型別: %-5p 日誌內容:%m]%n" /> <!-- 輸出格式,後面解釋 --> </layout> <!--filter過濾器設定輸出的級別:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF 所有下面輸出的是debug到warn不會有error和fatal --> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="debug" /> <param name="levelMax" value="warn" /> <param name="AcceptOnMatch" value="true" /> <!-- 答案:http://bbs.csdn.net/topics/350195913 --> </filter> </appender> <!-- [公共Appender] 這個class表示輸入到檔案,並且按日期生成新檔案--> <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${webapp.root}/logs/common-default.log" /> <!-- ${webapp.root}專案根路徑,自動獲得,不用配置,可自己在web.xml中配置 --> <param name="Append" value="true" /> <!-- 是否專案重啟繼續儲存之前日誌 --> <param name="encoding" value="GBK" /> <param name="threshold" value="all" /> <!-- 記錄所有型別日誌,記錄它和比它等級高的日誌all<debug --> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <!-- 日期格式 例子:common-default.log.2015-09-17.log--> <layout class="org.apache.log4j.PatternLayout"> <!-- 輸出方式 --> <param name="ConversionPattern" value="%d{ISO8601} 耗時:%r [日誌來自:%-40.40c{3} 日誌型別: %-5p 日誌內容:%m]%n" /> </layout> </appender> <!-- [debug日誌APPENDER] --> <appender name="DEBUG-APPENDER" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${webapp.root}/logs/controller/debug-log.log" /> <param name="Append" value="true" /> <param name="encoding" value="GBK" /> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} 耗時:%r [日誌來自:%-40.40c{3} 日誌型別: %-5p 日誌內容:%m]%n" /> </layout> </appender> <!-- [info日誌APPENDER] --> <appender name="INFO-APPENDER" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${webapp.root}/logs/controller/info-log.log" /> <param name="Append" value="false" /> <param name="encoding" value="GBK" /> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} 耗時:%r [日誌來自:%-40.40c{3} 日誌型別: %-5p 日誌內容:%m]%n" /> </layout> <!-- 我只想記錄info日誌,就做如下設定 --> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMax" value="info"/> <param name="LevelMin" value="info"/> </filter> </appender> <!-- [元件日誌APPENDER] --> <appender name="COMPONENT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${webapp.root}/logs/logistics-component.log" /> <param name="Append" value="true" /> <param name="encoding" value="GBK" /> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} 耗時:%r [日誌來自:%-40.40c{3} 日誌型別: %-5p 日誌內容:%m]%n" /> </layout> </appender> <!-- debug log --> <!-- name指定的是包名,表示這個logger只記錄com.wzw.controller下的所有日誌 --> <logger name="com.wzw.controller" additivity="true"> <!-- additivity 是否繼承root --> <!-- <level value="${loggingLevel}" /> --> <level value="DEBUG"></level> <!-- 現在級別 --> <appender-ref ref="DEBUG-APPENDER" /> </logger> <!-- info log --> <!-- name指定的是包名,這樣只操作此包下的log --> <logger name="com.wzw.controller" additivity="true"> <level value="INFO"></level> <appender-ref ref="INFO-APPENDER" /> <appender-ref ref="console"/> </logger> <!-- Root Logger --> <!-- 所有logger的父類,記錄所有的日誌。 --> <root> <level value="ALL"></level> <!-- 限定記錄等級 --> <appender-ref ref="DEFAULT-APPENDER" /> <!-- 呼叫記錄方式 --> <appender-ref ref="console"/> </root> </log4j:configuration>
執行就能看到common-default.log裡面有操作日誌
自己輸出日誌:
我controller包下某各類中:
package com.wzw.controller; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/account") public class AccountController { private static Logger logger =LoggerFactory.getLogger(AccountController.class); @ResponseBody @RequestMapping("/login") public String login(HttpSession session){ logger.info("請求登入"); logger.debug("debug"); logger.warn("warn"); } }訪問這個controller,就會記錄日誌,因為有log4j中有兩個logger配置記錄controller包下的日誌,所以輸出到兩個logger下<appender-ref>(輸出方式)。詳情參考http://www.cnblogs.com/v-weiwang/p/4814050.html