解决loguru在multiprocessing并发场景下子线程日志无法记录到文件问题

Python 日志库对比:Loguru 0.7.2 与标准 logging 模块的 5 点核心差异 本文深入对比了Python日志库Loguru 0.7.2与标准logging模块的5点核心差异,包括配置复杂度、异常追踪、结构化输出、多进程支持和性能表现。通过实测数据和场景分析,帮助开发者根据项目需求做出更精准的技术选型,特别适合需要高效日志管理模块的中高级Python开发者。 阅读详情
AI摘要

本文介绍在Python多进程中正确配置日志记录的方法,包括通过logger对象传递和使用multiprocessing的context来确保日志在不同操作系统下的兼容性。

logger对象在创建时必须从父进程传递给子进程才能记录日志,有两种传递方式:

第一种:通过类定义一个日志变量,然后外部传入logger对象来记录日志。

# workers_a.py
class Worker:

    _logger = None

    @staticmethod
    def set_logger(logger_):
        Worker._logger = logger_

    def work(self, x):
        self._logger.info("Square rooting {}", x)
        return x**0.5

第二种:通过将logger对象定义为全局变量来记录日志。

# workers_b.py
from loguru import logger

def set_logger(logger_):
    global logger
    logger = logger_

def work(x):
    logger.info("Square rooting {}", x)
    return x**0.5

在主程序中调用方式如下:

# main.py
from multiprocessing import Pool
from loguru import logger
import workers_a
import workers_b

if __name__ == "__main__":
    logger.remove()
    logger.add("file.log", enqueue=True)

    worker = workers_a.Worker()
    with Pool(4, initializer=worker.set_logger, initargs=(logger, )) as pool:
        results = pool.map(worker.work, [1, 10, 100])

    with Pool(4, initializer=workers_b.set_logger, initargs=(logger, )) as pool:
        results = pool.map(workers_b.work, [1, 10, 100])

    logger.info("Done")

上面通过multiprocessing 中的Pool创建线程池可记录多线程执行日志。(测试正常执行)上面日志配置时需要把 enqueue=True 放开。

 但是上面有个问题:linux系统下的python线程并发与windows环境下的python线程并发调用方式不相同。linux下会通过fork创建,windows是通过spawn拷贝创建。为了避免在windows系统下运行正常的代码在linux系统下出问题,需要借助multiprocessing 的context。代码如下:

import multiprocessing
from loguru import logger
import workers_a

if __name__ == "__main__":
    context = multiprocessing.get_context("spawn")

    logger.remove()
    logger.add("file.log", enqueue=True, context=context)

    worker = workers_a.Worker()
    with context.Pool(4, initializer=worker.set_logger, initargs=(logger, )) as pool:
        results = pool.map(worker.work, [1, 10, 100])

更详细内容可参考下面地址:Compatibility with multiprocessing using enqueue argument.

Python日志增强工具LogUtils核心功能与实战应用 日志系统是软件开发中关键的观测性组件,Python标准库logging模块提供了基础的日志功能。在实际工程中,开发者常需要更强大的网络日志、队列日志等高级特性。LogUtils作为logging模块的增强工具包,通过SocketHandler的自动重连机制、QueueHandler的跨版本兼容等特性,有效解决了分布式系统中的日志收集、多进程日志等场景需求。该项目特别适合需要在Python 2/3环境中使用现代日志功能的开发者,其网络日志性能相比标准库提升33%,是构建集中式日志系统的理想选择。 阅读详情

相关推荐

告别手动转换!用Python脚本+convertToRinex批量处理Trimble GNSS数据(附完整代码)

本文介绍如何利用Python脚本结合convertToRinex工具实现Trimble GNSS数据的批量自动化处理,显著提升测绘工作效率。通过完整的代码示例和实战指南,帮助用户快速构建健壮的自动化流水线,解决传统手动操作中的时间成本高、错误率高等问题,适用于大规模GNSS数据处理场景。

weixin_30608503的博客 326

python日志记录loguru模块

python日志记录loguru模块 在项目的编写的过程中,需要部署一些定时运行或者长期运行的任务时,为了留存一些导致程序出现异常或错误的信息,通常会采用日志的方式来进行记录这些信息。 在python中用到日志记录,那就不可避免地会用到内置的logging标准库。虽然logging库采用的是模块化设计,你可以设置不同的handler来进行组合,但是在配置上通常较为繁琐;而且如果不是特别处理,在一些多线程或多进程的场景下使用 logging还会导致日志记录会出现错乱或是丢失的情况。 但有这么一个库,它不仅能够

