log4j的配置文件有兩種格式分別是xml和properties。本文只講解properties格式。比較properties簡潔易懂。
大家在剛接觸log4j時一定都會疑問。log4j的配置文件應該怎么明明并且文件要放在什么目錄下。其實log4j加載配置文件有很多方式,大家只需實現以下中的一種即可,推薦用第一種方法,最簡單。
普通情況下只需將log4j配置文件命名為log4j.properties或log4j.xml(必須這兩名之一),并放在classpath:下。一般放在src/main/resources就行。
這種方法好處主要是:
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>
log4j配置日志輸出路徑,具體可參照: 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). **/
這種方法主要是java程序運行時設置『log4j.configuration』參數。參數值是配置文件路徑。有些容器可以配合設置log4j配置文件的比如JBoss。其參考如下:
JBoss log4j配置:http://blog.csdn.net/ljhabc1982/article/details/6754084
log4j.jar包中有個LogManager類。其中有段靜態代碼,在此類被classloader加載時會按一定順序去加載配置文件:
log4j2可以配置線程數么,源碼如下:
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 + "].");}}}
}
log4j主要由3大組件組成:Logger、Appender、Layout
一個logger可以對應多個appender,一個appender只能對應一個layout。
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()方法獲取。
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來設置
Appender是日志的輸出源,可以控制日志輸出到什么地方去。常見的是方式是輸出到控制臺和保存到文件中。log4j 1.2有幾種常見的Appender:
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
類加載和類初始化區別,使用指定的Layout來展示(格式化)日志,常見的Layout有:
以上例子的:
log4j.appender.AllAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.AllAppender.layout.ConversionPattern=%d %p [%t] [%c] - %m%n
就定義日志的輸出格式。 『%d %p [%t] [%c] - %m%n』就是日期輸出的具體格式其%d、%p表示什么,具體參照:
『log4j的PatternLayout參數含義』http://blog.csdn.net/guoquanyou/article/details/5689652
以下是log4j配置示例:
############### define logger ###################
#root logger
log4j.rootLogger=debug,ConsoleAppender,AllAppender,ErrorAppender################ Appender begin #################輸出所有日志
#all log appender ### AllAppender
#指定appender類型
log4j.appender.AllAppender=org.apache.log4j.RollingFileAppender
#文件大小最大值 超過了就產生新的log文件
log4j.appender.AllAppender.maxFileSize=50MB
log4j.appender.AllAppender.maxBackupIndex=100
#文件保存路徑
log4j.appender.AllAppender.file=/var/log/com.larrylian.demo/all.log
#打印這個等級以上的日志 但是這個level一般會被logger的level覆蓋
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#輸出Error日志 按天滾動
#error log appender ### ErrorAppender
log4j.appender.ErrorAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ErrorAppender.file=/var/log/com.larrylian.demo/error.log
log4j.appender.ErrorAppender.datePattern='.'yyyy-MM-dd
log4j.appender.ErrorAppender.threshold=error
log4j.appender.ErrorAppender.append=true
log4j.appender.ErrorAppender.encoding=UTF-8
log4j.appender.ErrorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ErrorAppender.layout.ConversionPattern=%d %p [%t] [%c] - %m%n#控制臺輸出
#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################ Appender end ################
log4j2配置,本文部分內容參考:
快速了解Log4J http://www.cnblogs.com/dengyungao/p/7524902.html
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态