繁体   English   中英

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

[英]Use system properties OR variables in 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?

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

看看这个线程

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

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

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

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

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

希望这可以帮助

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

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

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

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

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

Maven 文档:

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

来自Maven 属性替换

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

例子:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM