Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python日志读取器_Python_Logging - Fatal编程技术网

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发生更改,则不能回滚,因为它是一个新文件。您需要关闭当前路径,然后再次打开同一路径。但也许你的日志循环只是截断了文件。(那么文件大小是唯一的指标)你必须弄清楚这一点。