Python多进程记录日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:   用gevent(或封装了gevent的gunicore)启动python进程,会出现多个独立进程同时写一个日志文件, 可以观察到有日志部分丢失:一个进程日志没写完,另一个进程把日志覆盖在同一行的后面;有些日志甚至完全丢失。

 

用gevent(或封装了gevent的gunicore)启动python进程,会出现多个独立进程同时写一个日志文件,

可以观察到有日志部分丢失:一个进程日志没写完,另一个进程把日志覆盖在同一行的后面;有些日志甚至完全丢失。

用mlogging包可以解决多进程写日志的问题,没有发现不完整的日志,是否丢失日志有待进一步检测。

下面是一个在python程序中记录重要信息,以便以后解析统计的函数

 

 

# -*- coding: utf-8 -*-

import os.path
import logging
from mlogging import FileHandler_MP, TimedRotatingFileHandler_MP
from functools import partial


class LevelFilter(logging.Filter):

    def __init__(self, level, *args, **kwargs):
        #super(LevelFilter, self).__init__(*args, **kwargs)
        self.level = level

    def filter(self, record):
        return record.levelno == self.level


def init_info_logger(name, logging_dir):
    logging_file = os.path.join(logging_dir, name+".log")
    handler = TimedRotatingFileHandler_MP(logging_file, "midnight", 1)
    handler.setFormatter( logging.Formatter(
        "%(asctime)s %(levelname)-8s %(name)-20s %(message)s", #设置日志格式,固定宽度便于解析
        datefmt = "%Y-%m-%d %H:%M:%S" #设置asctime时间格式
    ))
    handler.suffix = "%Y%m%d"
    #只记录INFO级别信息,抛弃上面的WARNING、ERROR、CRITICAL几个级别
    handler.addFilter( LevelFilter(logging.INFO) )

    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)
    #有些Python版本会报错KeyError,找不到clientip或user,这里用一个短横(-)做默认值
    extra={"clientip":"-", "user":"-"}
    #exc_info是出错时的Debug详细回溯信息,这里禁止记录,只记录错误信息这一行
    setattr(logger, "info", partial(logger.info, exc_info=False, extra=extra))
    logger.addHandler( handler )
    return logger


def init_error_logger(logging_dir):
    logging_file = os.path.join(logging_dir, "errors.log")
    handler = FileHandler_MP(logging_file)
    handler.setFormatter( logging.Formatter(
        "%(asctime)s %(levelname)-8s %(message)s", #设置日志格式,固定宽度便于解析
        datefmt = "%Y-%m-%d %H:%M:%S" #设置asctime时间格式
    ))

    logger = logging.getLogger()
    logger.setLevel(logging.WARNING)
    #有些Python版本会报错KeyError,找不到clientip或user,这里用一个短横(-)做默认值
    extra={"clientip":"-", "user":"-"}
    #exc_info是出错时的Debug详细回溯信息
    setattr(logger, "critical", partial(logger.critical, exc_info=True, extra=extra))
    setattr(logger, "error", partial(logger.error, exc_info=True, extra=extra))
    setattr(logger, "warning", partial(logger.warning, exc_info=True, extra=extra))
    logger.addHandler( handler )
    return logger


if __name__ == "__main__":
    logger = init_info_logger("test", "./")
    logger.debug("低级别的DEBUG,不会记录。")
    logger.info("哈哈哈,这才是我想要的信息,请记下来。")
    logger.error("高级别的ERROR,也被过滤掉。")
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
18天前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
135 0
|
3月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
6月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
186 23
|
7月前
|
API 开发工具 Python
|
8月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
393 0
|
11月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
11月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
11月前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
614 1
|
11月前
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
164 0

推荐镜像

更多