原文地址:http://www.cnblogs.com/v-weiwang/p/4814050.html
參考地址:http://rockelixir.iteye.com/blog/1902352
需要導入包:
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配置,文件路徑,因爲是跟隨項目啓動 -->
<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對象:下位層提供Appender對象。Appender對象負責發佈日誌信息,以不同的首選目的地,如數據庫,文件,控制檯,UNIX系統日誌等。
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"</span><span> </span><span class="tag">/></span><span> </span><span class="comments"><!-- {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"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"Append"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"true"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"encoding"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"GBK"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"DatePattern"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"'.'yyyy-MM-dd'.log'"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">layout</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.log4j.PatternLayout"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"ConversionPattern"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"%d{ISO8601} 耗時:%r [日誌來自:%-40.40c{3} 日誌類型: %-5p 日誌內容:%m]%n"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">layout</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">appender</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- [info日誌APPENDER] --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">appender</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"INFO-APPENDER"</span><span> </span></span></li><li class="alt"><span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.log4j.DailyRollingFileAppender"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"File"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-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"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"Append"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"true"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"encoding"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"GBK"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"DatePattern"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"'.'yyyy-MM-dd'.log'"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">layout</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.log4j.PatternLayout"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"ConversionPattern"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"%d{ISO8601} 耗時:%r [日誌來自:%-40.40c{3} 日誌類型: %-5p 日誌內容:%m]%n"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">layout</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">appender</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- debug log --></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- name指定的是包名,表示這個logger只記錄com.wzw.controller下的所有日誌 --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">logger</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"com.wzw.controller"</span><span> </span><span class="attribute">additivity</span><span>=</span><span class="attribute-value">"true"</span><span class="tag">></span><span> </span><span class="comments"><!-- additivity 是否繼承root --></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- <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>
<?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”);
- }
- }
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>(輸出方式)。
appender選項:
-
AppenderSkeleton
-
AsyncAppender
-
ConsoleAppender
-
DailyRollingFileAppender
-
ExternallyRolledFileAppender
-
FileAppender
-
JDBCAppender
-
JMSAppender
-
LF5Appender
-
NTEventLogAppender
-
NullAppender
-
RollingFileAppender
-
SMTPAppender
-
SocketAppender
-
SocketHubAppender
-
SyslogAppender
-
TelnetAppender
-
WriterAppender
layout選項:
- DateLayout
- HTMLLayout
- PatternLayout
- SimpleLayout
- XMLLayout
模式轉換字符:
下表說明了以上模式使用的字符和所有其他字符,可以在自定義模式中使用:
轉換字符 | 表示的意思 |
---|---|
c | 用於輸出的記錄事件的類別。例如,對於類別名稱”a.b.c” 模式 %c{2} 會輸出 “b.c” |
C | 用於輸出呼叫者發出日誌請求的完全限定類名。例如,對於類名 “org.apache.xyz.SomeClass”, 模式 %C{1} 會輸出 “SomeClass”. |
d | 用於輸出的記錄事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}. |
F | 用於輸出被髮出日誌記錄請求,其中的文件名 |
l | 用於將產生的日誌事件調用者輸出位置信息 |
L | 用於輸出從被髮出日誌記錄請求的行號 |
m | 用於輸出使用日誌事件相關聯的應用程序提供的消息 |
M | 用於輸出發出日誌請求所在的方法名稱 |
n | 輸出平臺相關的行分隔符或文字 |
p | 用於輸出的記錄事件的優先級 |
r | 用於輸出毫秒從佈局的結構經過直到創建日誌記錄事件的數目 |
t | 用於輸出生成的日誌記錄事件的線程的名稱 |
x | 用於與產生該日誌事件的線程相關聯輸出的NDC(嵌套診斷上下文) |
X | 在X轉換字符後面是鍵爲的MDC。例如 X{clientIP} 將打印存儲在MDC對鍵clientIP的信息 |
% | 文字百分號 %%將打印%標誌 |
格式修飾符:
默認情況下,相關資料原樣輸出。然而,隨着格式修飾符的幫助下,可以改變最小字段寬度,最大字段寬度和對齊。
下表涵蓋了各種各樣的修飾符的情況:
Format modifier | left justify | minimum width | maximum width | 註釋 |
---|---|---|---|---|
%20c | false | 20 | none | 用空格左墊,如果類別名稱少於20個字符長 |
%-20c | true | 20 | none | 用空格右墊,如果類別名稱少於20個字符長 |
%.30c | NA | none | 30 | 從開始截斷,如果類別名稱超過30個字符長 |
%20.30c | false | 20 | 30 | 用空格左側墊,如果類別名稱短於20個字符。但是,如果類別名稱長度超過30個字符,那麼從開始截斷。 |
%-20.30c | true | 20 | 30 | 用空格右側墊,如果類別名稱短於20個字符。但是,如果類別名稱長度超過30個字符,那麼從開始截斷。 |
if (fromjs.length > 0) { ("#fromjs .markdown_views pre").addClass("prettyprint"); prettyPrint(); ('pre.prettyprint code').each(function () {
var lines = (this).text().split('\n').length; var
- ').addClass('pre-numbering').hide();