【问题标题】:Condition logging level in Log4j.propertiesLog4j.properties 中的条件日志记录级别
【发布时间】:2013-11-28 11:50:13
【问题描述】:

是否可以在 log4j.properties 中有条件。我有一种情况,我想在生产环境中将日志记录级别设置为 Info,在本地设置为 DEBUG。是否可以读取 log4j.properties 中的环境变量。

【问题讨论】:

  • 尝试为您的环境使用两个版本的 log4j 属性,并将它们放在应用程序之外并添加到类路径中
  • log4j 也可以通过编程方式进行控制——虽然可能不是你想要的
  • 感谢您的回答,我在我的一个 web 应用程序中使用了这种方法,但这会导致冗余,我想知道是否有任何方法可以使其成为条件
  • 但是,我更喜欢它们。我可以按照良好的命名约定来管理它们。例如log4j-dev.xml,log4j-prod.xml在文件名中表示环境

标签: java


【解决方案1】:

不,你必须有 2 个不同的 log4j.properties 文件

【讨论】:

    【解决方案2】:

    配置日志记录应该作为部署的一部分发生,而不是作为构建的一部分,即您不应该为不同的日志配置创建多个构建,在工件中引入其他差异的风险非常大。

    创建一个包含默认配置的构建,可能是您想要在生产中使用的那个。

    实现一种在不更改工件的情况下查找和使用替代配置的方法。大多数情况下,这是通过在应用程序的类路径中添加一个附加目录并在其中存储 log4j 配置来实现的。您可以使用 log4j 的default initialization,方法是使用优先级高于工件中包含的配置格式。这还允许您在不进行新部署的情况下重新配置日志记录,这在故障排除时非常有用。

    或者,您可以在启动时通过环境变量提供要使用的配置文件的位置:-Dlog4j.configuration=log4j-prod.xml(借用 Keerthi Ramanathan 的回答)

    【讨论】:

      【解决方案3】:

      您可以准备不同的构建并决定您希望在构建时包含哪些 log4j.propeties,例如使用 maven 参数、配置文件或任何其他方式。 没有办法在 log4j.properties 中声明条件

      【讨论】:

      • 这对于您无权访问容器配置的独立应用程序可能很有用。如果你使用 Tomcat 即。并且您可以更灵活地访问配置,不将 log4j.properties 包含到 webapp 中并通过容器间接配置日志记录。
      【解决方案4】:

      没有。 但只是为了概述其他一些选项

      a) 我鼓励你看一下 logback,它提供了一个简单的 log4j 外观,然后你可以在运行时更改你的配置。相关文档可以在here找到。

      b) 如果您有适当的构建过程(ant/maven),您可以在构建过程中进行替换。如果您使用 maven,您可以设置 profile to build 并在构建周期中应用 filtering

      c) 从每个环境的 conf 目录加载 log4j 文件。这样做的想法是,一旦为环境设置的文件会随着时间的推移而发生最小的变化。您在存储库中维护并作为部署过程的一部分确保添加/删除附加/删除的文件/道具。

      【讨论】:

        【解决方案5】:

        正如评论中所说,我建议为每个环境提供一个单独版本的 log4j 属性文件,并遵循命名约定以便于维护。比如说,对于开发环境,它将是 log4j-dev.xml,而对于生产环境,则是 log4j-prod.xml。现在,您可以使用

        配置适当的文件以在运行时提取
        -Dlog4j.configuration=log4j-prod.xml
        

        在服务器启动期间。因此,相应的配置文件将由 log4j 获取。

        【讨论】:

        • 除了您的回答之外,我们还可以维护多个 log4j 文件,并在构建时间根据环境选择所需的一个。
        • 是的,使用 ANT 或类似的东西会很棒。很酷。
        【解决方案6】:

        您可以在使用 log4j 时使用编程配置,这使您可以更好地控制在什么环境中使用哪些选项。您可以拥有自己的配置文件并使用自己的逻辑将它们转换为 log4j 配置。缺点是您需要在应用程序的某个地方执行 init()。 This answer 提供了很好的参考。

        【讨论】:

          【解决方案7】:

          当我遇到类似问题时,我使用了这种方法。如果没有明确指定,则默认日志级别,以及覆盖选项。

          所以,我在应用程序资源中添加了一个log4j.properties 文件。

          log4j.rootLogger=ALL, stdout
          ...
          log4j.appender.stdout.Threshold=INFO
          ...
          

          然后添加更多日志配置属性 (log4j-n.properties, 用于 {n 中的 {d, i, w, e}) 定义调试、信息、警告和错误的日志级别。现在,如果我想覆盖默认值,我会在启动期间显式提供配置文件。

          java ... -Dlog4j.configuration=file:///<path>/log4j-n.properties ...
          

          这将覆盖我在默认 log4j.properties 中的任何配置。

          后来我采用了这种方法。我删除了所有额外的配置文件。在资源中的log4j.properties 文件中,我使用了一个JVM arg 占位符:

          log4j.appender.stdout.Threshold=${app.log.level}
          

          并将其作为 JVM 参数提供。

          java ... -Dapp.log.level=<LOG-LEVEL> ...
          

          瞧!

          【讨论】:

            猜你喜欢
            • 2011-05-06
            • 1970-01-01
            • 1970-01-01
            • 2023-03-23
            • 1970-01-01
            • 1970-01-01
            • 2016-11-27
            • 2014-12-03
            • 1970-01-01
            相关资源
            最近更新 更多