在我们的异常检测应用中,需要对每组IoT设备分别训练一个模型,每个模型对一组设备的指标数据进行实时异常检测。方案采用master-worker+消息队列的方式实现模型对外服务,但是每个worker的日志需要集中收集到同一个日志文件,而不是每个worker产生一个日志文件。此时我们采用基于logging模块的QueueHandler+QueueListener方案。master在创建worker之前,首先创建一个日志队列,创建worker时,将日志队列传入,同时worker端使用QueueHandler作为日志处理例程,将日志写入队列,master端启动Queuelistener对日志队列中的消息进行监听,对接收到的消息调用相应的FileHandler处理例程进行处理,写入文件。以次实现对多worker日志的集中管理。相关代码如下:

master侧的日志相关代码:

  def _init_logger(self):
self.logger = logging.getLogger("job.manager")
self.log_queue = Queue()
self.log_queue_listener = QueueListener(self.log_queue, *self.logger.handlers) def _register_signals(self):
signal.signal(signal.SIGINT, self.stop)
signal.signal(signal.SIGTERM, self.stop) def _start_single_worker(self, worker_id, worker_group, worker_config):
worker = Worker(
worker_id=worker_id,
worker_group=worker_group,
group_members=worker_config.get('group_members'),
consume_topic=mq_config.get('sample_topic'),
consume_subscription=worker_group + '_subscription',
produce_topic=mq_config.get('result_topic'),
model_path=worker_config.get('model').get('binary_path'),
model_type=worker_config.get('model').get('type'),
log_queue=self.log_queue)
try:
worker.start()
except Exception as e:
raise Exception("worker start error")

worker侧日志相关代码:

_mutex = RLock()

    def __init__(self, worker_id, worker_group, group_members, consume_topic, consume_subscription,
produce_topic, model_path, model_type, log_queue):
self.id = worker_id
self.group = worker_group,
self.group_members = group_members
self.running = True
self.status = 'idle'
self.logger = None
self.mq_client = None
self.model = None self._init_logger(log_queue)
self._init_mq_client(consume_topic, consume_subscription, produce_topic)
self._load_model(model_path, model_type)
self._register_signals() self.logger.info('Worker {} started.'.format(self.id)) def __del__(self):
if self.mq_client:
self.mq_client.close() @property
def status(self):
with self._mutex:
return self._status @status.setter
def status(self, status):
with self._mutex:
self._status = status def _init_logger(self, log_queue):
queue_handler = QueueHandler(log_queue)
self.logger = logging.getLogger('job.worker')
self.logger.addHandler(queue_handler) def _register_signals(self):
signal.signal(signal.SIGINT, self.stop)
signal.signal(signal.SIGTERM, self.stop) def _init_mq_client(self, consume_topic, consume_subscription, produce_topic):
self.mq_client = mq_cls()
self.logger.info('worker {}: mq client initialised.'.format(self.id)) self.mq_client.init_consumer(consume_topic, consume_subscription)
self.logger.info('worker {}: mq consumer initialised.'.format(self.id)) self.mq_client.init_producer(produce_topic)
self.logger.info('worker {}: mq producer initialised.'.format(self.id)) def _load_model(self, model_path, model_type):
if model_type == "sklearn":
self.model = load_sklearn_model(model_path)
elif model_type == "keras":
self.model = load_keras_model(model_path)
else:
raise Exception('worker {}: model type error.'.format(self.id))
self.logger.info('worker {}: model loaded.'.format(self.id))

基于queue的python多进程日志管理的更多相关文章

  1. 【Python】 日志管理logging

    logging *****本文参考了http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html ■ 最最基本的用法 logging模块用 ...

  2. Python logging日志管理

    import logging logger = logging.getLogger("simple_example") logger.setLevel(logging.DEBUG) ...

  3. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  4. python中日志logging模块的性能及多进程详解

    python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...

  5. python+pytest接口自动化(15)-日志管理模块loguru简介

    python自带日志管理模块logging,使用时可进行模块化配置,详细可参考博文Python日志采集(详细). 但logging配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理, ...

  6. Python 多进程编程之 进程间的通信(在Pool中Queue)

    Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...

  7. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  8. spring+mybatis基于 AOP实现业务日志管理

    最近在项目上用到了操作日志的相关,之前的解决方案就是自己写一个日志project,然后统一调用日志接口即可,这样方便自定义定制,因为有很多设备控制之类的都是需要确认一下的,但是,对数据的操作,比如,增 ...

  9. python selenium2示例 - 日志管理

    logger继承图 前言 在自动化测试实践过程中,必不可少的就是进行日志管理,方便调试和生产问题追踪,python提供了logging模块来进行日志的管理.下面我们就logging模块的学习和使用进行 ...

随机推荐

  1. Codeforces 976C Nested Segments

    题面: 传送门 C. Nested Segments Input file: standard input Output file: standard output Time limit: 2 secon ...

  2. MyBatis-Plus【踩坑记录01】

    不要使用Mybatis原生的SqlSessionFactory,而应使用MybatisSqlSessionFactory. 原因 依赖关系如下 因此会在使用Mybaits-Plus时默认的时Mybat ...

  3. 2020-2021 ACM-ICPC, Asia Seoul Regional Contest

    C. Dessert Café: 题意: 给你一个N个节点的树,树上有m个房子,问树上有几个节点是在两个房子之间的. 思路:我们发现只要是该节点的子树里包括了所有节点或者只有一个节点,那么这个结点肯定 ...

  4. LamPiao靶机work_through

    前言 oscp靶机系列的第二篇.只追求做出来的话,这靶机蛮简单的.但是为了提升难度,尽量避免使用msf--毕竟考试只准用一次嘛,自己写了个exp. 正文 主机发现 nmap -sP 192.168.2 ...

  5. Istio 故障注入之延时(fixedDelay)

    Istio 故障注入 Istio 故障注入与其他在网络层引入错误(例如延迟数据包或者直接杀死 Pod)的机制不同,Istio 允许在应用程序层注入故障.这使得可以注入更多相关的故障,比如 HTTP 错 ...

  6. openGL官方Glut库配置教程

    在配置前要先安装好Visual Stdio环境 官方下载网站 注:一台Windows操作系统中可以存在多版本的Visual Stdio,多个版本之间互不干扰但不共享插件库,且高版本向下兼容,因此笔者更 ...

  7. “知疫”疫情防控可视化平台——NABCD分析

    "知疫"疫情防控可视化平台 项目 内容 这个作业属于那个课程 2021春季学期软件工程(罗杰.任健) 这个作业的要求在哪里 初次邂逅,需求分析 1 NABCD分析 NEED 目前多 ...

  8. 翻译:《实用的Python编程》09_02_Third_party

    目录 | 上一节 (9.1 包) | 下一节 (9.3 版本分发) 9.2 第三方模块 Python 拥有一个包含各种内置模块的大型库(自带电池(batteries included))(译注:&qu ...

  9. Unity2D项目-平台、解谜、战斗! 1.5 Player框架、技能管理组件

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 前文提到,凡是有"攻击"语义的对象,在游戏中,我们给予其一个"CanFight"组件予 ...

  10. vim与系统剪贴版的交互

    1 概述 vim中的复制,删除,替换(d,r,s,x,y等)的内容都会被保存到默认的未命名的寄存器中,之后可以通过p进行粘贴,但是,这个寄存器不是系统的剪贴版,很多时候需要vim与系统剪贴版的交互,那 ...