【问题标题】:Nondeterministic logging using JRuby + Tomcat6 + log4j使用 JRuby + Tomcat6 + log4j 的非确定性日志记录
【发布时间】:2012-02-19 02:45:39
【问题描述】:

我正在使用 log4j 登录我的 JRuby on Rails 应用程序。每次我推出应用程序时,日志都会附加到不同的最终目的地。有时它是 catalina.out。有时它是 localhost-date.log。有时它是 catalina-date.log。

我不太确定为什么每次都不一样。

关于为什么日志在我的环境中如此不可靠,我可以检查哪些内容?

【问题讨论】:

    标签: tomcat logging jruby tomcat6


    【解决方案1】:

    这确实很奇怪 - 你是不是偶然也使用了Apache Commons Logging

    这只是黑暗中的短暂,但每次我遇到 log4j 和/或 Commons Logging 的一些奇怪的事情时,我都会立即回忆并重新审视后者的有据可查的问题(参见 @ 987654323@,或者更全面的版本Taxonomy of class loader problems encountered when using Jakarta Commons Logging),简明扼要地总结在delfuego对log4j and the thread context classloader的回答中:

    您似乎偶然发现了 log4j 的主要问题(以及 Apache Commons Logging library),即他们有一个可笑的 很难发现正确的类加载器并与之交互 他们正在被使用。

    鉴于类加载器问题的本质,我可以想象它也会触发您的问题,即取决于当前最终连接到日志中的类加载器,它可能使用不同的日志记录属性搜索路径和各自的默认值,见Why can't log4j find my properties file in a J2EE or WAR application?:

    简短的回答:log4j 类和属性文件不是 在同一个类加载器的范围内。

    长答案(以及如何处理):J2EE 或 Servlet 容器 利用 Java 的类加载系统。 Sun 改变了类加载的方式 与 Java 2 的发布一起工作。在 Java 2 中,类加载器被安排 在等级制的父子关系中。当一个子类加载器 需要找到一个类或资源,它首先将请求委托给 父母。 [...]

    正如 delfuego 所建议的那样,通过切换到 Simple Logging Facade for Java (SLF4J) 确实很容易解决上述问题(顺便说一句,它与 log4j 的作者相同,Ceki Gülcü):

    [...] 带回家的信息是,主要驱动力之一是 新的日志框架SL4J 是为了消除这些问题 完全。你可能想换掉它,看看你的生活是否已经完成 更简单。

    最后,约翰(截至今天尚未解决)与Logging with log4j on tomcat jruby-rack for a Rails 3 application 的冒险似乎也暗示了各自的问题以及通过SL4J 的可能解决方案。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2011-07-14
      • 2014-12-25
      • 2016-01-26
      相关资源
      最近更新 更多