lhbo_bo的博客 802

Uvicorn启动流程深度解析:从应用初始化到服务稳定部署实战

在Web服务部署中,应用启动阶段是服务生命周期中最关键的环节之一,它直接决定了服务的可用性和稳定性。从技术原理上看,现代Python异步Web框架(如FastAPI)通过Uvicorn ASGI服务器启动时,会经历进程初始化、配置加载、生命周期事件触发等核心步骤。其中,应用启动事件(Lifespan Startup)的执行尤为关键,它负责数据库连接、缓存初始化等资源的准备工作。这一阶段的技术价值在于确保所有依赖服务就绪,避免运行时出现连接失败或资源竞争问题。在实际应用场景中,尤其是在Windows服务器部署

weixin_30740295的博客 373

关于loguru一次错误排查记录

在做个性化推荐接口性能测试时,当并发量达到一定量级的情况下,系统会崩溃。loguru 的 logger.add() 方法中,enqueue 参数是一个布尔值,用于指定是否异步地写入日志。当enqueue为True时,这种异步日志记录涉及到进程间通信(IPC),loguru 使用了队列(来自 multiprocessing 模块)来在主程序和日志记录线程之间传递日志消息。

清风徐来 1618

当兵心理测试软件,当兵心理测试题及答案

心理测试是一种比较先进的测试方法,它是指通过一系列手段,将人的某些心理特征数量化,来衡量个体心理因素水平和个体心理差异差异的一种科学测量方法。小编为你整理了当兵心理测试题及答案,希望对你有所参考帮助。征兵心理测试题(1代表是2代表否)1、我的胃口很好。12、我早上起来的时候,多半觉得睡眠充足,头脑清醒13、我喜欢看报纸上的犯罪新闻。14、有时我常感到困难重重,无法克服。25、我时常遇见一些所谓的专...

weixin_42128393的博客 1万+

C#:WPF格式转Winform格式

WPF格式转Winform格式

Hello C++ 1295

Python multiprocessing.Pool 中使用 logger

Python multiprocessing.Pool 中使用 logger 问题 由于 python 中使用多进程时, 需要将参数进行序列化和反序列化, 所有 logger 参数通常无法正确传入工作函数中, 同时一般也不建议直接将 logger 对象作为参数传入到多进程中. 那么如何解决在多进程 workder 函数中打印日志呢? 解决思路 在每个 worker 函数中创建独立的 logger ...

Bear_861110453的专栏 2317

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下...

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下 CT Image with Window presets This is an example of displaying a ct image along with buttons to set ww/wc pres...

浩秦的博客 1842

Python-在多进程中使用logger对象

Python-多进程中使用logger对象 多进程中使用logger对象,为了记录进程执行时的相关信息,肯定要在进程片段中创建logger对象。 示例代码如下: #!/usr/bin/bash # -*-coding: utf-8 import logging import os from multiprocessing import Pool, cpu_count def parallel_run(count): logger = logging.getLogger("test")

StarStudyStart的博客 2666

EDEM基础操作指南

EDEM(Enhanced Discrete Element Method)是一种用于模拟颗粒物料行为的软件工具。它可以模拟颗粒的碰撞、流动、堆积等过程,广泛应用于颗粒物料工程、振动筛分、堆垛机械、矿山开采等领域。本文将介绍EDEM的基础操作步骤,并提供相应的源代码示例。以上是EDEM的基础操作步骤。通过创建EDEM项目、定义颗粒材料、导入几何模型、设置边界条件、创建颗粒流场和运行模拟,您可以开始模拟颗粒物料的行为并进行相应的分析和优化。请根据您的具体需求和场景进行相应的参数设置和功能调用。

TrDelphi的博客 5295

一文搞懂多速率信号处理中信号插值的本质:从插 0、插原值到线性插值!

信号插值在数字信号处理中经常被使用,但“插值”背后究竟发生了什么,却常被忽略。插0、插原值、线性插值看似只是不同的实现方式,实则对应着完全不同的频域效应与滤波特性。本文将结合公式与MATLAB仿真,深入剖析插0、插原值与线性插值三种典型策略的本质区别。

