一尘不染

在log4j中使用系统属性或变量

java

我想这样做:

<appender name="ErrorLog" class="org.apache.log4j.FileAppender">
        <param name="File" value="${error.log.path}"/>
        <param name="Append" value="true" />
        <param name="Threshold" value="ERROR"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%C{1} %L [%t] %d{dd MMM,yyyy HH:mm:ss.SSS} %-5p - %m%n" />
        </layout>
    </appender>

注意这一行: <param name="File" value="${error.log.path}"/>

我试图设置这样的值:

public static void main(String[] args) {
     System.setProperty("error.log.path", "/test/crm/log/error.log");
     ApplicationContext context = new ClassPathXmlApplicationContext("blah.xml");
     ..........
     .......... 
  }

但我看不到任何效果。

在调用main方法之前是否已配置log4j ?

还有其他方法吗?


阅读 741

收藏
2020-12-03

共1个答案

一尘不染

看来您做对了所有事情。我认为在主类中设置属性与System.setProperty()通过命令行指定属性之间没有任何区别,只要它发生在实际的log4j初始化之前即可。

我认为您的问题是 指定属性 之前已
加载日志记录框架。我可以说在调用配置器时将配置日志记录框架(log4j)。这样的东西BasicConfigurator.configure()(在您的情况下为xml配置器)。

否则,首次尝试使用日志记录将导致出现诸如“ log4j配置不正确”之类的消息。

真正的问题是您的带有“ main”的代码片段是否没有被简化。

考虑到这一点,我还要问另一个问题-
您是在某个容器中运行还是在运行真正的香草方法main并自行配置所有内容?我问是因为如果您在容器中运行,则很有可能容器本身会以某种方式配置其日志记录,例如JBoss会这样做。在这种情况下,需要进行更多调查。

希望这可以帮助

2020-12-03