我正在尝试创建一个异步函数,该函数读取不断更新的日志文件并获取它的每一行。这就是我现在所拥有的:
async def log_reader():
with open(LOG_PATH, "r", encoding='utf-8', errors='ignore') as logfile:
logfile.seek(0, os.SEEK_END)
while TRUE:
line = logfile.readline()
if not line:
await asyncio.sleep(0.2)
continue;
<do stuff>
在文件重新启动之前一切正常。我正在考虑检查文件的大小是否比它小,这意味着它已经刷新,但我觉得必须有更好的选择。
欢迎任何提示。
答案 0 :(得分:0)
要刷新文件,您可以检查它的inode。使用os.stat从路径中获取它,然后提取inode number。如果您获得的inode与前一个不同,则必须重新打开该文件。 (所以使用with
块执行此操作可能并不容易)
为了优化它以便你不会一直查询文件,你可以实现一些你可以轻易接受的超时,但是它高于日志行之间的通常延迟。
如果文件已被替换,这将是有效的,这是旋转日志文件的常用方法。如果文件仅被截断,它将无法工作。