我想这样做:
<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?
还有其他办法吗?
答案 0 :(得分:10)
看起来你做的一切都是正确的。我不认为在主类中使用System.setProperty()
设置属性并通过命令行指定它,只要它在实际的log4j初始化时发生。
我认为您的问题是您的日志框架在指定属性之前加载了。
我可以说在调用配置程序时会配置日志框架(log4j)。像BasicConfigurator.configure()
这样的东西(在你的情况下是它的xml配置器)。
否则,首次尝试使用日志记录将导致“log4j配置不正确”等消息。
真正的问题是,带有'main'的代码段是否过于简单。
考虑到这一点,我要问的另一个问题 - 你是在一个容器内运行还是你正在运行一个真正的vanilla方法主要并自己配置一切?我问,因为如果你在容器中运行,容器本身可能会以某种方式配置其日志记录,例如JBoss会这样做。在这种情况下,需要进行更多的调查。
希望这有帮助
答案 1 :(得分: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>
答案 2 :(得分: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");
答案 3 :(得分:0)
此处不会设置系统属性。在执行时,您需要将它作为参数传递给java。尝试
java -Derror_log_path=/test/crm/log/error.log
注意:我不确定点.
是否适用于此处,因此将其替换为下划线_
。
答案 4 :(得分:0)
Maven文档:
系统属性。格式为$ {sys:some.property}和$ {sys:some.property:-default_value}。
答案 5 :(得分:0)
通过“sys:”前缀访问您的财产。
示例:
<param name="File" value="${sys:error.log.path}"/>
欲了解更多信息,请点击此链接:https://logging.apache.org/log4j/2.x/manual/lookups.html