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

Loguru日志问题:如何让logger.error仅写入对应错误日志文件?

解决Loguru日志交叉写入问题

问题原因

你代码里的loggerEven = logger和loggerUneven = logger其实是同一个Loguru logger实例,调用add()添加的两个handler会被这个实例共享。当输出ERROR级日志时,因为Even.txt的级别是INFO(ERROR优先级高于INFO),所以这条日志会被两个handler同时处理,导致写入两个文件;而INFO级日志因为低于UnEven.txt的ERROR级别,只会被前者的handler处理。

解决方案

方案1:绑定标识+过滤器

通过bind()给不同的logger绑定专属标识,再给handler设置过滤器,只处理对应标识的日志:

from loguru import logger
import random

# 绑定even标识,仅处理带该标识的日志
loggerEven = logger.bind(log_type="even")
loggerEven.add(
    "Even.txt",
    mode='w',
    level="INFO",
    filter=lambda record: record["extra"].get("log_type") == "even"
)

# 绑定uneven标识,仅处理带该标识的日志
loggerUneven = logger.bind(log_type="uneven")
loggerUneven.add(
    "UnEven.txt",
    mode='w',
    level="ERROR",
    filter=lambda record: record["extra"].get("log_type") == "uneven"
)

x = random.randint(0, 11)
print(x)
if x % 2 == 1:
    loggerUneven.error("Uneven")
else:
    loggerEven.info("Even")

方案2:创建独立logger实例

用logger.new()创建全新的logger实例,每个实例的handler完全独立,不会共享:

from loguru import logger
import random

# 创建独立实例处理偶数日志
loggerEven = logger.new()
loggerEven.add("Even.txt", mode='w', level="INFO")

# 创建独立实例处理奇数日志
loggerUneven = logger.new()
loggerUneven.add("UnEven.txt", mode='w', level="ERROR")

x = random.randint(0, 11)
print(x)
if x % 2 == 1:
    loggerUneven.error("Uneven")
else:
    loggerEven.info("Even")

两种方案都能实现:ERROR日志仅写入UnEven.txt,INFO日志仅写入Even.txt,不会出现交叉写入的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:50:08