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