log4j配置詳解
log4j的配置文件有兩種格式分別是xml和properties。本文只講解properties格式。比較properties簡潔易懂。
log4j加載配置文件方式
大家在剛接觸log4j時一定都會疑問。log4j的配置文件應該怎么明明並且文件要放在什么目錄下。其實log4j加載配置文件有很多方式,大家只需實現以下中的一種即可,推薦用第一種方法,最簡單。
src/main/resources 下添加log4j.properties或log4j.xml文件
普通情況下只需將log4j配置文件命名為log4j.properties或log4j.xml(必須這兩名之一),並放在classpath:下。一般放在src/main/resources就行。
配合spring mvc在web.xml中配置Log4jConfigListener、log4jConfigLocation
這種方法好處主要是:
1. 動態的改變記錄級別和策略,不需要重啟Web應用,如《Effective Enterprise Java》所說。
2. 把log文件定在 /WEB-INF/logs/ 而不需要寫絕對路徑。
web.xml添加如下配置即可:
<!-- log4j配置,文件路徑,因為是跟隨項目啟動 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:/log4j-customer.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
1
2
3
4
5
6
7
8
9
具體可參照: http://www.jb51.net/article/74477.htm
但是這種方式是不被spring官方提倡的,org.springframework.web.util.Log4jConfigListener被加上了@Deprecated注解。主要原因我的理解是log4j的配置文件加載方式有很多種還有是和容器配合(如JBoss)。就是log4j具體加載哪個配置文件是容器決定的。而這種方法則是在web.xml中寫死了,可能會和容器的log4j配置相沖突,所有不提倡使用。原話如下:
/**
* Bootstrap listener for custom Log4J initialization in a web environment.
* Delegates to Log4jWebConfigurer (see its javadoc for configuration details).
*
* WARNING: Assumes an expanded WAR file, both for loading the configuration
* file and for writing the log files. If you want to keep your WAR unexpanded or
* don't need application-specific log files within the WAR directory, don't use
* Log4J setup within the application (thus, don't use Log4jConfigListener or
* Log4jConfigServlet). Instead, use a global, VM-wide Log4J setup (for example,
* in JBoss) or JDK 1.4's java.util.logging (which is global too).
*
*/
1
2
3
4
5
6
7
8
9
10
11
12
通過容器或是系統參數傳入配置文件的讀取路徑
這種方法主要是java程序運行時設置『log4j.configuration』參數。參數值是配置文件路徑。有些容器可以配合設置log4j配置文件的比如JBoss。其參考如下:
JBoss log4j配置:http://blog.csdn.net/ljhabc1982/article/details/6754084
log4j自動加載配置原理
log4j.jar包中有個LogManager類。其中有段靜態代碼,在此類被classloader加載時會按一定順序去加載配置文件:
判斷是否設定了系統參數『log4j.configuration』。『log4j.configuration』的值是配置文件的路徑。如果有就去加載這個配置文件。
查找資源文件夾(通常是classpath)下是否有log4j.xml,有就用這個文件。
查找資源文件夾(通常是classpath)下是否有log4j.properties,有就用這個文件
源碼如下:
package org.apache.log4j;
public class LogManager {
/** @deprecated */
public static final String DEFAULT_CONFIGURATION_FILE = "log4j.properties";
static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml";
//省略多余代碼
static {
Hierarchy h = new Hierarchy(new RootLogger(Level.DEBUG));
repositorySelector = new DefaultRepositorySelector(h);
String override = OptionConverter.getSystemProperty("log4j.defaultInitOverride", (String)null);
if (override != null && !"false".equalsIgnoreCase(override)) {
LogLog.debug("Default initialization of overridden by log4j.defaultInitOverrideproperty.");
} else {
String configurationOptionStr = OptionConverter.getSystemProperty("log4j.configuration", (String)null);
String configuratorClassName = OptionConverter.getSystemProperty("log4j.configuratorClass", (String)null);
URL url = null;
if (configurationOptionStr == null) {
url = Loader.getResource("log4j.xml");
if (url == null) {
url = Loader.getResource("log4j.properties");
}
} else {
try {
url = new URL(configurationOptionStr);
} catch (MalformedURLException var7) {
url = Loader.getResource(configurationOptionStr);
}
}
if (url != null) {
LogLog.debug("Using URL [" + url + "] for automatic log4j configuration.");
try {
OptionConverter.selectAndConfigure(url, configuratorClassName, getLoggerRepository());
} catch (NoClassDefFoundError var6) {
LogLog.warn("Error during default initialization", var6);
}
} else {
LogLog.debug("Could not find resource: [" + configurationOptionStr + "].");
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
log4j配置文件詳解
log4j主要由3大組件組成:Logger、Appender、Layout
Logger:日志記錄器,負責收集處理日志記錄 (如何處理日志)
Appender:日志輸出目的地,負責日志的輸出 (輸出到什么 地方)
Layout:日志格式化,負責對輸出的日志格式化(以什么形式展現)
一個logger可以對應多個appender,一個appender只能對應一個layout。
1、Logger
logger可以有選擇的啟動和禁用日志的輸出,我們經常會在各種框架中看到如:
private static final Logger log = LoggerFactory.getLogger(XX.class);
log就代表了一個Logger實例,他的name就是類“XX”的full quailied name(類的全限定名),按照上圖所述,這個log就可以指定多個appender和layout。Logger的名字大小寫敏感,其命名有繼承機制:例如:name為org.apache.commons的logger會繼承name為org.apache的logger。
Log4J中有一個特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都會直接或者間接地繼承自root。rootlogger可以用Logger.getRootLogger()方法獲取。
2、Level:
level用來定義日志的級別,分別可以設置為: OFF(關閉)FATAL(致命的) ERROR(錯誤)WARN(警告) INFO(信息)DEBUG (調試) ALL(所有),輸出日志的策略由此Level決定。
例如:如果logger的Level設置為INFO,那么系統只輸出INFO以及以上(WARN、ERROR、FATAL)信息。如果當前logger沒有設定Level,那么它在輸出日志時采用的策略是:它會使用它繼承的Logger的Level作為它自己的Level來處理。如果它的上級也沒有設置Level,那么就找上上級,幾次類推,直到root為止,(root的Level是不能設為空的,所以最終一定會找到一個Level)。
root的level用 log4j.rootLogger=debug來設置
3、Appender
Appender是日志的輸出源,可以控制日志輸出到什么地方去。常見的是方式是輸出到控制台和保存到文件中。log4j 1.2有幾種常見的Appender:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)
org.apache.log4j.RollingFileAppender((文件大小到達指定尺寸的時候產生一個新的文件)
org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
properties中添加『og4j.appender.』的前綴來配置Appender。配置示例如下:
#控制台輸出
#console log appender ### ConsoleAppender
log4j.appender.ConsoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.ConsoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ConsoleAppender.layout.ConversionPattern=%d %p [%t] [%c] [%M] - %m%n
#輸出所有日志
#all log appender ### AllAppender
log4j.appender.AllAppender=org.apache.log4j.RollingFileAppender
log4j.appender.AllAppender.maxFileSize=50MB
log4j.appender.AllAppender.maxBackupIndex=100
log4j.appender.AllAppender.file=/var/log/com.larrylian.demo/all.log
log4j.appender.AllAppender.threshold=debug
log4j.appender.AllAppender.append=true
log4j.appender.AllAppender.encoding=UTF-8
log4j.appender.AllAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.AllAppender.layout.ConversionPattern=%d %p [%t] [%c] - %m%n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
4、Layout
使用指定的Layout來展示(格式化)日志,常見的Layout有:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以靈活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)
org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
以上例子的:
log4j.appender.AllAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.AllAppender.layout.ConversionPattern=%d %p [%t] [%c] - %m%n
1
2
就定義日志的輸出格式。 『%d %p [%t] [%c] - %m%n』就是日期輸出的具體格式其%d、%p表示什么,具體參照:
————————————————
版權聲明:本文為CSDN博主「夢幻langel」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/mhlangel/article/details/78181607