log4j.xml 优先级
•浏览 1
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配置的例子:
<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>
@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;
}
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");
}
}
change in developement the classpath so the development configuration
is found firstinstead of using a hardcoded path use an environment variable and
change that setting in development to the development configuration
file
然后每个环境将能够拥有不同的 log4j 属性文件。
编辑
java配置示例
<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>
@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;
}
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");
}
}
change in developement the classpath so the development configuration
is found firstinstead of using a hardcoded path use an environment variable and
change that setting in development to the development configuration
file
在你的应用程序开始时你可以试试这个:
<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>
@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;
}
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");
}
}
change in developement the classpath so the development configuration
is found firstinstead of using a hardcoded path use an environment variable and
change that setting in development to the development configuration
file
如果能找到log4j.local.xml,就会使用它。否则将使用 Log4j 的标准查找过程。
忽略 System.out 语句 :) 这个答案就像 EricF 的答案,只是没有弹簧。
我会赞成 SubOptimal 的答案,但首先我需要一些声誉 ;-)
这取决于你如何阅读配置文件。
如果使用默认方式,则在classpath中搜索文件
<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>
@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;
}
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");
}
}
change in developement the classpath so the development configuration
is found firstinstead of using a hardcoded path use an environment variable and
change that setting in development to the development configuration
file
如果通过 JVM 选项指定配置文件(例如 Log4j 2 a?¢ 使用 -Dlog4j.configurationFile=path/to/log4j.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>
@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;
}
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");
}
}
change in developement the classpath so the development configuration
is found firstinstead of using a hardcoded path use an environment variable and
change that setting in development to the development configuration
file
如果您使用其他方式,您应该提供更多信息。