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

我想这样做:

        

注意这一行:

我试着像这样设置值:

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

但我没有看到任何影响。

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

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

看看这个post

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

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

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

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

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

希望这可以帮助

您可以通过实用配置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"); 

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

例子:

             

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

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

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