m0_66360845的博客 923

python中多线程+多进程+logging出现子进程死锁的问题

参考文档: https://www.ctolib.com/topics/85107.html https://twiki.cern.ch/twiki/bin/view/Main/PythonLoggingThreadingMultiprocessingIntermixedStudy https://github.com/google/python-atfork 服务采用多线程+ 多进程+ ...

深海微澜 4104

1. SAP Fiori Elements 开发环境的搭建和开发准备工作

本文介绍了本地使用 Visual Studio Code 进行 Fiori Elements 开发所需要安装的这个扩展包里6个能够提高 Fiori Elements 应用开发效率的扩展。在本教程后续步骤里我们会通过实际的例子介绍这些 Visual Studio Code 扩展的详细用法。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3455

Python并发日志记录的革命:Loguru如何确保线程与进程安全

在当今高并发应用开发中,日志记录系统面临着前所未有的挑战。当多个线程同时写入日志文件、异步任务快速执行、多进程并行处理时,传统的Python日志模块常常导致数据丢失、文件损坏或日志混乱。Loguru作为Python日志记录的革新者,通过智能设计彻底解决了这些并发安全问题,让开发者在复杂的并发环境中也能安心使用日志功能。 **核心关键词**:Loguru并发日志、线程安全日志、进程安全日志、异步日

gitblog_01099的博客 783

OpenClaw部署太难?汉化版+中文社区+国产替代品,国内用户零门槛指南

OpenClaw作为GitHub 10万+星的开源AI助手平台,近期在国内AI圈备受关注 🌟 但部署难度和英文界面让很多用户望而却步。本文整理了针对国内用户的友好资源和简便替代方案,帮助国内用户零门槛上手AI助手工具 🚀

XiaoqiangClub的博客 5758

嵌入式模拟电路面试题大全及参考答案(持续更新)

高输入阻抗:由于晶体管的基极-发射极(BJT)或栅极-源极(MOSFET)电压很低,跨导放大器具有很高的输入阻抗。低输出阻抗:晶体管的集电极-发射极或漏极-源极电阻较低,提供较低的输出阻抗。电压控制:输入信号控制晶体管的跨导,从而控制输出电流。晶体管:作为放大器的核心,可以是BJT或MOSFET。偏置电路:为晶体管提供稳定的工作点,确保其在放大区域内工作。负载电阻:与晶体管的集电极或漏极连接,将电流转换为电压。晶体管的选择:根据所需的增益、速度和功率消耗选择合适的晶体管。偏置稳定性。

大模型大数据攻城狮的专栏 989

Loguru并发日志记录指南:在多线程与异步环境中安全使用日志

在Python应用开发中,日志记录是调试和监控的重要工具。然而,当你的应用涉及多线程、多进程或异步编程时,传统的日志记录方式可能会遇到线程安全问题。Loguru作为Python日志记录的革新者,通过智能设计确保了线程安全和进程安全,让开发者在复杂的并发环境中也能安心使用日志功能。 ## 为什么并发环境需要特殊的日志处理? 想象一下这样的场景:你的Web服务器同时处理数百个请求,每个请求都在独立

gitblog_00274的博客 815

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Loguru并发日志实战:多线程与异步环境下的安全日志配置指南

在当今的Python应用开发中,并发编程已成为常态。无论是Web服务器处理海量并发请求,还是数据处理管道中的多进程并行计算,都需要可靠的日志系统来追踪程序状态。Loguru作为Python日志库的革新者,通过其智能的并发安全设计,让开发者在多线程和异步环境中也能轻松实现可靠的日志记录。 ## 并发日志的核心挑战与Loguru解决方案 在多线程环境中,多个线程同时写入日志文件可能导致数据竞争和日

gitblog_00674的博客 371

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

实战指南:Loguru多线程与异步日志的并发安全深度解析

在Python并发编程中,日志记录是系统稳定性的关键环节。Loguru通过智能设计确保了线程安全和进程安全,让开发者在复杂的并发环境中也能安心使用日志功能。本文将深入探讨Loguru在多线程、多进程和异步环境中的安全机制,并提供实际应用的最佳实践方案。 ## 为什么并发日志需要特别关注? 在多线程应用中,多个线程同时写入日志文件可能导致消息丢失、文件损坏或日志内容错乱。多进程环境更加复杂,每个

