Log(ger)变量声明

时间:2009-09-02 09:43:06

标签: java logging

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

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

我认为这意味着在加载MyClass时加载了日志配置,因此在重新加载{J}重新加载或重新启动JVM之前一直设置为日志配置

因此,如果这个假设是正确的,那么确保对日志配置进行更改的最佳方法是什么(或在不久之后)它们会被发现?

6 个答案:

答案 0 :(得分:3)

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

但是,它们允许动态更改日志记录级别(例如,通过static)。这些级别更改将由任何 MBean(包括声明为静态变量的那些)获取。如果您使用Logger,则可以java.util.logging免费获得MBean

只是更改您关注的级别,还是希望提供完全不同的日志记录配置(例如文件,记录器定义)即时

答案 1 :(得分:2)

我认为这取决于潜在的实现,正如oxbow_lanes所指出的那样。通常,如果依赖于通过类路径提供的配置文件,则可能难以重新配置日志记录子系统。为了解决这个限制,我们以编程方式完成所有配置,并且不仅仅依赖静态配置文件。但我不知道您的实现是否支持程序化重新配置。

答案 2 :(得分:2)

不,通常在初始化日志记录实现类时加载日志配置。当(重新)加载类时,所有发生的事情都是调用日志记录API来获取记录器(可能存在或不存在于任何配置中)并存储为类变量。

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

答案 3 :(得分:2)

取决于后端。

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

答案 4 :(得分:1)

实际上,如果您直接使用“java.util.logging”日志记录,那么您可以动态重新加载记录器配置。 LogManager类有两种方法可以执行此操作:

public void readConfiguration() 
    throws IOException, SecurityException

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

public void readConfiguration(InputStream ins)
    throws IOException, SecurityException

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

请参阅LogManager javadoc

答案 5 :(得分:1)

Log4j可以在配置文件发生变化时重新加载。

请参阅常见问题here

  

有没有办法让log4j到   自动重新加载配置   文件如果改变了吗?

     

是。 DOMConfigurator和   PropertyConfigurator支持自动   重装通过   configureAndWatch方法。请参阅API   文档了解更多详情。

     

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