使用系统属性或变量的log4j(Use system properties OR variables

2019-08-06 22:01发布

我想要做的是这样的:

<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方法是什么?

是否有任何其他方式做到这一点?

Answer 1:

看看这个线程

它看起来像你做的一切权利。 我不认为这是设置你的财产与主类里面有什么区别System.setProperty()并通过命令行,只要它发生befor实际log4j的初始化指定它。

我觉得你的问题是,您所指定的属性之前您的日志框架被加载。 我可以说,当你调用配置器的日志框架(log4j的)将得到配置。 这样的东西BasicConfigurator.configure()在你的情况下,它的XML配置器)。

否则,使用记录的第一次尝试将导致邮件像“log4j的配置不正确”。

真正的问题是,是否有“主”您的代码段是不是简单化。

考虑到这一点,另外一个问题,我不得不问 - 不管你是一些容器中运行,或者你正在运行一个真正的香草方法主要通过自己配置的一切吗? 我问,因为如果你在容器中运行,有机会,容器本身将莫名其妙地配置其日志记录,例如JBoss会这么做。 在这种情况下,更多的研究是必要的。

希望这可以帮助



Answer 2:

系统属性可以作为$ {}的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>


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


Answer 4:

设置系统属性不会进入这里的影响。 你需要在执行把它作为一个参数为Java。 尝试

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

注:我不知道,如果点. 在那里工作,是使用下划线代替它_



文章来源: Use system properties OR variables in log4j
标签: java log4j