如何在Python中记录源文件名和行号
是否可以修饰/扩展python标准日志系统,以便在调用日志方法时,它也会记录调用它的文件和行号,或者可能是调用它的方法?当然,签入日志文档。特别是lineno和pathname变量 %(路径名)s发出日志调用的源文件的完整路径名(如果可用) %(文件名)s路径名的文件名部分 %(模块)s模块(文件名的名称部分) %(funcName)s包含日志调用的函数的名称 %(行号)d发出日志调用的源行号(如果可用) 看起来像这样:如何在Python中记录源文件名和行号,python,logging,Python,Logging,是否可以修饰/扩展python标准日志系统,以便在调用日志方法时,它也会记录调用它的文件和行号,或者可能是调用它的方法?当然,签入日志文档。特别是lineno和pathname变量 %(路径名)s发出日志调用的源文件的完整路径名(如果可用) %(文件名)s路径名的文件名部分 %(模块)s模块(文件名的名称部分) %(funcName)s包含日志调用的函数的名称 %(行号)d发出日志调用的源行号(如果可用) 看起来像这样: formatter = logging.Formatter('[%(asc
formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')
除此之外,还有一个方便的代码片段,以合理的格式演示了记录器的用法:
#!/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")
生成此输出:
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
要以将调试日志发送到standard out的方式构建上述功能,请执行以下操作:
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\u logging\u example.py的文件中,将生成以下输出:
[debug_logging_example.py:14 - <module>() ] I am sent to standard out.
[debug\u logging\u example.py:14-()]我被发送到标准输出。
然后,如果您想关闭日志记录,请将注释输出root.setLevel(logging.DEBUG)
对于单个文件(例如类作业),我发现这是一种比使用print()
语句更好的方法。它允许您在提交调试输出之前在单个位置关闭调试输出 对于使用PyCharm或Eclipse pydev的开发人员,以下内容将在控制台日志输出中生成指向日志语句源的链接:
import logging, sys, os
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format='%(message)s | \'%(name)s:%(lineno)s\'')
log = logging.getLogger(os.path.basename(__file__))
log.debug("hello logging linked to source")
有关详细讨论和历史记录,请参阅
# 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)
与其他答案不同,这将记录文件的完整路径和可能发生错误的函数名。如果您有一个包含多个模块的项目以及分布在这些模块中的多个同名文件,则此选项非常有用。有关详细信息,请使用此选项:formatter=logging.formatter('%(asctime)s,%%(levelname)-8s[%(文件名)s:%(模块)s:%(funcName)s:%(行号)d]%(消息)s'))是否有一种方法可以在代码顶部的一个地方更改日志消息是否被打印出来?我想有两种模式,一种是大量打印,以查看程序的具体功能;还有一个,当它足够稳定时,不会显示输出。@Marie.P。在评论中不要问不同的问题。答案是记录级别。是的,需要考虑变量中的大小写混乱。否则称为“非常糟糕的情况”。