繁体   English   中英

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

[英]Configuring multiple applications using Log4j to write simultaneously in same log file

有什么方法可以将相同应用程序的两个实例记录到相同的日志文件中? 目前,我有以下代码:

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)

2015年7月2日更新:
我发现了问题。 显然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模式不兼容。

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

我认为这主要是Windows问题。 我已经在Linux下看到了这项工作。

但是,我不建议这样做:

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

如果要汇总某种报告的数据,请考虑记录到数据库中,该数据库可提供事务性并可以更好地控制数据。

如果要监视来自多个源的错误,则可以编写一个脚本,以捕获某些关键字的多个日志文件。

试图从不同的进程中同时写入同一文件带来麻烦。 相反,您可以考虑使用log4j的SocketAppender机制,该机制允许您将日志事件从几个不同的进程发送到单个中央“服务器”进程,该进程负责将它们实际写入日志文件。

这个问题 ,更具体地说是这个答案 ,提供了更多细节。

只需在Log4j.xml文件中添加所有必需的附加程序

例如

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

暂无
暂无

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

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