0

0

解决 Loguru 无法将 Python 错误输出到日志文件的问题

心靈之曲

心靈之曲

发布时间:2025-10-19 09:50:12

|

459人浏览过

|

来源于php中文网

原创

 解决 Loguru 无法将 Python 错误输出到日志文件的问题

<p>本文旨在解决 Python 中使用 Loguru 库时,程序错误(Exception)无法正常输出到日志文件,但能在终端正常显示的问题。我们将深入探讨 `sys.excepthook()` 的工作原理,并介绍如何使用 Loguru 提供的 `@logger.catch` 装饰器来捕获和记录未处理的异常,确保所有错误信息都能被正确记录到日志文件中。</p> 在使用 Loguru 进行日志记录时,有时会遇到一个令人困惑的问题:常规的日志信息可以同时输出到终端和日志文件,但当程序出现未处理的异常时,错误信息却只显示在终端,而没有被记录到日志文件中。 这通常是由于 Python 默认的异常处理机制与 Loguru 的日志记录机制之间的交互方式导致的。 ### 理解 Python 的默认异常处理 当 Python 程序遇到未被 `try...except` 块捕获的异常时,会触发默认的异常处理机制,即调用 `sys.excepthook()` 函数。 这个函数会将异常信息输出到 `sys.stderr`,通常情况下,`sys.stderr` 会被重定向到终端,因此我们能在终端看到错误信息。 然而,Loguru 默认情况下并不会自动捕获通过 `sys.excepthook()` 输出的错误信息。 它只负责记录程序中通过 `logger.debug()`, `logger.info()`, `logger.warning()`, `logger.error()`, `logger.critical()` 等方法显式记录的日志信息。 因此,未处理的异常信息不会被 Loguru 记录到日志文件中,导致了只在终端显示错误,日志文件却缺失错误信息的现象。 ### 使用 `@logger.catch` 捕获未处理的异常 Loguru 提供了一个方便的装饰器 `@logger.catch`,专门用于捕获未处理的异常并将其记录到配置的日志 sinks 中。 它的工作原理是在被装饰的函数外部包裹一个 `try...except` 块,当函数内部发生未处理的异常时,`except` 块会捕获该异常,并使用 Loguru 的 `logger.exception()` 方法记录异常信息。 以下是一个使用 `@logger.catch` 的示例: ```python from loguru import logger import sys logger.remove() # Remove default handler logger.add(sys.stdout, level="INFO") # Add stdout handler logger.add("error.log", level="ERROR") # Add file handler def divide(): return 1 / 0 # This will cause a ZeroDivisionError @logger.catch def main(): divide() if __name__ == "__main__": main()

在这个例子中,@logger.catch 装饰器被应用到了 main() 函数上。当 divide() 函数抛出 zerodivisionerror 异常时,@logger.catch 会捕获这个异常,并将其记录到所有配置的 sinks 中,包括终端(sys.stdout)和日志文件(error.log)。

运行这段代码后,你将在终端看到错误信息,同时 error.log 文件中也会包含完整的异常堆信息,从而实现了将所有错误信息都记录到日志文件的目的。

配置 Loguru 的 sinks

确保 Loguru 配置了正确的 sinks,以便将日志信息输出到所需的位置。 在上面的例子中,我们使用了以下配置:

  • logger.add(sys.stdout, level="INFO"): 将 INFO 级别及以上的日志信息输出到标准输出(终端)。
  • logger.add("error.log", level="ERROR"): 将 ERROR 级别及以上的日志信息输出到名为 "error.log" 的文件中。

你可以根据自己的需求配置不同的 sinks,例如:

Bolt.new
Bolt.new

Bolt.new是一个免费的AI全栈开发工具

下载
  • 输出到不同的文件,并设置不同的日志级别。
  • 使用不同的日志格式。
  • 使用不同的 rotation 策略(例如按文件大小或时间分割日志文件)。

注意事项

  • @logger.catch 装饰器应该被应用到程序的主函数或任何可能抛出未处理异常的函数上。
  • 确保 Loguru 配置了正确的 sinks,以便将日志信息输出到所需的位置。
  • @logger.catch 只能捕获未处理的异常。如果异常已经被 try...except 块捕获并处理,@logger.catch 将不会起作用。
  • 在生产环境中,建议配置更完善的日志记录策略,例如设置日志级别、日志格式、rotation 策略等,以便更好地管理和分析日志信息。

总结

通过使用 Loguru 提供的 @logger.catch 装饰器,我们可以方便地捕获未处理的异常,并将其记录到配置的日志 sinks 中,从而确保所有错误信息都能被正确记录到日志文件中。 这对于调试和排查问题非常有帮助,尤其是在生产环境中。 理解 Python 的默认异常处理机制以及 Loguru 的日志记录机制,可以帮助我们更好地使用 Loguru 来管理应用程序的日志信息。

立即学习Python免费学习笔记(深入)”;

					

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

236

2023.12.07

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号