如果我有多个线程使用log4j写入单个日志文件,并且我希望另一个线程将其读回,有没有办法安全地读取(逐行)这些日志,以便我总是读取全线?
编辑: 原因是我需要将所有日志上传到一个中心位置,它可能是几天前的日志或刚刚写入的日志
答案 0 :(得分:0)
您应该使用读写锁。
如果没有人写入文件,读取锁可以由多个用户持有,但是无论如何,写锁定一次只能由1个线程保存。
确保在写入线程完成写入时,它会释放readwritelock以允许读取线程读取。同样,当读取器完成读取时总是释放读锁定,因此log4j可以继续写入
结帐
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReadWriteLock.html
然而,考虑到这一点,你的目的是什么?如果您只想监视日志,则应使用其他解决方案,而不是在同一应用程序中使用监视器线程。似乎没有意义。如果数据在应用程序/服务中可用,为什么要将其传递给文件并将其直接读回?
答案 1 :(得分:0)
如果你需要实现你正在做的事情,那将是一件痛苦的事,特别是你必须处理文件滚动。
根据您的具体要求,有更好的选择:
如果要备份的位置可以直接写入(即安装在文件系统中),最好只设置文件滚动以写入该备份目录;或
利用Splunk等日志管理工具来监控和管理日志文件(这样您甚至不需要复制到该备份目录);或
即使您需要自己进行备份,也不需要(也没有理由)在单独的线程中执行备份。尝试编写一个监视日志目录的shell脚本,并使用rsync之类的工具或自己编写类似的逻辑,只对本地和远程位置不匹配的文件进行上传。