【发布时间】:2015-01-29 19:50:06
【问题描述】:
我有一个 Python 服务将日志输出到文本文件。它每 ~400KB 旋转一次。因此 Python 服务打开了文件的句柄,我们称之为 app.log。然后它不时地将内容写入文件,并将其刷新到磁盘。当它达到一定大小时,它会关闭它的句柄,并将其移动到 app.log.1 并在 app.log 上启动一个新的句柄。
所以我无法更改此服务,但我有一个可以读取这些日志的 C# 应用程序。我遇到了 3 个场景:
- 如果我只是尝试使用
new FileStream(path, FileMode.Open);读取这些日志,它不会允许我,因为 Python 服务已经处理了它。 - 如果我尝试使用
new FileStream(path, FileMode.Open, FileAccess.Read);打开它,这允许我读取它,但如果服务尝试轮换日志,它将无法这样做,因为我的 C# 应用程序现在拥有该文件的句柄。 - 如果我尝试使用
new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Delete);打开文件,我的 Python 服务在删除文件时不会失败,但它会在 app.log 上创建新句柄作为 C# 失败应用程序仍然可以处理它。
我知道的唯一解决方案是使用 Windows 卷影复制 (VSS) 创建日志快照,然后读取该快照,但这会非常昂贵,因为我们需要每 5 分钟查询一次日志.
另外,我对阅读旋转日志、app.log.1、app.log.2 等不感兴趣。
在 Windows 下登录到文本文件似乎很痛苦,因为所有的锁定/句柄。有人有什么建议吗?
【问题讨论】:
-
因此,如果您的 Python 应用程序在 C# 应用程序读取旧日志文件的过程中启动了一个新日志文件,您希望发生什么? C# 应用程序是否应该在移动到新文件之前继续读取旧文件的末尾?遗憾的是,您无法更新 python 应用程序,因为该编号方案很愚蠢。
-
主要是我们无法更新 Python 应用程序。 C# 应用程序可以默默地忽略任何读取失败,它应该停止读取并允许 Python 应用程序轮换日志(因此移动文件并创建一个新文件)。 C# 服务检查日志以了解 Python 应用程序正在执行基本操作。
-
请在此处查看每周日志轮换的答案https://stackoverflow.com/a/45028620/8288059
-
@HarisAhmed 与文件锁定无关,这个问题已有 3 年历史了。