基于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模块的学习和使用进行 ...
随机推荐
- 一次线上MySQL主从延迟排查
今天早上来上班,发现zabbix一直告警主从延迟,mysql slave Seconds_Behind_Master (mysql.slave_status[Seconds_Behind_Master ...
- 08、元组tuple
元组(tuple) 是一个有序且不可变的容器,在里面可以存放多个不同类型的元素 元组是在最后多一个逗号,用于表示它是一个元组 tuple = (11,22,'阿斯顿','媚媚',) #后面多加一个逗号 ...
- 10 分钟轻松学会 Jackson 反序列化自动适配子类
作者:丁仪 来源:https://chengxuzhixin.com/blog/post/Jackson-fan-xu-lie-hua-zi-dong-shi-pei-zi-lei.html json ...
- 服务器安装部署-01-MySQL
1 MySQL 1.1 安装 在root用户权限下 # 创建mysql用户和用户组,同时禁止登陆 shell> groupadd mysql shell> useradd -r -g my ...
- Java 并发编程 Executor 框架
本文部分摘自<Java 并发编程的艺术> Excutor 框架 1. 两级调度模型 在 HotSpot VM 的线程模型中,Java 线程被一对一映射为本地操作系统线程.在上层,Java ...
- OxyPlot.SkiaSharp显示中文乱码的问题
oxyplot 图表控件功能强大,使用很广泛.最近考虑到性能使用OxyPlot.SkiaSharp替代OxyPlot.WPF,曲线图表初步测试,性能提升近10倍左右.基于SkiaSharp图形引擎的一 ...
- 快速了解 JavaScript ES2019 的五个新增特性
ES2019 规范是对 JavaScript 的一个较小的补充,但它仍然带来了一些有用的功能.本文将向你展示五个 ES2019 新增的特性,这些特性或许可以让你的编程轻松一点.这些特性包括 trimS ...
- element UI el-autocomplete 带输入建议的输入框
项目需求:需要用户在输入框中输入公司 全名 但是为了避免用户输入不全 需要做一个带输入建议的输入框 参考:https://www.jianshu.com/p/de922caf337c
- 自动化kolla-ansible部署openstack+GPU透传方法
自动化kolla-ansible部署openstack+GPU透传方法 欢迎加QQ群:1026880196 进行交流学习 1. CentOS7.x-8.x系列为虚拟机配置GPU直通 1. 编辑文件vi ...
- Day12_59_Java多线程
多线程 1. 什么是进程? * 每个进程是一个应用程序,都有独立的内存空间,一个进程对应一个应用程序. * 例如:在windows操作系统中启动了word就是启动了一个进程,一边听音乐,一边打游戏就是 ...