gitblog_00993的博客 279

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

解锁Python并发日志的3个简单技巧:告别多线程混乱

你是否曾经在Python多线程应用中遇到过日志混乱的问题?当几十个线程同时向同一个日志文件写入时,日志内容交错、丢失、甚至文件损坏的情况时有发生。**Loguru**作为Python日志记录的智能解决方案,让并发日志记录变得异常简单可靠。 ## 当100个线程同时写日志会发生什么? 想象一下这样的场景:你的Web服务器正在处理100个并发请求,每个请求都需要记录访问日志、错误信息和性能指标。传

gitblog_00178的博客 464

Loguru实战:深度解析多线程与异步日志的线程安全与进程安全最佳实践

在当今高并发的Python应用开发中,日志记录系统的线程安全和进程安全已成为确保系统稳定性的关键要素。Loguru作为Python生态中备受推崇的日志库,通过其创新的队列机制和进程隔离设计,为开发者提供了简单而强大的并发日志解决方案。本文将深入分析Loguru在多线程和异步环境下的安全机制,并分享实际应用中的最佳实践。 ## 技术挑战分析:并发日志记录的核心痛点 在并发编程环境中,传统的Pyt

gitblog_00704的博客 274

python标准库、threading、multiprocessing、aiomultiprocess、进程/线程 同步、queue(队列)

multiprocessing 包提供了本地和远程并发操作,通过使用子进程而非线程有效地绕过了全局解释器锁。 因此,multiprocessing 模块允许程序员充分利用给定机器上的多个处理器。

freeking101的博客 2万+

Python日志库深度对比:从logging到Loguru与structlog的选型指南

日志记录是软件开发中的基础概念,用于追踪程序执行状态、调试问题和监控系统运行。其核心原理是通过不同级别的消息记录,将程序内部状态以结构化或非结构化的形式输出到控制台、文件或远程服务。在Python生态中,标准库的logging模块提供了高度可配置的日志系统,但配置复杂度较高。随着应用场景从单体脚本扩展到分布式系统,对日志的需求也从简单的调试输出演变为需要支持结构化、机器可读的日志数据,以便于使用ELK等日志分析平台进行聚合和查询。这催生了像Loguru这样以零配置和友好API著称的库,以及专为结构化日志设计

weixin_30655569的博客 458

Loguru 常见问题与故障排查完全指南:从配置陷阱到源码级排错

Loguru 以"开箱即用"的设计让 Python 日志变得简单,但正因为其全局单例 logger 与自动初始化的特性,使用者在切换配置、多进程部署、自定义格式化时常常踩坑。本文以 [docs/resources/troubleshooting.rst](https://link.gitcode.com/i/8b4b398302e615ad711eac67bc292111) 为骨架,逐条解析 Lo

gitblog_00935的博客 332

Celery 应用日志配置解析:celery.app.log 模块源码级指南

Celery 作为分布式任务队列,其 worker、beat、命令行工具等进程的运行状态与任务执行过程都需要完善的日志支撑。`celery.app.log` 模块正是 Celery 实例(`Celery.log`)的日志子系统:它负责为 worker 及其他程序配置日志、重定向标准输出、为日志着色、修补与日志相关的兼容性问题。本文以该模块为绝对主线,结合同仓库的默认配置([celery/app/d

gitblog_00410的博客 215

Python常用内置模块详解与实战应用

Python标准库作为'自带电池'的设计理念体现,提供了丰富的内置模块覆盖系统操作、数据处理、网络通信等核心功能。os模块实现跨平台文件路径处理,json模块解决数据序列化问题,datetime模块处理时间日期运算,这些基础工具模块构成了Python开发的技术基石。通过模块化设计,开发者能快速构建文件管理系统、实现API数据交互、完成定时任务调度等常见场景。本文以os.path标准化路径、json自定义编码器为例,展示如何利用Python模块化特性提升开发效率,同时规避pickle安全风险等常见陷阱。

weixin_33782386的博客 417
上一篇: ubuntu-24.04系统静态Mac和IP配置
下一篇: Cursor怎样设置中文
dkgee
博客等级 码龄14年 43粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值