1.tomcat shared目录中的log4j.jar与war包中的log4j.jar冲突导致程序异常及日志信息异常
2.多项目共同使用一个log4j.jar带来的问题
http://zhidao.baidu.com/link?url=dg4KwaCEpiDTweFbMg_LgtX88XZnmdGb1Aq6nHfA59o0Ssytj-vtb9Pkj2Nk7VQ6HESMR_yeJ4_mlHIB8kLbxK
1.项目A中有一个log4j.properties(配置为把日志输出到以项目名称命名的文件夹中) 2.为了减轻tomcat负担,把项目A的WEB-INF/lib下的所有jar文件拷贝到tomcat下的lib中并修改catalina.properties对其加载 3.把项目A复制一份为项目B 4.然后把项目A和项目B同时发布在tomcat中(发布时删除了WEB-INF/lib) 访问项目A和项目B,发现两个应用的日志全部输出到了项目A的文件夹中。 顺便说一下,如果把项目需要的jar放在WEB-INF/lib中,则不会出现上述的问题。 在所有的jar文件都拷贝到tomcat/lib中的前提下,如何使得各个应用的log4j.properties生效呢??
目前知道的是,两个工程中的log4j.properties的确都被加载了,只是最后一个被加载的log4j.properties覆盖了前面加载的配置,也就是说只有最后被加载的生效了。
2012-07-31 18:27
提问者采纳
这个问题可能是这样的,由于你的log4j的包被放在了公共的目录下,因此tomcat在加载的时候,只加载这一份log4j相关类,而这一份log4j类在初始化过程中会读取你的日志输出路径,由于这个类被加载了一份,因此它本身也只能加载一份配置的输出路径(后面加载的覆盖前面加载的)。 你以往将log4j放在每个项目下,tomcat会创建多个classloader来负责加载每个项目路径中的类,而不同的log4j类当然就可以分别加载到不同的log4j properties文件,实现每个项目的单独输出。 不知你们项目为何一定要将所有的jar都归集到一处,我觉得你们可以单独把log4j这个包分开在各个项目中来实现这个功能。
追问:
我曾试着提取log4j到WEB-INF中,但是加载tomcat/lib中的某些类时会提示找不到log4j,我想是因为类加载器加载顺序的问题。
追答:
tomcat的加载规则和普通的类加载双亲委派不同。它是自身层级的加载器先加载,加载不到再委托父加载器。你放在tomcat的lib文件夹里的会被common classloader加载,而放在项目文件夹中的会被webapp classloader加载。commmo classloader是webapp classloader的父加载器,因此commmo classloader在加载自己路径中的类时,如果碰到log4j加载不到,只会委托自己的父加载器,也就是Application classloader去加载,而不会委托webapp classloader去加载,自然也就无法加载到你项目Lib中的log4j,你尝试一下把你的项目lib中和tomcat的lib中都放入log4j试试吧。
追问:
项目lib中和tomcat的lib中都放入log4j后,因为不同的classloader,加载时会出错,(部分)异常如下: log4j:ERROR "org.apache.log4j.RollingFileAppender" was loaded by [WebappClassLoader context: /dasp-mts-gerb delegate: false repositories: /WEB-INF/classes/ ----------> Parent Classloader: org.apache.catalina.loader.StandardClassLoader@d9ceea ]. 还有没有其它办法呢?
追答:
想不出什么好的办法了。。 如果log4j通过公有类加载器加载一份,那路径就只有一个。 如果log4j分别被项目私有的类加载器加载,但是其他包被公有类加载器加载,那么其他包就加载不到log4j,因为公有类加载器无法去委派子加载器去加载。 如果log4j被公有类加载器和项目的私有类加载器加载,又会引发冲突。。 这个问题本身就非常纠结啊,感觉你们把所有的包都归集到一处,又把日志分开打,还是有点不科学。。如果要把包全部作为公有的,日志估计也就只能作为公有让所有项目共享了。。
相关推荐
当我们遇到“无法打出log4j日志的问题”,这通常是由于配置、环境或代码实现中的某些错误导致的。这篇长文将深入探讨如何排查和解决这类问题。 首先,我们要理解Log4j的基本工作原理。Log4j通过配置文件(通常是log...
本教程主要关注如何在Tomcat 9环境中使用SLF4J(Simple Logging Facade for Java)和Log4j2进行日志记录,并解决可能出现的日志不写入问题。 首先,SLF4J是一个日志门面,它为各种日志框架提供了抽象层,如Logback...
《log4j各版本详解与应用》 在Java开发领域,日志管理是不可或...了解并熟练使用不同版本的Log4j,有助于提升代码的可维护性和问题排查效率。在选择和使用Log4j时,务必根据项目需求进行合理决策,以充分发挥其优势。
确保SLF4J和Log4j版本兼容,避免出现版本冲突导致的问题。例如,SLF4J 1.x对应Log4j 1.x,而SLF4J 2.x对应Log4j 2.x。 7. 日志管理和优化: 根据项目需求,可以通过调整配置来控制日志级别,防止过多的日志输出...
然而,在 JBOSS 服务器中使用 Log4j 时,可能会遇到一些冲突和配置问题。本文将详细介绍如何解决 JBOSS 和 Log4j 的冲突,配置 Log4j,及 Log4j 的基本使用方法。 解决 JBOSS 和 Log4j 冲突的配置 为了解决 JBOSS ...
配置日志文件时,你需要在项目中包含这两个JAR文件,并创建一个log4j的配置文件(通常是log4j.properties或log4j.xml)。配置文件中,你可以指定日志级别、输出目的地、日志格式等。例如,以下是一个简单的`log4j....
在Java Web开发中,Tomcat是一个广泛使用的应用服务器,而Log4j则是一个流行的日志记录框架。本文将深入探讨如何在Tomcat...正确配置后,Log4j将提供强大的日志管理能力,帮助开发者更好地理解和解决应用程序中的问题。
SLF4J(Simple Logging Facade for Java)与Log4j12的结合是Java日志处理中的一个常见组合。SLF4J提供了一个抽象层,允许开发人员在不修改代码的情况下切换不同的日志框架,如Log4j、Logback等。而Log4j12则是Apache...
- **版本兼容性**:确保所使用的Log4j版本与项目兼容,避免版本冲突导致的问题。 - **性能考虑**:虽然日志记录对于调试和维护非常有用,但在生产环境中过度使用日志可能会对性能造成影响。 - **安全性**:敏感信息...
通过这种方式,旧的JCL日志调用会被重定向到Log4j,并遵循我们在`log4j.properties`中定义的配置进行记录。 总结来说,`jcl-over-slf4j-1.6.0.jar`作为日志框架转换的桥梁,使得项目可以逐步从JCL过渡到更先进的SLF...
例如,在SpringBoot+Dubbo项目中,可能会出现log4j和logback的冲突,因为Dubbo依赖了zkclient,而zkclient又依赖了log4j,这样如果项目中还有其他日志框架存在并有使用,就会导致多套共存。解决方案是使用slf4j+...
在给定的标题和描述中,我们关注的是两个特定版本的Log4j jar包——1.2.8和1.2.16,它们可以同时引用且不会产生冲突。 首先,Log4j的这两个版本差异主要在于修复了某些bug和增加了新的特性。1.2.8是一个较早的版本...
SLF4J(Simple Logging Facade for Java)和Log4j是Java开发中常见的日志处理框架。SLF4J提供了一个抽象层,允许开发者在运行时选择合适的日志实现,而Log4j则是一个具体的日志实现,以其强大的功能和灵活性著称。...
"Log4j WebSphere V7 配置说明"是一个专门针对在IBM WebSphere Application Server V7环境下,如何使Log4j日志框架正常工作的问题。WebSphere作为一款强大的企业级应用服务器,其内部有自己的日志管理系统,这可能...
SLF4J(Simple Logging Facade for Java)和Log4j是Java开发中常用的日志处理框架,两者在日志管理领域各有其特点和优势。本文将深入探讨这两个框架以及它们之间的关系,以及如何通过SLF4J接口来实现Log4j的日志记录...
3. **避免日志冲突**:确保项目中没有其他日志库(如 log4j、java.util.logging)的直接引用,以免出现日志冲突。 使用 SLF4J 和 Log4j 的好处包括: - **可插拔性**:你可以轻松更换日志实现,只需更改桥接器即可...
标题中的"slf4j-log4j12-1.7.12.jar"是SLF4J的一个绑定包,它的作用是将SLF4J API与log4j日志框架连接起来。具体来说,这个版本(1.7.12)的绑定包实现了SLF4J的API,并将其桥接到log4j的实现上,使得开发者可以通过...
1. **依赖冲突**:确保你的项目中没有引入了其他日志框架的jar包,如logback或log4j1.x,这可能导致SLF4J找不到正确的绑定实现。 2. **配置文件缺失或错误**:`log4j2.xml`是Log4j2的主要配置文件,定义了日志的...
1. **安装与集成**:在Android项目中使用Log4j,需要将对应的AAR或JAR包添加到依赖库,并处理可能的冲突问题,例如与Android内置的日志系统`Log`类的冲突。 2. **配置**:创建适当的配置文件(如log4j2.xml),定义...
本文将深入探讨如何在多线程环境中利用Log4j实现每个子线程独立输出日志文件,这在大型分布式系统或并发应用程序中尤其重要,因为它有助于定位特定线程的问题,提高问题排查效率。 1. **Log4j介绍** - Log4j是一个...