关于log4j的配置文件
因为要在spring中添加Mongodb,在网上查阅资料的时候我发现有人在web.xml中添加如下代码:
- <context-param>
- <param-name>log4jConfigLocation</param-name>
- <param-value>classpath:config/properties/log4j.properties</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
- </listener>
可以定义log4j的配置文件的路径。
因为我向来是把这个文件放在src下的。这种可配置的做法让我迷惑:
这种可配置的做法依赖于web.xml,那么也就是说只有web项目才能使用。而且要配置springframework下的一个Log4jConfigListener。所以这种做法更加奇怪。
我尝试在src下和classpath:config/properties/下都放了log4j.properties文件,但是log文件的输出路径不同。结果系统启动的时候会在两个位置都创建log文件。不过,最后经过我的验证,只有web.xml中配置的log文件会打印出内容,另外一个log文件甚至不是"占用"状态,可以删除不会报错。
后来我把web.xml中的这段配置删除,src下的配置的log文件就开始生效,保持占用状态,可以输出错误日志。
后来我翻了spring的源代码,发现spring只是从web.xml中取出了配置的路径,然后调用了log4j的代码,设置给了log4g配置文件的路径而已。摘出部分代码如下:
- import org.apache.log4j.LogManager;
- import org.apache.log4j.PropertyConfigurator;
- import org.apache.log4j.xml.DOMConfigurator;
- public static void initLogging(String location) throws FileNotFoundException {
- String resolvedLocation = SystemPropertyUtils.resolvePlaceholders(location);
- URL url = ResourceUtils.getURL(resolvedLocation);
- if (ResourceUtils.URL_PROTOCOL_FILE.equals(url.getProtocol()) && !ResourceUtils.getFile(url).exists()) {
- throw new FileNotFoundException("Log4j config file [" + resolvedLocation + "] not found");
- }
- if (resolvedLocation.toLowerCase().endsWith(XML_FILE_EXTENSION)) {
- DOMConfigurator.configure(url);
- }
- else {
- PropertyConfigurator.configure(url);
- }
- }
最终我的结论是,web.xml中配置的路径将优先生效,并发挥作用。
在整个过程中,还有一个经验是,如果log4g.properties的内容有错误,那么在启动的时候,会报和没有配置log4g. properties文件一样的错误:
- log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
- log4j:WARN Please initialize the log4j system properly.
- log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
所以一旦有这个错误,可能并不是你的配置文件的位置不对,而是你的配置文件的内容有问题。
一个简单的log4j.properties文件的内容如下:
- log4j.rootLogger = ERROR,C1
- #logger
- log4j.logger.com.zjf =DEBUG,F1
- log4j.additivity.com.zjf =false
- #\u5E94\u7528\u4E8E\u63A7\u5236\u53F0
- log4j.appender.C1=org.apache.log4j.ConsoleAppender
- #log4j.appender.C1.Threshold=WARNING
- log4j.appender.C1.Target=System.out
- #log4j.appender.C1.Encoding=UTF-8
- log4j.appender.C1.layout=org.apache.log4j.PatternLayout
- log4j.appender.C1.layout.ConversionPattern=[CONSOLE] %d - %c -%-4r [%t] %-5p %c %x - %m%n
- #\u6BCF\u5929\u5EFA\u65B0\u65E5\u5FD7
- log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.A1.File=E:\\log\\log4j_daily.log
- #log4j.appender.A1.Encoding=UTF-8
- #log4j.appender.A1.Threshold=DEBUG
- log4j.appender.A1.DatePattern=.yyyy-MM-dd
- log4j.appender.A1.layout=org.apache.log4j.PatternLayout
- log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n
- #\u5E94\u7528\u4E8E\u6587\u4EF6
- log4j.appender.F1=org.apache.log4j.FileAppender
- log4j.appender.F1.File=E:\\log\\Spring.log
- log4j.appender.F1.Append=true
- #log4j.appender.F1.Threshold=DEBUG
- #log4j.appender.F1.Encoding=UTF-8
- log4j.appender.F1.layout=org.apache.log4j.PatternLayout
- log4j.appender.F1.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
appender的内容是一个类,整个类都实现了org.apache.log4j.Appender接口,有以下几种:
•org.apache.log4j.ConsoleAppender(控制台),
•org.apache.log4j.FileAppender(文件),
•org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
•org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
•org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
Appender的配置要么是它对象的类的一个属性(有get方法),要么是对应的一个类。
如:
- //定义C1为ConsoleAppender 输出到控制台
- log4j.appender.C1=org.apache.log4j.ConsoleAppender
- //以下都是ConsoleAppender的属性
- log4j.appender.C1.Threshold=WARNING
- log4j.appender.C1.Target=System.out
- log4j.appender.C1.Encoding=UTF-8
- // layout描述输出格式 PatternLayout是一个实现类
- log4j.appender.C1.layout=org.apache.log4j.PatternLayout
- //这个是PatternLayout的属性
- log4j.appender.C1.layout.ConversionPattern=[CONSOLE] %d - %c -%-4r [%t] %-5p %c %x - %m%n
Log4j提供的layout有以下几种:
•org.apache.log4j.HTMLLayout(以HTML表格形式布局),
•org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
•org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
•org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
Log4j提供的level有:
OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
关于rootLogger :
log4j.rootLogger = [ level ] , appenderName, appenderName, …
rootLogger 和 rootCategory是同义词,或者说Category和Logger是同义词。原始的叫法是Category,后来为了与jdk1.4的日志功能保持一致,改为叫Logger。
关于logger的树状层级:
如果存在这样几个logger:
log4j.rootLogger = ERROR,A1
log4j.logger.x = INFO,A2
log4j.logger.x.y= INFO,A3
这三个logger是一个从上到下的树状结构,下面的节点会自动从上面的节点继承Appender,而不继承Level,上面的三个等效于:
log4j.rootLogger = ERROR,A1
log4j.logger.x = INFO,A1,,A2
log4j.logger.x.y= INFO,A1,A2,A3
如果要拒绝这种集成,可以设置additivity为false,如下:
log4j.rootLogger = ERROR,A1
log4j.logger.x = INFO,A2
log4j. additivity.x =false
log4j.logger.x.y= INFO,A3
这样log4j.logger.x将不再继承A1, log4j.logger.x.y从log4j.logger.x继承,也将没有A1。
对于logger的这种树状结构,当遇到日志记录时,将会根据Logger所在的包的路径进行匹配,从Logger树的叶子结点网上匹配配置的所有Logger,遇到第一个匹配(也就是最长的包路径匹配)就停止,不再往上走了。然后根据这个匹配的Logger(这个Logger也可能会从父Logger继承Appender)来进行输出。
关于log4j的配置文件的更多相关文章
- WEB系统启动时加载Log4j的配置文件
如何在系统启动的时候加载log4j的配置文件呢? 1.自定义监听类并且继承“ServletContextListener”接口: package cn.ibeans.common; import ja ...
- 在单元测试中指定log4j的配置文件
在开发过程中,我们会使用到log4j来输出日志,我们希望在单元测试的时候,只看到部分日志信息,或者定义日志输出的级别. 这个时候手工指定log4j的配置文件: 具体做法如下: 定义类如下: i ...
- log4j.properties配置文件详解
Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...
- Log4J的配置文件详解
来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设置记 ...
- Log4j学习(使用流程,Log4j.properties配置文件,配置到多个不同目标)
参考网址: [http://blog.csdn.net/drift_away/article/details/7403658] [http://blog.csdn.net/lxzo123/articl ...
- 2018.8.6 学习 log4j.properties 配置文件
配置文件的话第一步当然是解决乱码问题 Eclipse中properties文件中文乱码解决方式 打开eclipse的properties文件时你会发现,其中部分中文注释乱码了,下面将写出如何设置pro ...
- log4j.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...
- log4j.properties配置文件
#配置根 Logger,其语法为:log4j.rootLogger = level,appenderName1,appenderName2,... #优先级:ALL < DEBUG < I ...
- Log4j的配置文件
附:Log4j比较全面的配置 Log4j配置文件实现了输出到控制台.文件.回滚文件.发送日志邮件.输出到数据库日志表.自定义标签等全套功能. log4j.rootLogger=DEBUG,consol ...
随机推荐
- django基础窗口类的使用
django基础窗口form表单的运用 具体效果图如下: 首先确定表单中的数据集,先自己创建一个forms.py或者在原来的models.py中添加: 1代码如下 class ContactForm( ...
- JavaScript 基础入门11 - 运动框架的封装
目录 JavaScript 运动原理 运动基础 简单运动的封装 淡入淡出 不同属性的设置 多属性值同时运动 运动回调,链式运动 缓冲运动 加入缓冲的运动框架 案例1 多图片展开收缩 运动的留言本 Ja ...
- Blender建模与游戏换装(转载文)
本文转载自https://my.oschina.net/huliqing/blog/880113?hmsr=toutiao.io 如果本文涉及侵权行为,请原作者联系博主邮箱,我将及时进行删除处理 博主 ...
- 通俗易懂的lambda表达式,不懂来找我!
lambda是Python编程语言中使用频率较高的一个关键字.那么,什么是lambda?它有哪些用法?网上的文章汗牛充栋,可是把这个讲透的文章却不多.这里,我们通过阅读各方资料,总结了关于Python ...
- Cisco 三层交换机划分VLan与普通路由器连接配置
根据一些中小企业的一些业务需求,设计一套方案: 计划目标:针对不同部门划分不同的VLAN,前期满足能够同时上网的需求,后期需要能够隔离不同部门的资源访问(本次配置操作不涉及). 因之前未接触CISCO ...
- 【机器学习】转导推理——Transductive Learning
在统计学习中,转导推理(Transductive Inference)是一种通过观察特定的训练样本,进而预测特定的测试样本的方法.另一方面,归纳推理(Induction Inference)先从训练样 ...
- C语言|作业12—学期总结
一. 我学到的内容 二. 我的收获 作业链接 收获 C语言l博客作业01 对这个专业.学科以及markdown语法有了初步了解,打印出了"Hello world!" C语言l博客作 ...
- Rsyslog收集应用日志
收集系统其它服务日志,在客户端node1 上操作,示例以openstack-nova 服务的日志为例: 1.先修改配置文件 /etc/rsyslog.conf,完整内容如下: [root@node1 ...
- Hadoop简介及架构
狭义上来说,hadoop就是单独指代hadoop这个软件, 广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件 2.hadoop的历史版本介绍 0.x系列版本:hadoop当中最早的一 ...
- 十进制快速幂(牛客多校第五场)-- generator 1
思路: 十进制快速幂. #include <stdio.h>//sprintf #include <cstdlib>////malloc exit strcat itoa sy ...