我在我的java应用程序中使用log4j .
我的log4j配置文件
设置根 Logger 级别 . 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 = $ log4j.appender.logfile.layout = org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern =% - 5p%d [%t]%c {2}:%m%n
log.output.File refers to the logging File .
我在一个程序中运行多个线程,该程序将日志记录条目定期写入输出文件 . 如果我在程序运行时手动打开文件并编辑文件内容.log4j会停止记录 . 我不希望伐木停止;我是Log4j的新手 .
1 回答
根据编辑器的不同,有两种方法可以保存文件:
新文件内容首先保存到临时文件中,当所有内容都成功保存后,新文件将重命名为真实文件 . 这样做的好处是,如果出现IO错误,旧内容仍然存在 . 如果其他进程在中间读取原始文件,它将永远不会看到旧内容和新内容的混合 .
打开原始文件,新内容直接写入文件 . 这样可以减少磁盘空间(因为不需要临时文件) . 缺点是另一个进程可能在附加模式下打开了相同的文件(可能用于记录),因此当新内容被写入多个部分时,写入可能会重叠,并且文件内容已损坏 .
还有很多其他后果依赖于这两种不同的方式,我现在懒得写下来 .
由于这些考虑,gedit似乎选择了第一种方式 . 当然,你可以做两件事:
检查gedit的源代码,尤其是将缓冲区保存到文件的函数 .
运行
strace -o strace.out gedit logfile.log
,编辑文件中的内容并保存文件 . 退出gedit,看看文件strace.out
. 搜索日志文件的名称,并查看在保存操作期间发生的系统调用(读取,打开,关闭,重命名,写入,统计,fstat) .