[英]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 .
在那里工作,所以用下划线_
替换它。
通过“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.