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

时间:2013-01-15 06:55:05

标签: 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>

请注意以下一行:<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?

还有其他办法吗?

6 个答案:

答案 0 :(得分:10)

查看this thread

看起来你做的一切都是正确的。我不认为在主类中使用System.setProperty()设置属性并通过命令行指定它,只要它在实际的log4j初始化时发生。

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

否则,首次尝试使用日志记录将导致“log4j配置不正确”等消息。

真正的问题是,带有'main'的代码段是否过于简单。

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

希望这有帮助

答案 1 :(得分:4)

系统属性可以用作$ {user.home},从这里选择http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

示例:

<appender name="errorLog" class="com.qait.logger.IOPFileAppender">
    <param name="Threshold" value="ERROR" />
    <param name="File"
        value="${user.home}/Harvestors/IOP Error Logs/error.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d%-5p  [%c{1}] %m %n" />
    </layout>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="ERROR" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>

答案 2 :(得分:3)

您可以通过实用配置appender来实现

  FileAppender fa = new FileAppender();
  fa.setFile("/test/crm/log/error.log");
  fa.setLayout(new 
   PatternLayout("%C{1} %L [%t] %d{dd MMM,yyyy HH:mm:ss.SSS} %-5p - %m%n"));
  fa.setThreshold(Level.ERROR);
  fa.setAppend(true);
  fa.activateOptions();
  Logger.getRootLogger().addAppender(fa);
  // similarly you can add all appenders.

 // or just append file name alone 
 Logger log = Logger.getLogger(YourClass.class);
 FileAppender appender = (FileAppender) log.getAppender("ErrorLog");
 appender.setFile("appender");

答案 3 :(得分:0)

此处不会设置系统属性。在执行时,您需要将它作为参数传递给java。尝试

 java -Derror_log_path=/test/crm/log/error.log

注意:我不确定点.是否适用于此处,因此将其替换为下划线_

答案 4 :(得分:0)

Maven文档:

系统属性。格式为$ {sys:some.property}和$ {sys:some.property:-default_value}。

来自Maven Property Substitution

答案 5 :(得分:0)

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

示例:

        <param name="File" value="${sys:error.log.path}"/>

欲了解更多信息,请点击此链接:https://logging.apache.org/log4j/2.x/manual/lookups.html