如何在另一个线程同时登录时安全地读取Log4j日志?

时间:2013-03-20 04:48:06

标签: java multithreading synchronization log4j

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

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

2 个答案:

答案 0 :(得分:0)

您应该使用读写锁。

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

确保在写入线程完成写入时,它会释放readwritelock以允许读取线程读取。同样,当读取器完成读取时总是释放读锁定,因此log4j可以继续写入

结帐

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

然而,考虑到这一点,你的目的是什么?如果您只想监视日志,则应使用其他解决方案,而不是在同一应用程序中使用监视器线程。似乎没有意义。如果数据在应用程序/服务中可用,为什么要将其传递给文件并将其直接读回?

答案 1 :(得分:0)

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

根据您的具体要求,有更好的选择:

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

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

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