首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中记录源文件名和行号

如何在Python中记录源文件名和行号
EN

Stack Overflow用户
提问于 2009-02-10 16:29:23
回答 4查看 100.5K关注 0票数 174

有没有可能修饰/扩展python标准日志记录系统,以便在调用日志记录方法时,它还会记录被调用的文件和行号或者调用它的方法?

EN

回答 4

Stack Overflow用户

发布于 2017-06-07 08:08:32

Seb's very useful answer之上,下面是一个方便的代码片段,它以合理的格式演示了记录器的用法:

代码语言:javascript
复制
#!/usr/bin/env python
import logging

logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.DEBUG)

logger = logging.getLogger(__name__)
logger.debug("This is a debug log")
logger.info("This is an info log")
logger.critical("This is critical")
logger.error("An error occurred")

生成以下输出:

代码语言:javascript
复制
2017-06-06:17:07:02,158 DEBUG    [log.py:11] This is a debug log
2017-06-06:17:07:02,158 INFO     [log.py:12] This is an info log
2017-06-06:17:07:02,158 CRITICAL [log.py:13] This is critical
2017-06-06:17:07:02,158 ERROR    [log.py:14] An error occurred
票数 123
EN

Stack Overflow用户

发布于 2020-02-05 03:07:49

代码语言:javascript
复制
# your imports above ...


logging.basicConfig(
    format='%(asctime)s,%(msecs)d %(levelname)-8s [%(pathname)s:%(lineno)d in 
    function %(funcName)s] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.DEBUG
)

logger = logging.getLogger(__name__)

# your classes and methods below ...
# An naive Sample of usage:
try:
    logger.info('Sample of info log')
    # your code here
except Exception as e:
    logger.error(e)

与其他答案不同,这将记录文件的完整路径和可能发生错误的函数名。如果您的项目包含多个模块,并且在这些模块中分布了多个同名文件,则此功能非常有用。

票数 9
EN

Stack Overflow用户

发布于 2018-09-20 01:36:43

要以将调试日志发送到标准输出的方式构建上述内容:

代码语言:javascript
复制
import logging
import sys

root = logging.getLogger()
root.setLevel(logging.DEBUG)

ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s"
formatter = logging.Formatter(FORMAT)
ch.setFormatter(formatter)
root.addHandler(ch)

logging.debug("I am sent to standard out.")

将上述代码放入名为debug_logging_example.py的文件中会产生以下输出:

代码语言:javascript
复制
[debug_logging_example.py:14 -             <module>() ] I am sent to standard out.

然后,如果您想关闭日志记录,请注释掉root.setLevel(logging.DEBUG)

对于单个文件(例如类分配),我发现与使用print()语句相比,这是一种更好的方法。它允许您在提交之前在单个位置关闭调试输出。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/533048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档