在没有特定 try 和 except 块的情况下记录 python 中的任何错误?
Log any errors in python without specific try and except blocks?
最终我正在尝试编写一个自定义日志记录模块来记录一些无人日常脚本的事件,目前我正在研究如何记录异常。
其他几个 SO 问题建议用一个函数替换 sys.excepthook 来实现这个,但我无法让它在我的模块中按预期工作所以现在我只是想得到一个基本的例子工作所以我可以开始了解这里发生的事情。
上面的问题概述了他们用来实现此目的的一些代码,这些代码 similar/identical 是其他 SO 问题中可接受的答案,但 none 似乎对我有用。
这是我的代码:
import logging
import sys
logger = logging.getLogger('myapp logger')
logger.setLevel(logging.INFO)
file_log_handler = logging.FileHandler('myapp.log')
logger.addHandler(file_log_handler)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_log_handler.setFormatter(formatter)
logger.addHandler(file_log_handler)
def _excepthook(exctype, exc, tb):
logger.error("An unhandled exception occurred.", exc_info=(exctype, exc, tb))
sys.excepthook = _excepthook
logger.debug("Hello")
5/0 # error
logger.debug("what")
我期待这会将 ZeroDivisionError 的详细信息打印到 'myapp.log' 但是当 运行 从 VS Code 中时,ZeroDivisionError 异常会正常引发并且没有任何内容会打印到 'myapp.log'.
有谁知道我哪里错了或者我应该怎么想about/approaching这个?
一个替换 sys.excepthook 以执行其默认行为以外的任何操作的超级简单示例将不胜感激。
我试图在 Jupyter Notebook 中对此进行测试,但遇到了同样的问题。无法在那里或在 VS Code 中覆盖 sys.excepthook,它出现了。
进一步谷歌搜索,我发现 this SO 线程,这说明每次执行一行代码时 IPython 都会替换 sys.excepthook。
如果您系统上的默认 python 解释器基于 IPython,这可能就是您问题的根源。在这种情况下,您可以尝试将 VS Code 指向文件 >> 首选项 >> 设置 >> 扩展 >> Python >> VS 代码中的默认解释器路径下的备用解释器路径。
另外请注意,除非您将记录器级别设置为“DEBUG”,否则您的 logger.debug() 命令不会写入您的日志文件,因为 "DEBUG" is at a lower level than "INFO":
------------更新----------------
在我上面引用的那个 SO 线程上,如果您使用的是 IPython 解释器,那么下面有一个来自“Michał Jabłoński”的答案,它可能对您有用。它在 Jupyter Notebook 中对我有用。
这对我有用:
import logging
import sys
from IPython import get_ipython
ip = get_ipython()
logger = logging.getLogger('myapp logger')
logger.setLevel(logging.DEBUG)
file_log_handler = logging.FileHandler('myapp.log')
logger.addHandler(file_log_handler)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_log_handler.setFormatter(formatter)
logger.addHandler(file_log_handler)
def exception_handler(self, etype, evalue, tb, tb_offset=None):
logger.error("An unhandled exception occurred.", exc_info=(etype, evalue, tb))
ip.set_custom_exc((Exception,), exception_handler)
logger.debug("Hello")
5/0 # error
logger.debug("what")
最终我正在尝试编写一个自定义日志记录模块来记录一些无人日常脚本的事件,目前我正在研究如何记录异常。
其他几个 SO 问题建议用一个函数替换 sys.excepthook 来实现这个,但我无法让它在我的模块中按预期工作所以现在我只是想得到一个基本的例子工作所以我可以开始了解这里发生的事情。
上面的问题概述了他们用来实现此目的的一些代码,这些代码 similar/identical 是其他 SO 问题中可接受的答案,但 none 似乎对我有用。
这是我的代码:
import logging
import sys
logger = logging.getLogger('myapp logger')
logger.setLevel(logging.INFO)
file_log_handler = logging.FileHandler('myapp.log')
logger.addHandler(file_log_handler)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_log_handler.setFormatter(formatter)
logger.addHandler(file_log_handler)
def _excepthook(exctype, exc, tb):
logger.error("An unhandled exception occurred.", exc_info=(exctype, exc, tb))
sys.excepthook = _excepthook
logger.debug("Hello")
5/0 # error
logger.debug("what")
我期待这会将 ZeroDivisionError 的详细信息打印到 'myapp.log' 但是当 运行 从 VS Code 中时,ZeroDivisionError 异常会正常引发并且没有任何内容会打印到 'myapp.log'.
有谁知道我哪里错了或者我应该怎么想about/approaching这个?
一个替换 sys.excepthook 以执行其默认行为以外的任何操作的超级简单示例将不胜感激。
我试图在 Jupyter Notebook 中对此进行测试,但遇到了同样的问题。无法在那里或在 VS Code 中覆盖 sys.excepthook,它出现了。
进一步谷歌搜索,我发现 this SO 线程,这说明每次执行一行代码时 IPython 都会替换 sys.excepthook。
如果您系统上的默认 python 解释器基于 IPython,这可能就是您问题的根源。在这种情况下,您可以尝试将 VS Code 指向文件 >> 首选项 >> 设置 >> 扩展 >> Python >> VS 代码中的默认解释器路径下的备用解释器路径。
另外请注意,除非您将记录器级别设置为“DEBUG”,否则您的 logger.debug() 命令不会写入您的日志文件,因为 "DEBUG" is at a lower level than "INFO":
------------更新----------------
在我上面引用的那个 SO 线程上,如果您使用的是 IPython 解释器,那么下面有一个来自“Michał Jabłoński”的答案,它可能对您有用。它在 Jupyter Notebook 中对我有用。
这对我有用:
import logging
import sys
from IPython import get_ipython
ip = get_ipython()
logger = logging.getLogger('myapp logger')
logger.setLevel(logging.DEBUG)
file_log_handler = logging.FileHandler('myapp.log')
logger.addHandler(file_log_handler)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_log_handler.setFormatter(formatter)
logger.addHandler(file_log_handler)
def exception_handler(self, etype, evalue, tb, tb_offset=None):
logger.error("An unhandled exception occurred.", exc_info=(etype, evalue, tb))
ip.set_custom_exc((Exception,), exception_handler)
logger.debug("Hello")
5/0 # error
logger.debug("what")