如何将log4j默认初始化与configureAndWatch()结合起来?

ski*_*ppy 4 java logging log4j

一些Log4j配置器有一个configureAndWatch()方法,它启动一个线程来观察用于配置的文件(XML文件或properties文件),并在文件发生变化时触发重新配置.

但是,如果您依赖于Log4j 默认初始化过程,则永远不会有机会调用configureAndWatch().您甚至不知道用于配置的文件(它甚至可能不是文件.)

是否有一种获得configureAndWatch()样式行为的好方法,允许动态更改日志配置,同时仍使用默认初始化过程?我假设你的配置URL最终解析为一个可以观看的文件,因为另一台服务器上的URL可能不是你想要每60秒拉一次的东西.

(我发现这个configureAndWatch()方法在Java EE 环境中是不安全的,因为单独的线程,我看到一些应用程序服务器有自己的机制来查看log4j配置文件,但我正在处理的程序目前没有运行在Java EE中.)

Sar*_*tha 9

我之前已经废弃了答案中的所有内容,现在重新开始,我更了解你想要的东西.

以下段落描述了log4j用于确定log4j配置文件名的实际顺序.此代码尝试遵循这些规则.

http://logging.apache.org/log4j/1.2/manual.html#defaultInit

它确定要使用的log4j配置文件,然后使用它找到的文件设置PropertyConfigurator.这仅在文件位于文件系统上时才有效.如果文件位于jar内或远程HTTP URL中,则无效.

    String prop = System.getProperty("log4j.configuration");
    if (prop == null) prop = "log4j.properties";
    URL log4jConfig = Loader.getResource(prop);
    if (log4jConfig.getProtocol().equalsIgnoreCase("file")) {
        PropertyConfigurator.configureAndWatch(log4jConfig.getFile().substring(1), 10000);
    }
    else {
        // cannot monitor if file changed because URL is not a file
    }
Run Code Online (Sandbox Code Playgroud)

  • **重要**:不要在linux上使用substring(1),因为这会搞砸路径. (3认同)