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

Maw*_*wia 15 java log4j

我想这样做:

<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>
Run Code Online (Sandbox Code Playgroud)

注意这一行: <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");
     ..........
     .......... 
  }
Run Code Online (Sandbox Code Playgroud)

但我没有看到任何影响.

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

有没有其他方法可以做到这一点?

Mar*_*nik 10

看看这个帖子

看起来你做的一切都是正确的.我认为在主类中设置属性与System.setProperty()通过命令行指定属性之间没有任何区别,只要它发生在实际的log4j初始化中.

我认为您的问题是您指定属性之前加载了日志框架.我可以说在调用配置程序时会配置日志框架(log4j).像BasicConfigurator.configure()(在你的情况下是它的xml配置器)的东西.

否则,第一次尝试使用日志记录将导致"log4j未正确配置"等消息.

真正的问题是你的'main'代码片段是否过于简单.

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

希望这可以帮助


小智 5

通过“sys:”前缀访问您的财产。

例子:

        <param name="File" value="${sys:error.log.path}"/>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问以下链接:https://logging.apache.org/log4j/2.x/manual/lookups.html