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

问题描述 投票:15回答:5

我想这样做:

<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?

还有其他方法吗?

java log4j
5个回答
10
投票
this thread

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

我认为您的问题是您的日志记录框架已加载

之前,您可以指定属性。我可以说在调用配置器时将配置日志记录框架(log4j)。像BasicConfigurator.configure()之类的东西(在您的情况下为xml配置器)。

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

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

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

希望这会有所帮助


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>


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


0
投票
此处设置系统属性不起作用。在执行时,您需要将其作为参数传递给java。尝试

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

[注意:我不确定点.是否在其中起作用,因此将其替换为下划线_


0
投票
Maven文档:

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

来自Maven Property Substitution

© www.soinside.com 2019 - 2024. All rights reserved.