本地构建的log4j.xml优先级

时间:2015-04-15 19:45:15

标签: java log4j

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用弹簧MethodInvokingFactoryBean告诉log4j在哪里查找log4j配置。

以下是使用spring xml配置的示例:

<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配置示例

@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 :(得分:0)

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

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

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

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

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

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

答案 2 :(得分:0)

在您的应用程序开始时,您可以尝试:

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的回答,但首先我需要一些声誉; - )