Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Log4j配置多个应用程序以同时写入同一日志文件_Java_Logging_Log4j - Fatal编程技术网

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

Java 使用Log4j配置多个应用程序以同时写入同一日志文件,java,logging,log4j,Java,Logging,Log4j,有没有办法让同一个应用程序的两个实例记录到同一个日志文件中?目前我有以下代码: JAVA: log = Logger.getLogger("APP"); Properties properties = new Properties(); properties.load(ClassLoader.getSystemClassLoader() .getResourceAsStream("config/logger.properties"));

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

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:错误setFile(null,true)调用失败。
java.io.FileNotFoundException:C:\Users\log4j\Desktop\C.txt(该进程无法访问该文件,因为它正被另一个进程使用)

更新日期:2015年2月7日:
我发现了我的问题。显然RollingFileAppender有一个bug,所以我将它改为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(),或者尝试使用另一个工具进行集中日志记录(例如)

我认为这主要是Windows的问题。我在Linux下看过这部作品

但是,我不建议这样做:

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

如果要为某类报表聚合数据,请考虑将日志记录到提供事务性和对数据的更多控制的数据库。


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

尝试同时从不同进程写入同一文件会带来麻烦。相反,您可以考虑使用Log4J的SoCopAppEnter机制,它允许您将日志事件从几个不同的进程发送到一个中央的“服务器”进程,该进程负责将它们实际写入日志文件。
,更具体地说,提供了更多详细信息。

只需在Log4j.xml文件中添加所有必需的追加器即可

e、 g



Windows不支持多个程序以这种方式写入同一文件。Linux允许它,但并不总是按照您希望的方式工作。源代码总是相同的,但来自不同的实例。记录行的顺序并不重要,我只是想了解一下错误消息。我可以避免这些麻烦,因为应用程序每天都会创建一个新文件夹。我知道数据库是最好的选择,但我不能在这种情况下使用数据库。
 <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>