有没有办法让同一个应用程序的两个实例记录到同一个日志文件中?目前我有这个代码:
JAVA:
log = Logger.getLogger("APP");
Properties properties = new Properties();
properties.load(ClassLoader.getSystemClassLoader()
.getResourceAsStream("config/logger.properties"));
String logpath = properties.getProperty("log4j.appender.APP.File");
Properties log4jProperties = new Properties();
InputStream configStream = ClassLoader.getSystemClassLoader()
.getResourceAsStream("config/logger.properties");
log4jProperties.load(configStream);
configStream.close();
PropertyConfigurator.configure(log4jProperties);
log.error("error");
此配置 - logger.properties
log4j.rootLogger = DEBUG, R
log4j.category.APP=DEBUG, APP
log4j.appender.APP= org.apache.log4j.RollingFileAppender
log4j.appender.APP.File = C:\\Users\\log4j\\Desktop\\b.txt
log4j.appender.APP.MaxFileSize = 2KB
log4j.appender.APP.MaxBackupIndex = 3
log4j.appender.APP.Append = true
log4j.appender.APP.layout = org.apache.log4j.PatternLayout
log4j.appender.APP.layout.ConversionPattern=%-2d{dd/MM/yy HH:mm:ss} %p %t %c - %m%n
当我启动应用程序的第二个实例时,我得到以下错误:
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: C:\Users\log4j\Desktop\c.txt (The process cannot access the file because it is being used by another process)
更新07/02/2015:
我发现了我的问题。显然,RollingFileAppender存在一个错误,因此我将其更改为FileAppender,现在这两个实例可以访问该文件并记录其消息。
这是最终配置:
log4j.rootLogger = DEBUG, R
log4j.category.APP=DEBUG, APP
log4j.appender.APP= org.apache.log4j.RollingFileAppender
log4j.appender.APP.File = C:\\Users\\log4j\\Desktop\\b.txt
log4j.appender.APP.Append = true
log4j.appender.APP.layout = org.apache.log4j.PatternLayout
log4j.appender.APP.layout.ConversionPattern=%-2d{dd/MM/yy HH:mm:ss} %p %t %c - %m%n
我不得不删除MaxFileSize和MaxBackupIndex,因为它们与FileAppender模式不兼容。
答案 0 :(得分:0)
AFAIK使用log4j是不可能的。您可以使用谨慎模式的Logback(http://logback.qos.ch/manual/appenders.html)或尝试使用其他工具进行集中式日志记录(例如http://logstash.net/)
答案 1 :(得分:0)
我认为这主要是Windows问题。我在Linux下看过这项工作。
但是,我不建议这样做:
如果要汇总某种报告的数据,请考虑登录数据库,该数据库提供事务性和对数据的更多控制。
如果要监视来自多个源的错误,可以编写一个脚本,该脚本会为某些关键字创建多个日志文件。
答案 2 :(得分:0)
尝试从不同进程同时写入同一文件是一件麻烦事。相反,您可以考虑使用log4j的SocketAppender机制,它允许您将来自多个不同进程的日志事件发送到单个中央服务器"负责将它们实际写入日志文件的进程。
This question,更具体地说是this answer,提供了更多详细信息。
答案 3 :(得分:0)
只需在Log4j.xml文件中添加所有必需的appender
e.g。
<category name="com.vasx.edm.common.parser.ParserBase" additivity="true">
<priority value="DEBUG"/>
<appender-ref ref="ROLLING_APPENDER"/>
<appender-ref ref="ROLLING_FILE_APPENDER"/>
</category>
<category name="com.vasx.edm.dsp.DSParser" additivity="true">
<priority value="DEBUG"/>
<appender-ref ref="ROLLING_APPENDER"/>
<appender-ref ref="ROLLING_FILE_APPENDER"/>
</category>