Python日志读取器
我试图创建一个异步函数,它读取不断更新的日志文件并获取其中的每一行。这就是我现在所拥有的:Python日志读取器,python,logging,Python,Logging,我试图创建一个异步函数,它读取不断更新的日志文件并获取其中的每一行。这就是我现在所拥有的: 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()
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>
async def log_reader():
打开(日志路径为“r”,编码为“utf-8”,错误为“忽略”)作为日志文件:
logfile.seek(0,os.seek_END)
尽管如此:
line=logfile.readline()
如果不是直线:
等待异步睡眠(0.2)
继续;
它可以正常工作,直到文件重新启动。我在考虑检查文件的大小是否变小了,这意味着它被刷新了,但我觉得一定有更好的选择
欢迎提供任何提示。要刷新该文件,您可以查看其inode。使用从路径获取它,然后提取。如果您获得的inode与上一个不同,则必须重新打开该文件。(因此,使用带有块的
执行此操作可能并不容易)
为了稍微优化它,使您不必一直查询文件,您可以实现一些可以轻松接受的超时,但这比日志行之间通常的延迟要高
如果文件已被替换,这将起作用,这是旋转日志文件的常用方法。如果文件仅被截断,它将不起作用。我已经尝试了您的版本:将open(LOG\u PATH,“r”,encoding='utf-8',errors='ignore')作为日志文件:inodenum=os.stat(LOG\u PATH)[ST\u INO]logfile.seek(0,os.seek\u END),而不是client.is\u关闭:if inodenum!=os.stat(LOG\u PATH)[ST\u INO]:inodenum=os.stat(LOG\u PATH)[ST\u INO]logfile.seek(0,os.seek\u END)
但它似乎对我不起作用:inode号不起作用change@degranon如果inode发生更改,则不能回滚,因为它是一个新文件。您需要关闭当前路径,然后再次打开同一路径。但也许你的日志循环只是截断了文件。(那么文件大小是唯一的指标)你必须弄清楚这一点。