使用Log4j配置多个应用程序以在同一日志文件中同时写入

时间:2015-02-06 13:00:27

标签: java logging log4j

有没有办法让同一个应用程序的两个实例记录到同一个日志文件中?目前我有这个代码:

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模式不兼容。

4 个答案:

答案 0 :(得分:0)

AFAIK使用log4j是不可能的。您可以使用谨慎模式的Logback(http://logback.qos.ch/manual/appenders.html)或尝试使用其他工具进行集中式日志记录(例如http://logstash.net/

答案 1 :(得分:0)

我认为这主要是Windows问题。我在Linux下看过这项工作。

但是,我不建议这样做:

  • 并发文件访问非常棘手,特别是在Windows
  • 从多个来源编写的日志文件难以阅读。
  • 无法保证记录行的顺序
  • 日志文件轮换会让您头疼(只有旋转日志文件的进程才会写入新文件,其他进程将继续写入旧文件)

如果要汇总某种报告的数据,请考虑登录数据库,该数据库提供事务性和对数据的更多控制。

如果要监视来自多个源的错误,可以编写一个脚本,该脚本会为某些关键字创建多个日志文件。

答案 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>