【问题标题】:Log4j doesn't log INFO LevelLog4j 不记录信息级别
【发布时间】:2012-10-28 17:50:24
【问题描述】:

对于部署在 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 消息,但忽略了我尝试登录代码的所有内容。

有什么想法吗?

【问题讨论】:

    标签: java logging log4j


    【解决方案1】:

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

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

    -Dlog4j.debug=true

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      所以:

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

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

      祝你好运!

      【讨论】:

        【解决方案3】:

        我过去所做的是为我想要记录的类设置特定的日志。听起来您可以尝试将您的根记录器设置为 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
        

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-01
            • 2012-02-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多