1

对于部署在 WebSphere Portal 中的应用程序,我有以下 log4j.properties 文件:

log4j.rootLogger=DEBUG, InfoAppender, DebugAppender

log4j.appender.InfoAppender=org.apache.log4j.RollingFileAppender
log4j.appender.InfoAppender.Threshold=INFO
log4j.appender.InfoAppender.File=C:/info.log
log4j.appender.InfoAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.InfoAppender.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.DebugAppender=org.apache.log4j.RollingFileAppender
log4j.appender.DebugAppender.Threshold=DEBUG
log4j.appender.DebugAppender.File=C:/debug.log
log4j.appender.DebugAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.DebugAppender.layout.ConversionPattern=%d %p [%c] - %m%n

当我编码时,我在类级别定义记录器:

private static Logger logger = Logger.getLogger(IWannaLogThis.class);

我用这个记录 INFO 消息:

logger.info(theObjectToLog);

当我部署我的应用程序时,该debug.log文件会获取我记录的所有内容,logger.debug()但会忽略我编写的所有内容logger.info()。另一方面,info.log文件保持为空。

最奇怪的是,在类路径debug.loginfo.log出现了一些由一些 JARS(如 Hibernate Validator)发出的 INFO 和 DEBUG 消息,但只是忽略了我尝试登录代码的所有内容。

有任何想法吗?

4

4 回答 4

2

这很可能是与类加载相关的问题。WebSphere Portal 在内部使用 Log4J,所以我猜您最终会使用 WebSphere Portal 提供的 Log4J JAR 文件以及它自己的 Log4J 属性。

您可以通过将以下内容添加到服务器实例的 JVM 参数来验证这一点:

-Dlog4j.debug=true

然后检查SystemOut.log文件。Log4J 会吐出大量关于它读取的配置文件的跟踪信息。

避免这种情况的最佳方法是执行以下操作:

  1. 将 Log4J JAR 文件与您的应用程序捆绑在一起。
  2. 将共享库与服务器关联。在该共享库中,放置您的 Log4J 配置文件。

作为第 2 步的替代方法,您可以将 Log4J 配置文件与应用程序本身捆绑在一起,但这会带来其自身的缺点(例如,每当您执行 Log4J 配置更改时,都必须重新打包您的应用程序)。

于 2012-10-28T20:56:12.710 回答
1

另一个常见问题是类路径中的 JAR 也使用 log4j 并且还设置了自己的附加程序。因此,根据他们使用的设置以及您的类所在的包,这可能会导致您描述的问题。

所以:

  • 确保您的包名称是唯一的,并且没有被任何第三方库使用。
  • 检查类路径中所有库的 log4j 设置。它们不应包含覆盖您的常规设置。
  • 确保您的记录器使用您的 log4j.properties(您可以确定您在文件中所做的更改是否会按预期影响您的记录器)。
  • 如果可以,请确保您的 log4j 内容最后加载,以防任何第三方库重置配置。他们不应该,但谁能阻止他们。

通常,它应该是其中之一。如果它不起作用,请发布更明确的示例。

祝你好运!

于 2012-10-28T20:39:42.747 回答
0

我过去所做的是为我要记录的类设置特定的日志。听起来您可以尝试将您的根记录器设置为 INFO 并查看是否可以获取您想要的消息。这是我的 log4j 属性文件的一点点。我为每个类设置了一个记录器,并将其分配给我的“数据”附加程序,它定义了日志布局。在记录器中,我指定要记录的特定类并单独设置它们的日志级别。任何未在 Loggers 中定义的日志类都使用 rootCategory 的默认日志级别。

log4j.rootCategory=INFO, rollingFile, stdout

#GetData Loggers
log4j.logger.com.myapp.data=INFO, data
log4j.logger.com.myapp.data.SybaseConnection=DEBUG, data
log4j.logger.com.myapp.data.GetData=ERROR, data


# data appender
log4j.appender.data=org.apache.log4j.RollingFileAppender
log4j.appender.data.layout=org.apache.log4j.PatternLayout
log4j.appender.data.File=c\:\\Program Files\\MyApp\\logs\\MyApp-data.log
log4j.appender.data.Append=true
log4j.appender.data.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n
于 2012-10-28T18:26:25.503 回答
0

您的根记录器在调试模式下打开日志属性,

在属性文件的第一行中使用 INFO 而不是 DEbug。

于 2013-01-09T09:34:21.913 回答