Python Logoru介绍


loguru 是一个非常方便且功能强大的 Python 日志库,能让日志记录变得简单和直观。

主要特点

  1. 简单易用:相比于内置的 logging 模块,loguru 的 API 更加简洁,易于使用。
  2. 自动化:自动处理日志格式、文件管理、异常捕获等。
  3. 灵活配置:支持多种输出格式、文件轮转、过滤器等高级功能。
  4. 多线程安全:支持多线程和异步应用程序的日志记录。
  5. 丰富的功能:支持丰富的日志级别、异常信息、上下文信息等。

基本用法

安装

可以通过 pip 安装 loguru

pip install loguru

引入

from loguru import logger

基本配置

logger.add("file.log", rotation="1 MB")  # 自动按文件大小轮转

日志级别

loguru 提供了多个日志级别,默认包含以下几种:

  • TRACE(0)
  • DEBUG(10)
  • INFO(20)
  • SUCCESS(25)
  • WARNING(30)
  • ERROR(40)
  • CRITICAL(50)

示例:

logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")

捕获异常

使用 logger 捕获异常时,可以输出详细的 traceback:

try:
    1 / 0  # 故意造成除以零错误
except ZeroDivisionError:
    logger.error("An error occurred:\n{}", traceback.format_exc())

日志文件管理

loguru 支持日志文件的轮转和压缩:

logger.add("file_{time}.log", rotation="1 day", retention="7 days", compression="zip")

这将每天创建一个新日志文件,保留 7 天,并将旧日志文件压缩为 ZIP 格式。

添加上下文信息

可以使用 logger.contextualize() 添加上下文信息:

with logger.contextualize(user="user1"):
    logger.info("User logged in")

这将使得日志信息中包含用户上下文。

高级功能

  1. 过滤器:可以根据日志级别或其他条件过滤日志输出。
logger.add("filtered.log", filter=lambda record: record["level"].name == "ERROR")
  1. 格式化:可以自定义日志的输出格式。
logger.add("formatted.log", format="{time} {level} {message}")
  1. 异步支持:在异步程序中使用 loguru 也非常简单。

总结

loguru 是一个功能强大且易于使用的日志库,适合各种规模的项目。无论是简单的脚本还是复杂的应用程序,它都能提供方便的日志记录功能。通过灵活的配置和强大的功能,loguru 可以帮助开发者轻松地处理日志记录任务。

