基于queue的python多进程日志管理
在我们的异常检测应用中,需要对每组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多进程日志管理的更多相关文章
- 【Python】 日志管理logging
logging *****本文参考了http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html ■ 最最基本的用法 logging模块用 ...
- Python logging日志管理
import logging logger = logging.getLogger("simple_example") logger.setLevel(logging.DEBUG) ...
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- python中日志logging模块的性能及多进程详解
python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...
- python+pytest接口自动化(15)-日志管理模块loguru简介
python自带日志管理模块logging,使用时可进行模块化配置,详细可参考博文Python日志采集(详细). 但logging配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理, ...
- Python 多进程编程之 进程间的通信(在Pool中Queue)
Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...
- Python 多进程编程之 进程间的通信(Queue)
Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...
- spring+mybatis基于 AOP实现业务日志管理
最近在项目上用到了操作日志的相关,之前的解决方案就是自己写一个日志project,然后统一调用日志接口即可,这样方便自定义定制,因为有很多设备控制之类的都是需要确认一下的,但是,对数据的操作,比如,增 ...
- python selenium2示例 - 日志管理
logger继承图 前言 在自动化测试实践过程中,必不可少的就是进行日志管理,方便调试和生产问题追踪,python提供了logging模块来进行日志的管理.下面我们就logging模块的学习和使用进行 ...
随机推荐
- RabbitMQ镜像队列集群搭建、与SpringBoot整合
镜像模式 集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失,在实际工作中也是用的最多的,并且实现集群比较的简单. Mirror镜像队列,目的是为了保证 RabbitMQ 数据的高可靠 ...
- JAVA-常用集合类型转换例子
package com.net.xinfang.reflect; import java.util.ArrayList; import java.util.Arrays; import java.ut ...
- 在linux系统中登录mysql时出现Enter password: ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)的解决办法
在一次使用mysql数据库是出现了这种错误,于是乎去百度看了很多博文踩了很多坑,最终解决了问题,分享给大家. 转载与:https://blog.csdn.net/css33/article/detai ...
- PTA 输出数组元素
7-3 输出数组元素 (15 分) 本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果. 输入格式: 输入的第一行给出正整数n(1).随后一行给出n个整 ...
- 攻防世界 maze NJUPT CTF 2017
迷宫题 1 __int64 __fastcall main(__int64 a1, char **a2, char **a3) 2 { 3 signed __int64 mid_i; // rbx 4 ...
- 基于react hooks,zarm组件库配置开发h5表单页面
最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...
- Istio 故障注入之延时(fixedDelay)
Istio 故障注入 Istio 故障注入与其他在网络层引入错误(例如延迟数据包或者直接杀死 Pod)的机制不同,Istio 允许在应用程序层注入故障.这使得可以注入更多相关的故障,比如 HTTP 错 ...
- java面试-垃圾回收器谈谈你的理解
一.垃圾回收算法: 引用计数 复制算法 标记-清除 标记-整理 二.垃圾回收的方式: 串行(Serial).并行(Parallel).并发(CMS).G1 1.串行垃圾回收器(Serial) 它为单线 ...
- 编程相关术语(Python)
1. 程序的组成 程序 (program):(1)由一系列定义计算机如何执行计算的指令组成.(本质) (2)程序(算法)由对象.表达式和语句组成.(元素) 1.1程序的指令类型 输入 (input): ...
- Sentinel上生产环境只差一步,监控数据持久化
之前介绍了Sentinel相关的文章,小伙伴在生产实践中不知道有没有这个疑问?我们的Sentinel控制台监控的数据只能看最近5分钟的,如图 那么就导致历史数据是查看不了的,那肯定是不行的,在生产环境 ...