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