python日志监控系统,python 实时监控日志文件
观察者模式:它是一种行为设计模式。主要关注的是对象的责任,允许您定义一个订阅机制,当对象事件发生时,该机制可以通知多个“观察”该对象的其他对象。本文将使用observer模式实现对日志的实时监控,有需要的可以参考。
00-1010观察者模式介绍类图观察者模式示例1,创建订阅者类2,创建发布者类3,应用Client -Map_server_client.py4,测试
目录
观察者模式:它是一种行为设计模式。主要关注的是对象的责任,允许您定义一个订阅机制,当对象事件发生时,该机制可以通知多个“观察”该对象的其他对象。用于处理对象之间交互。
观察者模式,也称为发布-订阅模式,定义了对象之间的一对多依赖关系。当一个对象改变状态时,这个对象的所有从属对象都将以它们自己的方式得到通知和更新。
观察者设计模式是最简单的行为模式之一。在观察者设计模式中,对象维护一个依赖项(观察者)列表,这样主题就可以使用观察者定义的任何方法通知所有观察者它的变化。
可使用观察者模式应用场景
在广播或发布订阅系统的情况下,您会看到观察者设计模式的用法,其主要使用场景如下:
1.在分布式系统中实现事件服务。
2.在广播或出版/阅读系统的情况下。
2.用作新闻机器的框架。
3.股票监控机器人。
介绍
观察者模式类图
1.发布者:向其他对象发送值得注意的事件。事件将在发布者自己的状态更改或执行特定行为后发生。发布者包含一个订阅机制,允许新的订阅者加入,当前的订阅者离开列表。
2.订户:定义通知界面。通常,这个接口只包含一个update()更新方法。方法可以有多个参数,以便发布者可以在更新时传递事件详细信息。
3.Client Client:分别创建发布者和订阅者对象,然后注册订阅者,发布者更新它们。
观察者模式类图
如果我们监控应用功能的运行状态,出现异常时报警并记录,可以通过观察者模式订阅信息:1、短信2、日志3、邮件。
代码实现- subscription_model.py
观察者模式示例
订阅者订阅者:所有其他要关注发布者状态变化的对象。
有三个主要的订阅者(观察者)接口,它们跟踪同一个发布者类的事件。主要包括:
1),每个特定的subscriber __init()方法使用attach()方法向发布者注册以获得信息更新。
2)特定订户的update()更新消息。
#抽象订户
fromabcimportABCMeta,abstractmethod
classSubscriber(元类=ABCMeta):
#向特定订户发送消息的方法
@抽象方法
取消更新(自己):
及格
#特定订户
第一,短信用户
类别订户(订户):
def__init__(self,publisher):
self.publisher=publisher
self.publisher.attach(自我)
取消更新(自己):
打印(类型(自我)。__name__,self.publisher.getNews())
#2,邮件订阅者
类别邮件订户(订户):
def__init__(self,publisher):
self.publisher=publisher
self.publisher.attach(自我)
取消更新(自己):
打印(类型(自我)。__name__,self.publisher.getNews())
信息=自身.发布者
.getNews()
# 发送邮件
Sender_mail(info).sender_mail()
#3、日志订阅(文件存储)
class LoggerSubscriber(Subscriber):
def __init__(self, publisher):
log_dir = os.path.expanduser(r".\apps\Mapview\logs")
log_file = os.path.join(log_dir, "file_{time}.log")
logger.add(log_file, rotation="100KB", retention=2)
self.publisher = publisher
self.publisher.attach(self)
def update(self):
print(type(self).__name__,self.publisher.getNews())
info=self.publisher.getNews()
logger.info(f"{info}")
2、创建发布者类
Publisher发布者:将自身的状态改变通知其他对象,为发布者添加订阅机制,每个对象都能订阅或取消订阅者事件流。
主要包括:
1)self.__subscribers =[]:一个用于存储订阅对象列表
2)供订阅者来注册NewsPublisher或删除订阅用户。
3)几个用于添加、删除或查看列表中订阅者的公有方法。
4)notifySubscribers(self):用于通知所有订阅者出现新的信息,发送者会遍历订阅列表并通过内部调用具体订阅者实现的update()方法来实现。
5)创建新消息和返回最新消息。
#创建发布者class NewsPublisher:
def __init__(self):
self.__subscribers = []
self.__latestNews = None
#将订阅者添加到队列中
def attach(self,subscriber):
self.__subscribers.append(subscriber)
#从订阅的主题里面移除
def detach(self):
return self.__subscribers.pop()
#生成观察者列表
def subscribers(self):
return [type(x).__name__ for x in self.__subscribers]
#发送通知给相关的主题订阅者
def notifySubscribers(self):
for sub in self.__subscribers:
#update()方法由具体的观察者或订阅者实现的
sub.update() #推送更新
#创建新消息
def addNews(self,news):
self.__latestNews = news
#返回最新消息,并通知观察者
def getNews(self):
return "Got News:",self.__latestNews
3、应用客户端-Map_server_client.py
订阅者通常需要一些上下文信息正确处理更新。因此,发布者通常会将一些上下文数据作为通知方法的参数传递。
这里给第一篇文章留下的尾巴补充一下,客户端实例化get_Map_model方法添加带参数装饰器,@fail_data(msg='地图加载失败')添加接口调用失败处理机制,追加日志记录。这里可以进一步将更多细节参数添加到日志中,装饰器传参并在接口中声明通知方法及参数,这样发布者在发出通知时传递一些上下文数据。
from apps.tools.subscription_model import NewsPublisher,LoggerSubscriber,EmailSubscriberimport functools
#如果加载失败,调用订阅者
def publisher(info):
news_publisher = NewsPublisher()
# for Subscribers in [EmailSubscriber, LoggerSubscriber]:
for Subscribers in [LoggerSubscriber]:
# eval(LoggerSubscriber)(news_publisher)
Subscribers(news_publisher)
print("\nSubscribers", news_publisher.subscribers())
news_publisher.addNews(f"{info}")
news_publisher.notifySubscribers()
#处理异常的装饰器
def fail_data(msg=地图加载失败):
def catch_exception(origin_func):
@functools.wraps(origin_func)
def wrapper(*args, **kwargs):
try:
u = origin_func(*args, **kwargs)
print("这个函数正常执行:%s" % origin_func.__name__)
return u
except Exception as e:
info = f"{msg}:{e.__doc__}"
"""
接口调用失败处理机制,追加日志
"""
print(info)
publisher(info)
# news_publisher = NewsPublisher()
# LoggerSubscriber(news_publisher)
# print("\nSubscribers", news_publisher.subscribers())
# news_publisher.addNews(f"{info}")
# news_publisher.notifySubscribers()
return wrapper
return catch_exception
4、测试
if __name__ == __main__:from loguru import logger
from apps.tools.Sender_Email import Sender_mail
news_publisher =NewsPublisher()
for Subscribers in [LoggerSubscriber]:
print(Subscribers)
Subscribers(news_publisher)
print("\nSubscribers",news_publisher.subscribers())
news_publisher.addNews("地图加载失败!")
news_publisher.notifySubscribers()
结果
class'__main__.LoggerSubscriber';
Subscribers['LoggerSubscriber']
LoggerSubscriber('GotNews:','地图加载失败!')
2022-04-0516:38:00.667INFO__main__:update:81-('GotNews:','地图加载失败!')
以上就是实现了一个简单的发布订阅模式,发布者与订阅者之间是松耦合的,添加新订阅者无需修改发布者。所有具体订阅者类都实现了同样接口。
到此这篇关于Python实现日志实时监测的示例详解的文章就介绍到这了,更多相关Python日志监测内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。