关于本地构建的 java:log4j.xml 优先级

log4j.xml precedence on local build

我有一个使用 log4j 进行日志记录的项目。我们有一个控制日志级别的 log4j.xml 文件。我想要另一个 log4j.local.xml,我计划将它添加到 gitignore 文件中,一旦它存在,它就优先于普通的 log4j.xml。这是在本地构建上,我可以根据自己的喜好设置日志级别,但是一旦项目被签入并构建(例如在 Jenkins 上)并部署正常的 log4j.xml 设置就会使用,因为 log4j.local.xml 将不存在.

编辑:
应用程序没有任何配置来为 log4j 指定设置文件或任何内容。我假设日志框架有一些正在使用的默认值。此外,应用程序使用 Java 代码进行 Spring 配置,而不是 XML 文件。


你可以使用spring\\的MethodInvokingFactoryBean来告诉log4j去哪里寻找log4j的配置。

这里是一个使用springs xml配置的例子:

1
2
3
4
5
6
7
8
9
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="org.springframework.util.Log4jConfigurer"/>
    <property name="targetMethod" value="initLogging"/>
    <property name="arguments">
        <list>
            <value>${log.properties}</value>
        </list>
    </property>
</bean>

然后每个环境将能够拥有不同的 log4j 属性文件。

编辑

java配置示例

1
2
3
4
5
6
7
8
@Bean
public MethodInvokingFactoryBean methodInvokingFactoryBean(@Value("${log.properties}") String location) {
    MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
    methodInvokingFactoryBean.setTargetClass(Log4jConfigurer.class);
    methodInvokingFactoryBean.setTargetMethod("initLogging");
    methodInvokingFactoryBean.setArguments(new Object[]{location});
    return methodInvokingFactoryBean;
}


在你的应用程序开始时你可以试试这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.net.URL;

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

public class LogginConfig {
    public static void initLoggin() {
        final URL localLog4jConfig = LogginConfig.class.getResource("/log4j.local.xml");
        if (null != localLog4jConfig) {
            System.out.println("using local log4j-configuration");
            DOMConfigurator.configure(localLog4jConfig);
        } else {
            System.out.println("using Log4j-default");
        }
    }

    public static void main(final String[] args) {
        initLoggin();
        Logger.getLogger(LogginConfig.class).debug("helloooooo");
    }
}

如果能找到log4j.local.xml,就会使用它。否则将使用 Log4j 的标准查找过程。

忽略 System.out 语句 :) 这个答案就像 EricF 的答案,只是没有弹簧。

我会赞成 SubOptimal 的答案,但首先我需要一些声誉 ;-)


这取决于你如何阅读配置文件。

如果使用默认方式,则在classpath中搜索文件

1
2
change in developement the classpath so the development configuration
is found first

如果通过 JVM 选项指定配置文件(例如 Log4j 2 a?¢ 使用 -Dlog4j.configurationFile=path/to/log4j.xml)

1
2
3
instead of using a hardcoded path use an environment variable and
change that setting in development to the development configuration
file

如果您使用其他方式,您应该提供更多信息。