python - Python - 如何获取日志附加内容
问题描述
我使用看门狗来查看日志的更改,但我无法从看门狗 API 参考中获取附加内容。还有其他方法可以实现这一点吗?
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
import os
class MyHandler(FileSystemEventHandler):
def on_modified(self, event):
if event.src_path == ".\\test.log":
# how to get append content from the log
if __name__ == "__main__":
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path='.', recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
解决方案
据我所知Watchdog
,仅通知文件是否已修改,但它不会提供更改的信息,您必须自行检查。
我看到了两种显示新附加内容的方法。
首先:保持打开的文件,然后read()
将只读取新内容。
我的处理程序获取文件名作为参数以在启动时打开它并始终保持打开状态。
在__init__
您可以使用read()
跳过现有内容
import os
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class AppendEventHandler(FileSystemEventHandler):
def __init__(self, path):
self.path = path
self.fh = open(path)
self.fh.read() # skip existing content
def on_modified(self, event):
if event.src_path == self.path:
print(self.fh.read())
if __name__ == "__main__":
event_handler = AppendEventHandler(".\\test.log")
observer = Observer()
observer.schedule(event_handler, ".", recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
第二:如果您不想保留打开的文件,那么您可以记住它的大小并fh.seek(previous_size)
在附加内容开始时使用它来开始阅读。
import os
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class AppendEventHandler(FileSystemEventHandler):
def __init__(self, path):
self.path = path
self.size = os.stat(path).st_size # remeber previous size
def on_modified(self, event):
if event.src_path == self.path:
new_size = os.stat(self.path).st_size # get new size
if new_size > self.size:
fh = open(self.path)
fh.seek(self.size) # move to appended content (move to end of old content)
print(fh.read())
fh.close()
self.size = new_size # remeber new size
if __name__ == "__main__":
event_handler = AppendEventHandler("./test.log")
observer = Observer()
observer.schedule(event_handler, ".", recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
推荐阅读
- c++ - 从另一个结构中的函数返回结构的困难
- google-apps-script - 如果其他两列中的值相等,则在空白单元格中插入值
- elasticsearch - 查找字段不存在或字段小于值的文档
- java - Tomcat - 不使用 Apache HTTPD 的嵌套 webapp 路径
- .net - En Dash 和 Start of Guarded Area 字符
- javascript - 如何添加通过 div 重叠的水平线?
- c++ - 如何从 openGL 屏幕获取位图标题?(视频截取)
- php - 如何使用数组在 Bootstrap 中创建下拉菜单?
- google-apps-script - 如何在单独的选项卡上插入一行并保留一列公式?
- azure - QnA Maker 普遍可用与预览:它找不到答案