在我们的异常检测应用中,需要对每组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. bjd_ctf

    1.抓包修改 ​ 提示修改id,postman修改headers里面的id 分析得到id是admin加admin的base64编码,payload为id: adminYWRtaW4= 请求后又提示请使 ...

  2. ES6学习笔记(4)- 解构

    一.解构的意义 二.对象解构 三.数组解构

  3. 2019 GDUT Rating Contest III : Problem E. Family Tree

    题面: E. Family Tree Input file: standard input Output file: standard output Time limit: 1 second Memory ...

  4. Spring 声明式事务与编程式事务详解

    本文转载自IBM开发者论坛:https://developer.ibm.com/zh/articles/os-cn-spring-trans 根据自己的学习理解有所调整,用于学习备查. 事务管理对于企 ...

  5. 攻防世界 resver catch-me

    catch-me asis-ctf-quals-2016 附件给了个压缩包文件,重命名,解压,获取到elf文件 程序有两处关键比较 第一处: 这里进行动态调试,得到v3=0xB11924E1, byt ...

  6. Mysql之索引选择及优化

    索引模型 哈希表 适用于只有等值查询的场景,Memory引擎默认索引 InnoDB支持自适应哈希索引,不可干预,由引擎自行决定是否创建 有序数组:在等值查询和范围查询场景中的性能都非常优秀,但插入和删 ...

  7. JS中dom操作的事件

    Click--点击事件 优先级:dom.onclick 高于标签上的onClick属性 监听事件 --不会覆盖前面的事件效果 dom.addEventListener()    括号里面有三个参数 1 ...

  8. $(( )) 与 $( ) 还有${ } 差在哪?-- Shell十三问<第八问>

    $(( )) 与 \(( ) 还有\){ } 差在哪?-- Shell十三问<第八问> 我们上一章介绍了 ( ) 与 { } 的不同,这次让我们扩展一下,看看更多的变化:$( ) 与 \( ...

  9. 给我一个shell我能干翻你内网

    0x00 前言 在去年小菜鸡学了点内网知识就闲着没事跑点jboss的站看看,在经历过很多次内网横向失败之后终于算是人生圆满了一把,阿三的站一般进去之后很难横向,不知道是不是我太菜的原因,反正阿三的站能 ...

  10. java面试-谈谈你对OOM的理解

    一.OOM(OutOfMemoryError): 对象无法释放或无法被垃圾回收,造成内存浪费,导致程序运行速度减慢,甚至系统崩溃等严重后果,就是内存泄漏.多个内存泄漏造成可使用内存变少,会导致内存溢出 ...