如何获取发生错误的行号,而不是从 Django 中记录错误的行号

Posted

技术标签:

【中文标题】如何获取发生错误的行号,而不是从 Django 中记录错误的行号【英文标题】:How to get the line number where error occurred instead of line number from where error logged in Django 【发布时间】:2017-10-04 18:39:59 【问题描述】:

我在我的 django 项目中使用日志记录来记录错误。但是,只要在任何行发生任何错误,日志中的行号就是记录错误的位置,而不是发生错误的位置。 例如,在下面的代码中,如果错误发生在第 3 行(获取数据行 1 的代码),那么在日志中的行号将打印为 7,其中发生了日志记录。

def get_gender():
    try:
        # code to get data line 1
        # code to get data line 2
        # return data dictionary
    except Exception as e:
        logging.getLogger("error_logger").error(repr(e))
        return 

以下是日志设置文件中的格式化代码。

formatters':
        'large':
            'format':'%(asctime)s  %(levelname)s  %(process)d  %(pathname)s  '+
            '%(funcName)s  %(lineno)d  %(message)s  '
        ,

错误信息示例:

2017-05-06 15:20:07,065  ERROR  7000  /home/USER/ASonline/common/services/category_services.py  get_gender  7  IndexError('list index out of range',)

如何获取发生错误的行号,而不是记录错误的行号。

【问题讨论】:

【参考方案1】:

在 python 中查找行号需要bit of work。如果您真的对添加行号感兴趣,可以这样做:

from inspect import currentframe

logging.getLogger("error_logger").error("0: 1".format(currentfram().lineno , repr(e)))

但它并没有真正增加任何重要的东西。当出现问题时,您真正需要的是堆栈跟踪。这是最好的实现方式

import traceback


try:
    # code to get data line 1
    # code to get data line 2
    # return data dictionary
except Exception as e:
    logging.getLogger("error_logger").error(traceback.format_exc())
    return 

【讨论】:

只使用logging.getLogger(__name__).exception('my error message')会简单一些。您甚至不需要传入异常变量。如果您在 except 块中,它会从 sys.exc_info() 获取它。

以上是关于如何获取发生错误的行号,而不是从 Django 中记录错误的行号的主要内容,如果未能解决你的问题,请参考以下文章

调用render()时如何获取Django模板错误的文件名和行号?

异常处理——显示发生错误的行号? [复制]

在针对 XML 模式验证 XML 文件时如何获取错误的行号

是否可以在 React Native 中获取错误的行号?

在 Django 查询中提供 LIMIT 参数而不获取 QuerySet 的一部分

获取进行类调用的错误行号和文件名