首页 / 日志 / python – 自定义异常默认日志记录
python – 自定义异常默认日志记录
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 自定义异常默认日志记录,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2304字,纯文字阅读大概需要4分钟。
内容图文
![python – 自定义异常默认日志记录](/upload/InfoBanner/zyjiaocheng/782/8267bb29923c4f82bb2b8223c88d7d06.jpg)
我已经构建了自定义异常,接受参数并从常量格式化自己的消息.他们还打印到stdout,以便用户理解问题.
例如:
defs.py:
PATH_NOT_FOUND_ERROR = 'Cannot find path "{}"'
exceptions.py:
class PathNotFound(BaseCustomException):
"""Specified path was not found."""
def __init__(self, path):
msg = PATH_NOT_FOUND_ERROR.format(path)
print(msg)
super(PathNotFound, self).__init__(msg)
some_module.py
raise PathNotFound(some_invalid_path)
我还想在抛出异常时记录异常,最简单的方法是:
logger.debug('path {} not found'.format(some_invalid_path)
raise PathNotFound(some_invalid_path)
但是在整个代码中执行此操作似乎是多余的,特别是它使常量毫无意义,因为如果我决定更改我需要更改记录器措辞的措辞.
我试图做一些事情,比如将记录器移动到异常类,但是让我失去了相关的LogRecord属性,如name,module,filename,lineno等.这种方法也失去了exc_info
有没有办法记录异常并保留元数据而不记录每次提升之前?
解决方法:
如果有人有兴趣,这是一个有效的解决方案
想法是找到提升者的框架并从那里提取相关信息.
还必须覆盖logging.makeRecord以允许我覆盖内部LogRecord属性
设置日志记录
class MyLogger(logging.Logger):
"""Custom Logger."""
def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None):
"""Override default logger to allow overridding internal attributes."""
if six.PY2:
rv = logging.LogRecord(name, level, fn, lno, msg, args, exc_info, func)
else:
rv = logging.LogRecord(name, level, fn, lno, msg, args, exc_info, func, sinfo)
if extra is not None:
for key in extra:
# if (key in ["message", "asctime"]) or (key in rv.__dict__):
# raise KeyError("Attempt to overwrite %r in LogRecord" % key)
rv.__dict__[key] = extra[key]
return rv
logging.setLoggerClass(MyLogger)
logger = logging.getLogger(__name__)
自定义异常处理程序
class BaseCustomException(Exception):
"""Specified path was not found."""
def __init__(self, path):
"""Override message with defined const."""
try:
raise ZeroDivisionError
except ZeroDivisionError:
# Find the traceback frame that raised this exception
exception_frame = sys.exc_info()[2].tb_frame.f_back.f_back
exception_stack = traceback.extract_stack(exception_frame, limit=1)[0]
filename, lineno, funcName, tb_msg = exception_stack
extra = {'filename': os.path.basename(filename), 'lineno': lineno, 'funcName': funcName}
logger.debug(msg, extra=extra)
traceback.print_stack(exception_frame)
super(BaseCustomException, self).__init__(msg)
内容总结
以上是互联网集市为您收集整理的python – 自定义异常默认日志记录全部内容,希望文章能够帮你解决python – 自定义异常默认日志记录所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。