在大多数情况下,我看到Log
个实例声明如下:
public static final Log LOG = LogFactory.getLog(MyClass.class);
我认为这意味着在加载MyClass
时加载了日志配置,因此在重新加载{J}重新加载或重新启动JVM之前一直设置为日志配置
因此,如果这个假设是正确的,那么确保对日志配置进行更改的最佳方法是什么(或在不久之后)它们会被发现?
答案 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
这将从流中加载日志记录属性(以属性文件格式)并重新初始化日志记录配置。
答案 5 :(得分:1)
Log4j可以在配置文件发生变化时重新加载。
请参阅常见问题here
有没有办法让log4j到 自动重新加载配置 文件如果改变了吗?
是。 DOMConfigurator和 PropertyConfigurator支持自动 重装通过 configureAndWatch方法。请参阅API 文档了解更多详情。
因为configureAndWatch启动了 一个单独的wathdog线程,因为 没有办法阻止这个线程 log4j 1.2,configureAndWatch 方法在J2EE中使用是不安全的 环境应用的地方 回收