<think>嗯,用户问的是关于Python的loguru库,如何让两个不同的logger分别写入不同的文件,并且在混用时不会出错。首先,我需要回忆一下loguru的基本用法。 Loguru通常使用默认的logger,也就是通过from loguru import logger来导入的那个。但是如果用户创建了两个不同的logger,每个logger需要写入不同的文件,这时候怎么保证它们不会互相干扰呢? 首先,用户可能已经知道如何添加handler,比如使用logger.add("file1.log")和logger.add("file2.log"),但这里的问题在于,如果创建了两个不同的logger实例,每个实例应该有自己的handler。这时候需要确认,在loguru中是否支持创建多个独立的logger实例,而不仅仅是使用默认的那个。 查一下loguru文档,发现loguru确实有一个Logger类,可以实例化多个独立的logger对象。例如,logger1 = Logger("logger1"),logger2 = Logger("logger2")。这样每个logger实例都有自己的handlers,不会互相影响。 接下来,用户可能会混淆使用这两个logger,比如在代码中交替调用logger1.info()和logger2.info()。这时候需要确保每个logger的handler都正确地指向不同的文件。关键点在于,每个logger实例在添加handler时,要指定不同的文件路径,并且确保没有跨logger的handler被添加。 可能的错误是用户可能误用了默认的logger,或者将handler添加到错误的logger实例上。例如,如果用户使用logger1.add("file1.log")和logger2.add("file2.log"),那么每个logger的日志信息只会发送到各自的文件中,因为它们属于不同的logger实例。 另外,还需要注意loguru的线程安全性。不过,loguru本身是线程安全的,所以即使混用不同的logger实例,在并发环境下也应该没有问题。但用户需要确保在添加handler时没有使用会引发冲突的参数,比如不同的enqueue设置可能导致问题,但通常默认设置就足够。 总结一下,正确的步骤应该是:创建两个不同的Logger实例,分别为每个实例添加不同的文件handler,然后在代码中调用对应的logger实例进行日志记录。这样即使混用,每个日志信息都会被发送到对应的文件中,不会交叉。 可能用户遇到的问题是没有正确创建独立的logger实例,而是复用了同一个,或者错误地配置了handler。这时候需要检查他们的代码,确认是否每个logger都是独立的实例,并且各自的handler正确添加到了不同的文件。 另外,还要提醒用户注意,默认的logger和自定义的logger是不同的实例,如果用户同时使用了默认logger和自己创建的,需要确保不会无意中将handler添加到默认logger上,导致日志重复或写入错误的文件。 最后,给出一个示例代码,展示如何正确创建两个logger实例,并分别添加handler,然后混用它们,验证日志是否写入正确的文件。这可以帮助用户更直观地理解如何操作。</think>在 Loguru 中实现多日志器写入不同文件并避免混淆的核心步骤如下: --- ### 一、问题本质 当使用 **两个独立日志器** 时,需确保每个日志器的**处理器(Handler)** 严格绑定到**专属文件路径**,并避免以下两种混淆: 1. **日志器实例混用**(错误调用不同日志器) 2. **处理器重叠绑定**(同一日志器同时写入多个文件) --- ### 二、解决方案(分步说明) #### 1. 创建两个独立的日志器对象 ```python from loguru import logger as default_logger from loguru import Logger # 创建两个完全独立的日志器实例 logger_a = Logger("logger_a") # 自定义名称便于调试 logger_b = Logger("logger_b") ``` #### 2. 为每个日志器绑定独立文件 ```python # logger_a 写入 a.log(清除原有配置避免继承默认logger) logger_a.remove() # 移除默认处理器(如果存在) logger_a.add("a.log", format="{message}", filter=lambda record: "logger_a" in record["extra"]) # logger_b 写入 b.log logger_b.remove() logger_b.add("b.log", format="{message}", filter=lambda record: "logger_b" in record["extra"]) ``` #### 3. 关键参数解释 - `filter=lambda...`:通过过滤器确保日志**仅被当前日志器的处理器捕获** - `remove()`:清除可能继承自默认日志器的全局配置 --- ### 三、正确混用示例 ```python # 混用时明确指定日志器对象 logger_a.info("This goes to a.log") # ✅ 写入 a.log logger_b.info("This goes to b.log") # ✅ 写入 b.log ``` --- ### 四、常见错误排查 | 错误现象 | 原因 | 修复方案 | |---------|------|---------| | 日志写入同一文件 | 未移除默认处理器或过滤器失效 | 检查 `remove()` 和 `filter` 配置 | | 部分日志丢失 | 处理器被多个日志器共享 | 确保每个日志器调用独立的 `add()` | | 抛出权限错误 | 文件被占用(如未关闭) | 使用 `rotation` 参数分割文件 | --- ### 五、高级场景 若需**动态切换日志器**,可通过上下文管理器隔离作用域: ```python from contextlib import contextmanager @contextmanager def use_logger(target_logger): import sys sys.stdout, sys.stderr = target_logger._handlers[0]._writer, target_logger._handlers[0]._writer yield sys.stdout, sys.stderr = sys.__stdout__, sys.__stderr__ with use_logger(logger_a): print("This will go to a.log") # ✅ 通过重定向实现 ``` --- ### 六、验证方法 运行后检查文件内容: ```bash cat a.log # 应只含 logger_a 的输出 cat b.log # 应只含 logger_b 的输出 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值