当我打开/编辑文件时,Log4j停止登录文件(文件附加程序)?

时间:2011-11-15 20:05:37

标签: log4j

我在我的java应用程序中使用log4j。

我的log4j配置文件

  

设置根记录器级别。

     

log4j.rootLogger = WARN,logfile

     

log4j.appender.logfile.MaxFileSize = 20MB备份文件

     

log4j.appender.logfile.MaxBackupIndex = 2

     

log4j.appender.logfile = org.apache.log4j.RollingFileAppender

     

log4j.appender.logfile.File = $ {log.output.file}

     

log4j.appender.logfile.layout = org.apache.log4j.PatternLayout

     

log4j.appender.logfile.layout.ConversionPattern =% - 5p%d [%t]%c {2}:   %米%N

log.output.File是指日志文件

我在一个程序中运行多个线程,该程序将日志记录条目定期写入输出文件。如果我在程序运行时手动打开文件并编辑文件内容.log4j会停止记录。我不希望伐木停止; 我是Log4j的新手。

1 个答案:

答案 0 :(得分:2)

根据编辑器的不同,有两种方法可以保存文件:

  1. 新文件内容首先保存到临时文件中,当所有内容都成功保存后,新文件将重命名为真实文件。这样做的好处是,如果出现IO错误,旧内容仍然存在。如果其他一些进程在中间读取原始文件,它将永远不会看到旧内容和新内容的混合。

  2. 打开原始文件,新内容直接写入文件。这样可以减少磁盘空间(因为不需要临时文件)。缺点是另一个进程可能在附加模式下打开了相同的文件(可能用于日志记录),因此当新内容被写入多个部分时,写入可能会重叠,并且文件内容已损坏。

  3. 还有很多其他后果依赖于这两种不同的方式,我现在懒得写下来。

    由于这些考虑因素,gedit似乎选择了第一种方式。当然,你可以做两件事:

    1. 检查gedit的源代码,尤其是将缓冲区保存到文件的函数。
    2. 运行strace -o strace.out gedit logfile.log,编辑文件中的内容并保存文件。退出gedit,查看文件strace.out。搜索日志文件的名称,并查看在保存操作期间发生的系统调用(读取,打开,关闭,重命名,写入,统计,fstat)。