log4j加载配置方式和配置详解
来源:互联网 发布:软件开发工作室名称 编辑:程序博客网 时间:2024/05/18 03:27
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>
具体可参照: 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自动加载配置原理
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 + "]."); } } }}
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 ### ConsoleAppenderlog4j.appender.ConsoleAppender=org.apache.log4j.ConsoleAppenderlog4j.appender.ConsoleAppender.layout=org.apache.log4j.PatternLayoutlog4j.appender.ConsoleAppender.layout.ConversionPattern=%d %p [%t] [%c] [%M] - %m%n#输出所有日志#all log appender ### AllAppenderlog4j.appender.AllAppender=org.apache.log4j.RollingFileAppenderlog4j.appender.AllAppender.maxFileSize=50MBlog4j.appender.AllAppender.maxBackupIndex=100log4j.appender.AllAppender.file=/var/log/com.larrylian.demo/all.loglog4j.appender.AllAppender.threshold=debuglog4j.appender.AllAppender.append=truelog4j.appender.AllAppender.encoding=UTF-8log4j.appender.AllAppender.layout=org.apache.log4j.PatternLayoutlog4j.appender.AllAppender.layout.ConversionPattern=%d %p [%t] [%c] - %m%n
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.PatternLayoutlog4j.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 loggerlog4j.rootLogger=debug,ConsoleAppender,AllAppender,ErrorAppender################ Appender begin #################输出所有日志#all log appender ### AllAppender#指定appender类型log4j.appender.AllAppender=org.apache.log4j.RollingFileAppender#文件大小最大值 超过了就产生新的log文件log4j.appender.AllAppender.maxFileSize=50MBlog4j.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=truelog4j.appender.AllAppender.encoding=UTF-8#格式化log4j.appender.AllAppender.layout=org.apache.log4j.PatternLayoutlog4j.appender.AllAppender.layout.ConversionPattern=%d %p [%t] [%c] - %m%n#输出Error日志 按天滚动#error log appender ### ErrorAppenderlog4j.appender.ErrorAppender=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.ErrorAppender.file=/var/log/com.larrylian.demo/error.loglog4j.appender.ErrorAppender.datePattern='.'yyyy-MM-ddlog4j.appender.ErrorAppender.threshold=errorlog4j.appender.ErrorAppender.append=truelog4j.appender.ErrorAppender.encoding=UTF-8log4j.appender.ErrorAppender.layout=org.apache.log4j.PatternLayoutlog4j.appender.ErrorAppender.layout.ConversionPattern=%d %p [%t] [%c] - %m%n#控制台输出#console log appender ### ConsoleAppenderlog4j.appender.ConsoleAppender=org.apache.log4j.ConsoleAppenderlog4j.appender.ConsoleAppender.layout=org.apache.log4j.PatternLayoutlog4j.appender.ConsoleAppender.layout.ConversionPattern=%d %p [%t] [%c] [%M] - %m%n################ Appender end ################
本文部分内容参考:
快速了解Log4J http://www.cnblogs.com/dengyungao/p/7524902.html
- log4j加载配置方式和配置详解
- log4j的配置方式和加载方式
- slf4j 和 log4j配置详解
- log4j详解(二) XML 配置方式
- log4j配置详解配置
- Log4j配置及加载
- log4j加载配置
- [Log4j] Log4j 的配置和配置文件加载顺序
- log4cplus 和 log4j 配置和详解
- log4j配置xml方式
- xml方式配置log4j
- Log4J的配置方式
- Log4j xml 配置方式
- Log4j配置方式
- Log4j.properties配置详解和实例
- log4j.properties 的详解和配置
- log4j配置详解
- log4j配置详解
- MySQL日期时间函数大全
- Objective-C中的访问权限
- 良心教程:用户交互的黑科技ARKitQQQ1
- zTree:实现单选/取消父子关联等
- Git和gitHub
- log4j加载配置方式和配置详解
- 自定义view 生成随机数
- js视频音频预加载/视频获取截图(返回canvas截图)
- Android 自定义控件实现圆形进度条
- Linux 创建用户的同时设置密码
- 舒适的Linux中文环境——Manjaro Deepin工作环境配置
- linux 下创建 用户 groupadd useradd 命令使用
- 量化投资(一):十行代码实现一个量化交易入门程序
- Android自定义View--初出茅庐