首页 > 编程问答 >为什么 spdlog 不在异步函数中打印

为什么 spdlog 不在异步函数中打印

时间:2024-08-01 16:20:51浏览次数:17  
标签:python asynchronous logging spdlog

import asyncio
from pathlib import Path
import spdlog as spd
import asyncio
import logging

async def A():
    asyncio.create_task(B())
    while True:
        await asyncio.sleep(1)

async def B():
    logger = spd.DailyLogger(name = 'B', filename = 'B.log', hour = 0, minute = 0, async_mode=True)
    logger.set_level(spd.LogLevel.INFO)
    # logging.basicConfig(level=logging.INFO, filename='B.log', filemode='w')
    # logger = logging.getLogger('B')
    while True:
        logger.info('B')
        await asyncio.sleep(1)


if __name__ == "__main__":
    asyncio.run(A())

首先,我创建了一个任务 B inside A ,每秒打印一行 B 当我使用Python的默认日志记录时,一切正常,但使用C++的spdlog时,无论我启用 async_mode 或不启用,都没有输出。

我尝试禁用 async_mode ,还是一样


你观察到的行为是 Python 的异步特性和 spdlog 库之间交互方式的结果。 尽管 spdlog 提供了 async_mode 选项,但它并不会使日志记录操作本身异步化。 它主要影响 spdlog 内部如何处理日志消息的 队列

在你的代码中,问题在于你是在一个无限循环中创建和使用 spdlog 日志器的 ( while True )。 发生这种情况时,日志器永远不会被垃圾回收,而且更重要的是,它的内部队列也永远不会被刷新到文件中。

要解决此问题,你需要确保在某个时刻刷新日志器或将其关闭。 以下是几种方法:

1. 使用 spdlog.shutdown()

这是最直接的方法。 在你的主异步函数退出之前,调用 spdlog.shutdown() 会刷新所有日志器并将消息写入磁盘:

import asyncio
from pathlib import Path
import spdlog as spd

async def A():
    asyncio.create_task(B())
    while True:
        await asyncio.sleep(1)

async def B():
    logger = spd.DailyLogger(name='B', filename='B.log', hour=0, minute=0, async_mode=True)
    logger.set_level(spd.LogLevel.INFO)
    while True:
        logger.info('B')
        await asyncio.sleep(1)

if __name__ == "__main__":
    asyncio.run(A())
    spdlog.shutdown()  # 在退出前刷新所有日志器

2. 定期刷新日志器:

你可以在循环内部定期手动刷新日志器。 这可以确保消息定期写入文件:

async def B():
    logger = spd.DailyLogger(name='B', filename='B.log', hour=0, minute=0, async_mode=True)
    logger.set_level(spd.LogLevel.INFO)
    while True:
        logger.info('B')
        logger.flush()  # 刷新日志器以写入消息
        await asyncio.sleep(1)

3. 使用上下文管理器:

你可以使用 spdlog 的上下文管理器来自动处理刷新。 这可以确保在退出上下文时刷新日志器:

async def B():
    with spd.DailyLogger(name='B', filename='B.log', hour=0, minute=0, async_mode=True) as logger:
        logger.set_level(spd.LogLevel.INFO)
        while True:
            logger.info('B')
            await asyncio.sleep(1)

请记住,虽然 async_mode=True 可以通过将日志操作卸载到单独的线程来提高性能,但在你的情况下,主要问题是缺少刷新机制。 选择最适合你需求的方法。

标签:python,asynchronous,logging,spdlog
From: 78819757

相关文章

  • 为什么Python库中还没有Gauss-Jordan消去函数?
    Gaussian-Jordan消除法是一种常用且方便的技术。在矩阵计算中,该方法得到广泛应用。但是,Python库中没有此方法的内置函数。设计这样的功能并不困难。开发人员似乎忽略了这个功能。这可能是什么原因?希望开发者能够重视这一点,并开发与该方法相关的功能。虽然高斯-约旦消元......
  • Python爬虫 - js逆向之扣出某平台的_signature加密字段
    前言好久没有做逆向案例分析了,最近都在看同行朋友写好的案例,感觉学到很多,算是取长补短了不多bb,机缘巧合下,拿到个目标网站分析首先抓个包,就看到请求参数里带着这几个参数主要就是_signature了,其他的参数都不重要得想必你一看就知道啥意思了。行,开始分析_signature......
  • python 音频处理(1)——重采样、音高提取
    采集数据->采样率调整使用torchaudio进行重采样(cpu版)首先导入相关包,既然使用torch作为我们的选项,安装torch环境我就不必多说了,如果你不想用torch可以使用后文提到的另一个库1importtorch2importtorchaudio3fromtorchaudio.transformsimportResample4fromtime......
  • 用于从连接到 LAN 交换机的四个 Arduino 扩展板读取/保存数据的 Python 代码
    我有四个Arduino扩展板连接到LAN交换机。每个人都会发出一条“HelloJane”消息。LAN交换机已连接到我的PC。我需要将每个Arduino的数据/消息保存在PC上的单独文件夹中。请帮助使用Python脚本/代码。我能够看到来自所有四个Arduino的消息,但无法将它们保存到文......
  • 使用 Python 生产者和消费者在 Kubernetes minikube 上设置 Kafka Kraft
    我正在尝试从kubernetes集群外部连接到kubernetesminikubekafkapod。服务器启动没有任何问题,但我无法设法将本地kafka生产者/消费者连接到外部kafkapod。在集群内的kafka服务器映像上,我将bootstrap-server设置为:bin/kafka-topics.sh--create--bootst......
  • python llama_index.indices.list.retrievers 导入错误
    fromllama_indeximportGPTListIndexfromllama_index.indices.list.retrieversimportListIndexLLMRetrieverdocuments=SimpleDirectoryReader('./data').load_data()index=GPTListIndex.from_documents(documents,service_context=service_context)r......
  • 如何使用 python 和 bs4 修复抓取 web 表输出 csv
    请帮帮我,,我想在“td”、“Barcode”和“namaproduk”中获取2个数据,但我得到的数据非常糟糕。我应该修复什么?importcsvimportrequestsfrombs4importBeautifulSoupoutfile=open("dataaa.csv","w",newline='')writer=csv.writer(outfile)page=0whilepag......
  • 基于Django的超市小程序+47822(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小
    基于django超市小程序摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,超市小程序被用户普遍使用,为方便用户能够可以随时进行超市小程序的数据信息管理,特开发了基于djan......
  • 【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管
    随着信息技术的迅猛发展,传统的医院挂号管理方式面临着效率低下、排队时间长、信息不对称等诸多问题。这些问题不仅影响患者的就医体验,也加重了医院工作人员的负担。在此背景下,基于Python的医院挂号管理系统应运而生。该系统旨在通过信息化手段优化挂号流程,提高管理效率,提升医疗......
  • Python-PLAXIS自动化建模技术与典型岩土工程
    原文链接:Python-PLAXIS自动化建模技术与典型岩土工程https://blog.csdn.net/2301_78164062/article/details/140607885?spm=1001.2014.3001.5501一:Plaxis软件及PlaxisPythonAPI环境搭建1、Plaxis2D\Plaxis3D软件2、面向对象编程语言Python及其开发环境Spyder3、Plaxis输......