You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何spdlog在Python异步函数中无日志输出?

问题解决:spdlog无日志输出的修复方案

修正后的代码

import asyncio
import spdlog as spd

# 全局初始化日志器,避免在异步任务中重复创建
logger = spd.DailyLogger(name='B', filename='B.log', hour=0, minute=0, async_mode=True)
logger.set_level(spd.LogLevel.INFO)
# 设置每次INFO级别日志后自动刷新缓冲区
logger.flush_on(spd.LogLevel.INFO)

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

async def B():
    while True:
        logger.info('B')
        await asyncio.sleep(1)

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

问题原因及说明

  • 日志器初始化时机问题:原代码在异步任务B内创建日志器,spdlog的日志器是按名称全局管理的,在异步任务中初始化可能引发内部状态冲突。将日志器移到全局初始化,确保只创建一次,避免异常。
  • 缓冲区未及时刷新:spdlog的文件输出默认使用内存缓冲,日志内容不会立即写入文件。通过flush_on(spd.LogLevel.INFO)配置,让每次INFO级日志输出后自动刷新缓冲区,保证日志实时落地。
  • 异步模式适配:开启async_mode=True时,需确保日志器在事件循环启动前完成初始化,避免异步环境下的资源竞争。即使关闭异步模式,同样需要处理缓冲区刷新——你的程序是无限循环,若不主动刷新,日志会一直留在内存中,不会写入文件。

额外验证点

  • 检查当前工作目录下是否生成B.log文件,可通过from pathlib import Path; print(Path('B.log').exists())确认。
  • 若问题仍存在,升级spdlog到最新版本:pip install --upgrade spdlog-python

内容的提问来源于stack exchange,提问作者river7816

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:37:45