Python中的方法日志记录

4

我希望您能提供与以下内容等价的翻译:

calling method: $METHOD_NAME
args:           $ARGS
output:         $OUTPUT

希望能够对每个(用户定义的)方法调用进行自动记录(可能通过logging模块记录到文件中)。我能想到的最好的解决方案是编写一个装饰器来完成这个功能,然后将其添加到每个函数中。是否有更好的方法?

谢谢

4个回答

6
您可以查看标准库中的trace模块,它允许您跟踪程序执行、生成带注释的语句覆盖列表、打印调用者/被调用者关系以及列出程序运行期间执行的函数。它可以在另一个程序中或从命令行中使用。您还可以将日志记录到磁盘:
import sys
import trace

# create a Trace object, telling it what to ignore, and whether to
# do tracing or line-counting or both.
tracer = trace.Trace(
    ignoredirs=[sys.prefix, sys.exec_prefix],
    trace=0,
    count=1)

# run the new command using the given tracer
tracer.run('main()')

# make a report, placing output in /tmp
r = tracer.results()
r.write_results(show_missing=True, coverdir="/tmp")

2

一种可能简化事情的方法是使用元类自动应用您的装饰器。这样可以减少输入,但需要深入了解晦涩而神秘的元类编程世界。


1

这取决于你将如何使用它。 最通用的方法是遵循stdlib的“profile”模块路径,从而对每个调用进行控制,但速度有点慢。

如果您知道在控制之前需要跟踪哪些模块,则可以迭代所有成员并使用跟踪装饰器进行包装。这样跟踪代码保持清洁,并且实现不需要太多编码。


1

对于较小的项目,装饰器可能是一种简单的方法,但是使用装饰器时必须小心传递参数,以确保它们不会在传递过程中被搞乱。元类可能更符合“正确”的方式,而无需担心为每个新方法添加装饰器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接