问题来源

本周在实际项目中发现无法自定义的log4j-dev配置的error日志级别文件无法生效,项目启动后仍然采用默认的info级别日志进行打印。之所以自定义名称,是为了减少隔离不同环境的日志级别,比如开发dev环境使用debug、info级别,而线上环境使用error级别。如果是采用默认的文件名称log4j.properties那么是可以生效的,但是在部署到不同环境时需要手动进行更改,容易遗忘。

于是在同事的协助下花时间研究了一波log4j的源码,最终完美解决

解决过程

我的log4j-dev.properties文件放置在resources目录下,springmvc环境(非springboot)

1、在web.xml引入Log4jConfigListener的监听器.

<context-param>   <param-name>log4jConfigLocation</param-name>   <param-value>classpath:log4j-dev.properties</param-value>   </context-param>   <context-param>   <param-name>log4jRefreshInterval</param-name>   <param-value>6000</param-value>   </context-param>   <listener>   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>   </listener> 

2、删除原来的log4j.properties文件,以及各个子模块下的log4j.properties文件。必须要删除所有的默认名称文件。或者保留默认文件,但是默认文件里的配置项的key必须同自定义配置文件log4j-dev.properties一致,value可以不同。

3、对第2点的解释Log4jConfigListener源码发现,如果存在默认文件会读取到默认文件的所以配置项,然后读取自定义文件的配置项,然后进行覆盖掉默认的配置项。如果没有默认配置文件,则直接读取classpath:log4j-dev.properties文件。

主要源码心得

Log4j容器初始化过程时序图

web环境log4jweb初始化过程时序图:

主要类:

  1. Logger——日志行为类,debug,info等日志记录行为,
  2. Category——Logger的父类
  3. LoggerRepository——日志容器,是管理Logger的容器,内部维护一个Hashtable,储存所有的Logger
  4. Hierarchy是Log4J中默认对LoggerRepository的实现类,它用于表达其内部的Logger是以层次结构存储的。在对LoggerRepository接口的实现中,getLogger()方法是其最核心的实现,因而首先从这个方法开始。
  5. LoggerManager——日志管理,日志框架的入口,由他开始启动日志系统,加载配置,初始化根日志
  6. Appender——日志输出器
  7. Layout——日志形式
  8. Level——日志级别
  9. rootLogger——根日志,每个Logger都有父级Logger,是层级关系,如果没有,则根日志就是父级,根日志是最后节点

log4j自定义配置文件(SpringMVC项目)相关推荐

  1. springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用...

    log4j 就是log for java嘛,老外都喜欢这样子,比如那个I18n  ---internationalization  不就是i和n之间有18个字母... http://logging.a ...

  2. log4j.xml引用Javaweb项目中配置文件的参数

    2019独角兽企业重金招聘Python工程师标准>>> 由于最近用阿里云日志服务整合log4j,在配置com.aliyun.openservices.log.log4j.Loghub ...

  3. springMVC 项目在jboss7中配置应用自己的log4j

    原文地址:http://www.xuebuyuan.com/1954635.html Jboss7默认采用容器自己的log4j module,应用自己配置的log4j不起作用,需要应用做一些设置: 以 ...

  4. java自定义配置文件_基于java读取并引用自定义配置文件

    基于java读取并引用自定义配置文件 首先在resources目录创建自定义的配置文件 配置文件的格式: 写工具类,得到配置参数 import java.io.IOException; import ...

  5. 使用Eclipse构建Maven的SpringMVC项目

    http://limingnihao.iteye.com/blog/830409 使用Eclipse构建Maven的SpringMVC项目 首先Eclipse需要安装Maven的插件,地址:http: ...

  6. SpringMVC项目 使用IDEA快速构建

    文章目录 一.使用idea构建基础项目 1. 创建一个新的项目 2. 选择maven项目构建架子 3. 项目储存路径 4. 配置maven和仓库 5. 自动下载所需依赖 二.初始化项目结构 2.1. ...

  7. 用Eclipse 搭建一个Maven Spring SpringMVC 项目

    1: 先创建一个maven web  项目: 可以参照之前的文章:  用Maven 创建一个 简单的 JavaWeb 项目 创建好之后的目录是这样的; 2: 先配置maven  修改pom.xml & ...

  8. springmvc项目,浏览器报404错误的问题

    问题描述: 建立了web工程,配置pom.xml,web.xml,编写controller类,在spring-mvc-servlet.xml文件中指定开启注解和扫描的包位置<mvc:annota ...

  9. slf4j-log4j12加log4j自定义配置包路径日志输出

    项目日志在定位问题原因上起着重要的作用,有用的日志输出能提高解决问题的效率,所以日志配置还是很关键的,对一个项目来说有用的日志包路径一般都是项目自己包路径下的日志,集成的框架和依赖包中的包路径下的日志 ...

最新文章

  1. 中国消费者信息指数影响因素分析
  2. [erlang] gen_tcp传输文件原型
  3. python基础笔记(非系统/自用/参考小甲鱼的零基础入门学习python)下
  4. Page.OnPreInit 方法
  5. python语法实例_python基本语法练习实例
  6. Python使用字典get()方法TypeError: get() takes no keyword arguments
  7. 【Flink】FLink 写入kafka 中关于 Exactly-Once 的一些思考
  8. Android开发笔记(六十六)自定义对话框
  9. Maven的性质与部署整理
  10. JAVA继承与多态概述
  11. Navicat远程连接服务器Mysql
  12. TCP/UDP测试工具大全
  13. C语言链表详解附实例
  14. Linux命令——timeout
  15. 高通8953启动流程
  16. 【语义分割】Searching for Efficient Multi-Scale Architectures for Dense Image Prediction翻译
  17. 机器视觉工程师应该具备哪些技能?
  18. 2345流氓软件让浏览器打开跳转到它的导航,并且自动下载安装2345浏览器
  19. R语言广义加性模型GAMs分析温度、臭氧环境数据绘制偏回归图与偏残差图
  20. QA之道知多少(一) 初出茅庐

热门文章

  1. firefox android 去更新,Android版Firefox Beta发布更新
  2. php打开就执行url,php执行URL解析
  3. 怎样用php写入数据库表,PHP如何将数据写入到MYSQL数据库
  4. 修饰符.lazy .number .trim
  5. try catch finally
  6. Python 问题--encode、decode及shell中文输出
  7. angular2 路由ajax,如何通过Javascript函数在Angular 2中实现AJAX
  8. WEB_面试题_第三阶段
  9. Hadoop生态系统学习路线
  10. [NOIP2016]愤怒的小鸟 状态压缩dp