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

