【问题标题】:Log(ger) Variable DeclarationLog(ger) 变量声明
【发布时间】:2009-09-02 09:43:05
【问题描述】:

在大多数情况下,我看到Log 实例声明如下:

public static final Log LOG = LogFactory.getLog(MyClass.class);

我假设这意味着 日志配置 是在加载 MyClass 时加载的,因此在重新加载 MyClass 或重新启动 JVM 之前设置为一成不变?

那么,如果这个假设是正确的,那么确保对日志配置的更改在发生时(或之后)被拾取的最佳方法是什么?

【问题讨论】:

  • 您是否使用commons-logging,从LogFactory 类判断?你的底层实现是什么
  • 是的,这个例子是 commons-logging,但它是一个更普遍的问题 - 我会对 commons-logging 和 Log4J 感兴趣。
  • 我对“log4j 重新加载配置”的搜索得到了几个有趣的结果

标签: java logging


【解决方案1】:

我假设您正在使用 LogFactory 类中的 commons-logging?据我所知,通常的日志记录实现(Log4J,java.util.logging)都不允许您在正在运行的应用程序中重新加载配置文件(无论实际的Loggers 是否被声明为static 变量)。 (编辑彼得在下面的回答证明我在 Log4J 的情况下是错误的

但是,它们确实允许动态更改日志记录级别(例如通过MBean)。 any Logger(包括声明为静态变量的那些)将拾取这些级别更改。如果您使用java.util.logging,您将在JConsole 中免费获得MBean

仅仅是您关心的级别的更改,还是您希望提供完全不同的日志配置(例如文件、记录器定义)动态

【讨论】:

  • 是的,我只是想更改日志记录级别,因此我将仔细研究 MBean 路由。
  • 添加 Log4J / j.u.l "bridge" 实际上非常容易,这意味着您可以使用 j.u.l MBeans 来管理您的 Log4J 记录器
  • Log4j 将根据您的需要在更改时重新加载您的配置文件。看我的回答。
  • 谢谢彼得 - 我不知道
【解决方案2】:

我猜这取决于 oxbow_lanes 指出的底层实现。通常,如果您依赖通过类路径可用的配置文件,则可能很难重新配置您的日志记录子系统。为了克服这个限制,我们以编程方式完成所有配置,而不是仅依赖静态配置文件。但我不知道您的实现是否支持程序化重新配置。

【讨论】:

    【解决方案3】:

    不,日志配置通常在初始化日志实现类时加载。当您的类(重新)加载时,所发生的只是调用日志记录 API 以获取记录器(任何配置中可能存在也可能不存在)并将其存储为类变量。

    要重新加载您的日志记录配置,您通常需要重新加载日志记录实现。

    【讨论】:

      【解决方案4】:

      取决于后端。

      Logback 有一个非常巧妙的功能,可以通过 JMX 触发重新加载,即在 jvisualvm 或 jconsole 中。

      【讨论】:

      【解决方案5】:

      实际上,如果您直接使用“java.util.logging”日志记录,那么您可以即时重新加载记录器配置。 LogManager 类有两种方法可以做到这一点:

      public void readConfiguration() 
          throws IOException, SecurityException
      

      这会重新加载默认日志记录属性并重新初始化日志记录配置。

      public void readConfiguration(InputStream ins)
          throws IOException, SecurityException
      

      这会从流中加载日志记录属性(以属性文件格式)并重新初始化日志记录配置。

      请参阅LogManager javadoc

      【讨论】:

        【解决方案6】:

        Log4j 可以在配置文件更改时重新加载它。

        查看常见问题解答here

        有没有办法让 log4j 到 自动重新加载配置 如果文件发生变化?

        是的。 DOMConfigurator 和 PropertyConfigurator 支持自动 通过重新加载 configureAndWatch 方法。查看 API 文档以获取更多详细信息。

        因为 configureAndWatch 启动 一个单独的 wathdog 线程,并且因为 没有办法阻止这个线程 log4j 1.2,configureAndWatch 方法在 J2EE 中使用是不安全的 应用程序所在的环境 回收。

        【讨论】:

          猜你喜欢
          • 2016-02-21
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 2012-06-15
          • 2014-11-09
          • 2021-12-16
          • 2021-01-15
          相关资源
          最近更新 更多