因为要在spring中添加Mongodb,在网上查阅资料的时候我发现有人在web.xml中添加如下代码:

  1. <context-param>
  2.       <param-name>log4jConfigLocation</param-name>
  3.       <param-value>classpath:config/properties/log4j.properties</param-value>
  4.    </context-param>
  5.  
  6.    <listener>
  7.       <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  8.    </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配置文件的路径而已。摘出部分代码如下:

  1. import org.apache.log4j.LogManager;
  2. import org.apache.log4j.PropertyConfigurator;
  3. import org.apache.log4j.xml.DOMConfigurator;
  4.  
  5.  
  6. public static void initLogging(String location) throws FileNotFoundException {
  7.       String resolvedLocation = SystemPropertyUtils.resolvePlaceholders(location);
  8.       URL url = ResourceUtils.getURL(resolvedLocation);
  9.       if (ResourceUtils.URL_PROTOCOL_FILE.equals(url.getProtocol()) && !ResourceUtils.getFile(url).exists()) {
  10.          throw new FileNotFoundException("Log4j config file [" + resolvedLocation + "] not found");
  11.       }
  12.  
  13.       if (resolvedLocation.toLowerCase().endsWith(XML_FILE_EXTENSION)) {
  14.          DOMConfigurator.configure(url);
  15.       }
  16.       else {
  17.          PropertyConfigurator.configure(url);
  18.       }
  19.    }

最终我的结论是,web.xml中配置的路径将优先生效,并发挥作用。

在整个过程中,还有一个经验是,如果log4g.properties的内容有错误,那么在启动的时候,会报和没有配置log4g. properties文件一样的错误:

  1. log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
  2. log4j:WARN Please initialize the log4j system properly.
  3. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

所以一旦有这个错误,可能并不是你的配置文件的位置不对,而是你的配置文件的内容有问题。

一个简单的log4j.properties文件的内容如下:

  1. log4j.rootLogger = ERROR,C1
  2.  
  3. #logger
  4. log4j.logger.com.zjf =DEBUG,F1
  5. log4j.additivity.com.zjf =false
  6. #\u5E94\u7528\u4E8E\u63A7\u5236\u53F0
  7. log4j.appender.C1=org.apache.log4j.ConsoleAppender
  8. #log4j.appender.C1.Threshold=WARNING
  9. log4j.appender.C1.Target=System.out
  10. #log4j.appender.C1.Encoding=UTF-8
  11. log4j.appender.C1.layout=org.apache.log4j.PatternLayout
  12. log4j.appender.C1.layout.ConversionPattern=[CONSOLE] %d - %c -%-4r [%t] %-5p %c %x - %m%n
  13.  
  14. #\u6BCF\u5929\u5EFA\u65B0\u65E5\u5FD7
  15. log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
  16. log4j.appender.A1.File=E:\\log\\log4j_daily.log
  17. #log4j.appender.A1.Encoding=UTF-8
  18. #log4j.appender.A1.Threshold=DEBUG
  19. log4j.appender.A1.DatePattern=.yyyy-MM-dd
  20. log4j.appender.A1.layout=org.apache.log4j.PatternLayout
  21. log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n
  22.  
  23. #\u5E94\u7528\u4E8E\u6587\u4EF6
  24. log4j.appender.F1=org.apache.log4j.FileAppender
  25. log4j.appender.F1.File=E:\\log\\Spring.log
  26. log4j.appender.F1.Append=true
  27. #log4j.appender.F1.Threshold=DEBUG
  28. #log4j.appender.F1.Encoding=UTF-8
  29. log4j.appender.F1.layout=org.apache.log4j.PatternLayout
  30. 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方法),要么是对应的一个类。

