为何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
相关产品推荐
相关产品推荐

