当前位置: 首页 > 面试题库 >

Log4J不记录任何内容

华福
2023-03-14
问题内容

我刚刚在工作中获得了一个现有的Web应用程序,该应用程序应该使用Log4J记录其活动。我已经按照告诉我的方式配置了工作空间,其他所有内容(数据库连接,身份验证等)都可以正常工作,只是没有任何内容写入日志文件。其他类似的应用程序没有问题记录。

我已经在应用程序启动时查看了WebSphere控制台,那里没有错误可能表明Log4J没有记录的原因。

我向另一个开发人员提到了这一点(该开发人员曾经处理过该应用程序,但是暂时没有使用,并且比我处理的过时得多),他指出这是非常奇怪的行为,但不知道为什么它可能无法登录并且不报告任何错误。

我已经查看了配置文件和属性文件,一切 看起来都
很好。我怀疑Log4J甚至从未读取过log4j.xml,但我不确定。自从我使用Log4J以来已经有一段时间了-有人在解决此类问题方面有一些不错的技巧吗?

PS:此应用程序的某些实例已部署到各种测试/ QA /产品服务器,并且这些实例均正常运行。这是 只有 在本地工作站记录似乎静默失败。

更新: 因此,这似乎与应用程序的部署方式有关。我将类加载器模式更改为“ Parent
Last”,并且可以看到至少现在正在读取Log4J文件。我尝试的第一个动作触发了一个找不到的ClassNotFoundException说法org.apache.commons.logging.impl.Log4jFactory

第二次更新: 我注意到了一些奇怪的事情…该应用程序有两个WAR项目-其中一个用于UI,另一个用于某些Web服务。用于UI的项目
成功将其操作记录到日志文件中。Web服务项目是失败的ClassNotFoundException。它们都具有作为JavaEE模块依赖项列出的commons-
logging.jar,并且都没有特定于项目的日志记录配置(所有配置文件都在Resources项目中)。

一个主要的区别是,UI项目包括其他一些内部框架(预编译为JAR),这些框架 可能 已经包含必要的日志记录配置,也许就是这些不同之处。

我还尝试使用以下问题的答案(META-INF /
services中名为org.apache.commons.logging.LogFactory的文件,其中一行包含:“
org.apache.commons.logging.impl.Log4jFactory”):Websphere的所有日志都将转到SystemOut.log,但这似乎没有帮助。


问题答案:

我所做的最后更改是使日志最终正常运行的最新更改是将类加载器模式更改为“ PARENT_FIRST”,并将WAR类加载器策略更改为“
Application”。初始默认配置为“ PARENT_FIRST” /“模块”。我根据一位同事的建议将其更改为“ PARENT_LAST”
/“应用程序”,他说日志记录对他们来说很好用,这是他们为该应用程序创建新沙箱时唯一要做的更改。我不确定为什么必须使用“ PARENT_FIRST” /“
Application”,但至少现在可以使用了。

更新:

我尝试设置一个新的工作区,但遇到了同样的问题。事实证明,您需要“ PARENT_FIRST” /“应用程序”以及META-INF /
services中一个名为org.apache.commons.logging.LogFactory的文件,其中一行包含:“
org.apache.commons.logging.impl.Log4jFactory”
。没有文件会导致记录失败(通常显示一条消息,指出找不到Log4J)。



 类似资料:
  • 我仍然没有发现正在发生的事情,但以下是我目前发现并做的事情: 1)log4j.xml文件格式不正确:缺少DOCTYPE,有多个布局,某些布局类不正确。 2)我已在命令行中指定了log4j.xml文件的路径;3)对DOMConfigurator和PropertyConfigurator的几次调用,我已将它们删除。 我将研究范围缩小到一个基于线程ID创建动态日志文件的类。在执行该类中的代码之前,log

  • Selenium IDE不会记录来自该网站“http://suppliers.inwk.com”的任何内容。您可能没有获得登录访问权限的凭据,但如果您可以在Selenum IDE中记录登录页面本身,那么我想我们可以找到根本原因,或者至少得到一个线索。 如果我将页面保存到本地计算机,打开页面,并尝试记录它的工作情况。似乎这一行的来源就是那一页的根本原因。你们中有谁能从这一行中找出问题的性质吗? 此外

  • 我计划用log4j one替换旧的记录器。我需要创建继承Logger的新类LocalLogger,而不是直接使用Logger。这样做的原因-我需要旧记录器中可用的新日志方法名称。 我有log4j记录器: 如何以与Logger相同的方式实现LocalLogger的功能? 如何将c类传递给超级本地记录器? LocalLogger的草稿:

  • 这是数据库架构 下面是我的log4j属性文件在写入文件时的工作版本

  • 主要内容:Logger日志方法的例子,Logger的日志方法Logger 类有多种方法来处理日志记录活动。Logger 类不允许我们实例化一个新的 Logger 实例,但它支持两种获取 Logger 对象的静态方法: 两个方法中的第一个返回应用程序实例的根记录器,它没有名称。 任何其他命名的 Logger 对象实例都是通过传递记录器的名称由第二种方法获得的。记录器的名称可以是您传递的任何字符串,通常是类或包名称,如下所述: Logger日志方法的例子 Lo

  • 当前的日志阈值是关于日志级别(TRACE,DEBUG,INFO,WARN,ERROR和FATAL)对我来说是不够的。我有一个千兆字节的日志从第三方库写入紧急情况下的错误类别。我不想打开这个日志,因为我想看到这个问题日志。大多数日志都是连续重复的堆栈跟踪。所以我想要一种可以 1)跳过日志,如果阈值(kb/sec)是真实的(我的意思是当我们写很多日志-我们可能会跳过一些)或 2)如果在一段时间内打印了