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配置的例子:

<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

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


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161