17

我想这样做:

<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");
     ..........
     .......... 
  }

但我没有看到任何效果。

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

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

4

6 回答 6

10

看看这个线程

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

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

否则,第一次尝试使用日志会导致类似“log4j 配置不正确”的消息。

真正的问题是您的带有“main”的代码片段是否过于简单。

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

希望这可以帮助

于 2013-01-15T08:03:36.953 回答
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>
于 2014-04-01T13:22:47.920 回答
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");
于 2013-01-15T07:31:55.987 回答
1

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

例子:

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

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

于 2021-06-25T06:21:16.453 回答
0

设置系统属性在这里不生效。您需要在执行时将其作为参数传递给 java。尝试

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

注意:我不确定 dot 是否.在那里工作,所以用下划线替换它_

于 2013-01-15T07:35:16.887 回答
0

Maven文档:

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

来自Maven 属性替换

于 2020-05-18T02:36:06.190 回答