0

如果我有多个线程使用 log4j 写入单个日志文件,并且我希望另一个线程将其读回,有没有办法安全地读取(逐行)这些日志,以便我总是读取整行?

编辑:这样做的原因是我需要将所有日志上传到一个中心位置,它可能是几天前的日志或刚刚写入的日志

4

2 回答 2

0

如果你需要实现你正在做的事情,这将是一件痛苦的事情,尤其是你必须处理文件滚动。

对于您的特定要求,有更好的选择:

  1. 如果您要备份的位置可以直接写入(即挂载在您的文件系统中),最好将您的文件滚动设置为写入该备份目录;或者

  2. 利用 Splunk 等日志管理工具来监控和管理您的日志文件(这样您甚至不需要复制到该备份目录);或者

  3. 即使您需要自己进行备份,您也不需要(也没有理由)在单独的线程中进行备份。尝试编写一个shell脚本监视您的日志目录,并使用rsync之类的工具或自己编写类似的逻辑,仅对本地和远程位置不匹配的文件进行上传。

于 2013-03-20T06:22:09.450 回答
0

您应该使用读写锁。

如果没有人写入文件,则可以由多个用户持有读锁,但无论如何一次只能由 1 个线程持有写锁。

只需确保在您的写入线程完成写入时,它会释放 readwritelock 以允许读取线程进行读取。同样,当阅读器完成阅读时,请始终释放读锁,以便 log4j 可以继续写入

查看

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReadWriteLock.html

但是,仔细想想,你这样做的目的是什么?如果您只是想监控您的日志,您应该使用不同的解决方案,而不是在同一个应用程序中使用监控线程。似乎没有意义。如果数据在应用程序/服务中可用,为什么将其传递到文件中并立即读回?

于 2013-03-20T04:51:25.330 回答