Java 日志(ger)变量声明

Java 日志(ger)变量声明,java,logging,Java,Logging,在大多数情况下,我看到Log实例声明如下: public static final Log LOG = LogFactory.getLog(MyClass.class); 我假设这意味着在加载MyClass时会加载日志配置,因此在MyClass重新加载或JVM重新启动之前,日志配置会一直保持不变 那么,如果这个假设是正确的,那么什么是确保在日志配置发生更改时(或之后)立即进行更改的最佳方法?我假设您使用的是LogFactory类中的commons logging?据我所知,通常的日志实现(Lo

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

public static final Log LOG = LogFactory.getLog(MyClass.class);
我假设这意味着在加载
MyClass
时会加载日志配置,因此在
MyClass
重新加载或JVM重新启动之前,日志配置会一直保持不变


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

我假设您使用的是
LogFactory
类中的
commons logging
?据我所知,通常的日志实现(Log4J,
java.util.logging
)都不允许您在正在运行的应用程序中重新加载配置文件(不管实际的
Logger
是否声明为
静态变量)。(编辑:Peter在下面的回答证明了我在Log4J中的错误)

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


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

我想这取决于底层实现,正如oxbow_lanes所指出的。通常,如果您依赖通过类路径提供的配置文件,则可能很难重新配置日志子系统。为了绕过这个限制,我们以编程方式进行所有配置,而不仅仅依赖于静态配置文件。但是我不知道您的实现是否支持编程重新配置。

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

public void readConfiguration(InputStream ins)
    throws IOException, SecurityException

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

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

public void readConfiguration() 
    throws IOException, SecurityException
这将重新加载默认日志属性并重新初始化日志配置

public void readConfiguration(InputStream ins)
    throws IOException, SecurityException
这将从流(以属性文件格式)加载日志记录属性,并重新初始化日志记录配置

public void readConfiguration(InputStream ins)
    throws IOException, SecurityException

请参阅。

取决于后端


Logback有一个非常好的特性,可以由JMX触发重新加载,即在jvisualvm或jconsole中。

Log4j可以在配置文件发生更改时重新加载配置文件

请参阅常见问题解答

有没有办法让log4j 自动重新加载配置 文件是否更改

对。DOMConfigurator和 属性配置程序支持自动 通过 配置和监视方法。请参阅API 有关更多详细信息,请参阅文档

因为configureAndWatch启动了 一个单独的wathdog线程,因为 没有办法阻止此线程进入 log4j 1.2,配置和监视 方法在J2EE中使用是不安全的 应用程序所在的环境 回收的


根据
LogFactory
类判断,您是否正在使用
commons日志记录
?您的底层实现是的,示例是commons logging,但这是一个更一般的问题-我对commons logging和Log4J感兴趣。我搜索“Log4J重新加载配置”时遇到了几个有趣的问题,我想更改的只是日志记录级别,因此我将仔细查看MBean路由。实际上,添加Log4J/
j.u.l
“桥”非常简单,这意味着可以使用
j.u.l
MBean来管理Log4J日志。如果您愿意,只要配置文件发生更改,Log4J就会重新加载。看到我的答案了。谢谢Peter-我不知道最近版本的logback增加了一个自动扫描功能,这更酷。