如:

  1. //定义C1为ConsoleAppender 输出到控制台
  2. log4j.appender.C1=org.apache.log4j.ConsoleAppender
  3. //以下都是ConsoleAppender的属性
  4. log4j.appender.C1.Threshold=WARNING
  5. log4j.appender.C1.Target=System.out
  6. log4j.appender.C1.Encoding=UTF-8
  7. // layout描述输出格式 PatternLayout是一个实现类
  8. log4j.appender.C1.layout=org.apache.log4j.PatternLayout
  9. //这个是PatternLayout的属性
  10. 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的配置文件的更多相关文章

  1. WEB系统启动时加载Log4j的配置文件

    如何在系统启动的时候加载log4j的配置文件呢? 1.自定义监听类并且继承“ServletContextListener”接口: package cn.ibeans.common; import ja ...

  2. 在单元测试中指定log4j的配置文件

    在开发过程中,我们会使用到log4j来输出日志,我们希望在单元测试的时候,只看到部分日志信息,或者定义日志输出的级别.   这个时候手工指定log4j的配置文件:   具体做法如下: 定义类如下: i ...

  3. log4j.properties配置文件详解

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  4. Log4J的配置文件详解

    来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设置记 ...

  5. Log4j学习(使用流程,Log4j.properties配置文件,配置到多个不同目标)

    参考网址: [http://blog.csdn.net/drift_away/article/details/7403658] [http://blog.csdn.net/lxzo123/articl ...

  6. 2018.8.6 学习 log4j.properties 配置文件

    配置文件的话第一步当然是解决乱码问题 Eclipse中properties文件中文乱码解决方式 打开eclipse的properties文件时你会发现,其中部分中文注释乱码了,下面将写出如何设置pro ...

  7. log4j.xml配置文件

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...

  8. log4j.properties配置文件

    #配置根 Logger,其语法为:log4j.rootLogger = level,appenderName1,appenderName2,... #优先级:ALL < DEBUG < I ...

  9. Log4j的配置文件

    附:Log4j比较全面的配置 Log4j配置文件实现了输出到控制台.文件.回滚文件.发送日志邮件.输出到数据库日志表.自定义标签等全套功能. log4j.rootLogger=DEBUG,consol ...

随机推荐

  1. SSO单点登录统一身份认证系统

    什么是单点登录 简单点说就是公司有A,B两个系统,我登录了A系统之后再跳转到B系统可以直接访问,而不需要再次登录B系统. 几种常见的单点登录实现方式 在讲解单点登录之前先讲解几个基本的概念: Cook ...

  2. 英特尔® 图形性能分析器 2019 R1 版本

    了解并下载全新英特尔® 图形性能分析器 2019 R1 版本.新版本新增了 DX11 和 Vulkan 多帧流捕获模式,可以在“帧和图形跟踪分析器”中分析 Vulkan 应用.此外,帧分析器还添加了 ...

  3. bert系列一:《Attention is all you need》论文解读

    论文创新点: 多头注意力 transformer模型 Transformer模型 上图为模型结构,左边为encoder,右边为decoder,各有N=6个相同的堆叠. encoder 先对inputs ...

  4. 【Linux开发】linux设备驱动归纳总结(五):1.在内核空间分配内存

    linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  5. 色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV

    之前做个设计,现在从事IT,脑子里面关于RGB,RGBA,CMY,CMYK,YUV,但是具体理论还是不扎实.若干年前之前写过<水煮RGB与CMYK色彩模型—色彩与光学相关物理理论浅叙>&l ...

  6. MAC使用二进制方式安装Mysql 5.7

    一.参考文档: 二.基础环境: 系统:Centos7.4 mysql版本:percona mysql 5.7 三.部署mysql 1.初始化 mysqld --initialize --explici ...

  7. 编写java 程序与Linux进行远程连接并运行linux下的脚本

    我这里是通过连接到centos6.5的大数据集群的主节点,并通过运行hadoop的启动脚本来启动hadoop 本人采用的是SSH的方式连接 通过创建maven项目来编写代码,在编写代码之前需要先导入架 ...

  8. .Net Core Grpc 实现通信

    .Net Core 3.0已经把Grpc作为一个默认的模板引入,所以我认为每一个.Net程序员都有学习Grpc的必要,当然这不是必须的. 我在我的前一篇文章中介绍并创建了一个.Net Core 3.0 ...

  9. Collection<E>接口

    https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html public interface Collection<E ...

  10. leecode刷题(28)-- 二叉树的前序遍历

    leecode刷题(28)-- 二叉树的前序遍历 二叉树的前序遍历 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 思路 ...