辅助记录的方法和工具。
项目描述
辅助记录的方法和工具。可以从 PyPI 安装:
$ pip install logtool
日志调用
函数和方法定义的装饰器,在 DEBUG 级别记录有关对该入口点的每次调用的各种数据。
旨在取代 @log_func 和 log_func_noargs(见下文)。有关示例输出,请参见 log_func。
可选参数:
- 登录输入
装饰方法的日志入口。默认为真。
- 日志参数
记录传递给修饰方法的参数。默认为真。
- 日志退出
记录装饰方法的退出/返回以及执行时间。默认为真。
- 日志_rc
记录装饰方法返回的值。默认为真。
- 日志跟踪
在执行装饰方法时记录其每一行。默认为假。
- 日志级别
用于调用的 logginf 的日志级别。默认为 logging.DBEUG。
@logtool.log_call def a_method (...): ...etc...
@logtool.log_call (log_args = False, log_rc = False) def big_complex_data (...): ...etc...
日志函数
函数和方法定义的装饰器,在调试级别记录对该函数或方法的每次调用及其参数。
例如
@logtool.log_wrap def my_method (self, *args): ...stuff here...
实际生产使用产生的日志条目(编辑了一些参数值):
Entered: function:test_tool.toolwrapper:email_report ((<test_tool.meshtool.Wrapper object at 0x7f19d4879c10>, path(u'../file.ext'), 'address@domain.com', 'address@domain.com', 'Interesting subject header') {})
最后的 {} 表明没有传递给该调用的命名参数,否则它们将显示在那里。
log_func_noargs
函数和方法定义的装饰器,在 DEBUG 级别记录对该函数或方法的每次调用,但没有任何参数。当遍历和转储参数非常昂贵或可能会创建无限循环时,这可能很有用。
例如
@logtool.log_wrap_noargs def my_method (self, *args): ...stuff here...
日志故障
以标准化形式记录异常,包括异常的源文件和行号,如果在 DEBUG 级别记录,还会记录堆栈跟踪以及每个堆栈帧中的所有变量。例如
在 WARN 或更高模式下:
CRITICAL <log_fault_impl:log_fault(24)> FAULT: /usr/local/lib/python2.7/dist-packages/workerd-0.1.26_gbb342e2-py2.7.egg/workerd/do.py(243): IOError(28, 'No space left on device')
在 DEBUG 登录时:
CRITICAL <log_fault_impl:log_fault(24)> FAULT: /usr/local/lib/python2.7/dist-packages/workerd-0.1.26_gbb342e2-py2.7.egg/workerd/do.py(243): IOError(28, 'No space left on device') DEBUG <log_fault_impl:log_fault(26)> 按帧本地化,最里面最后一个: DEBUG <log_fault_impl:log_fault(30)> 框架运行在 /usr/local/lib/python2.7/dist-packages/workerd-0.1.26_gbb342e2-py2.7.egg/workerd/do.py 第 248 行 调试 <log_fault_impl:log_fault(40)> self = <workerd.do.Do object at 0x7f5709e3d490> 调试 <log_fault_impl:log_fault(40)> e = [Errno 28] 设备上没有剩余空间 调试 <log_fault_impl:log_fault(40)> rc = 0 调试 <log_fault_impl:log_fault(30)> 第 27 行 build/bdist.linux-x86_64/egg/mppy/log_wrap.py 中的帧 wrapper_args 调试 <log_fault_impl:log_fault(40)> args = (<workerd.do.Do object at 0x7f5709e3d490>,) 调试 <log_fault_impl:log_fault(40)> fn = <function do_job at 0x7f570a2936e0> 调试 <log_fault_impl:log_fault(40)> kwargs = {} 调试 <log_fault_impl:log_fault(30)> 在第 227 行的 /usr/local/lib/python2.7/dist-packages/workerd-0.1.26_gbb342e2-py2.7.egg/workerd/do.py 中构建 do_job 调试 <log_fault_impl:log_fault(40)> 目录 = 1410867312.58 调试 <log_fault_impl:log_fault(40)> self = <workerd.do.Do object at 0x7f5709e3d490> 调试 <log_fault_impl:log_fault(40)> tic = 1410842559.54 调试 <log_fault_impl:log_fault(40)> rc = -99 在第 69 行的 build/bdist.linux-x86_64/egg/mppy/jsondict.py 中调试 <log_fault_impl:log_fault(30)> 框架 __setitem__ 调试 <log_fault_impl:log_fault(40)> self = {u'status': u'pending', u'notified_for': u'pending 调试 <log_fault_impl:log_fault(40)> key = execution_time 调试 <log_fault_impl:log_fault(40)> val = 24753.043578 调试 <log_fault_impl:log_fault(40)> kwargs = {} DEBUG <log_fault_impl:log_fault(30)> 框架包装器在 build/bdist.linux-x86_64/egg/mppy/jsondict.py 第 80 行 调试 <log_fault_impl:log_fault(40)> self = {u'status': u'pending', u'notified_for': u'pending 调试 <log_fault_impl:log_fault(40)> kwargs = {} DEBUG <log_fault_impl:log_fault(40)> attr = <bound method JsonDict.save of {u'status': u'pendi 调试 <log_fault_impl:log_fault(40)> args = () 调试 <log_fault_impl:log_fault(40)> was_loaded = True DEBUG <log_fault_impl:log_fault(30)> 帧保存在 build/bdist.linux-x86_64/egg/mppy/jsondict.py 第 46 行 调试 <log_fault_impl:log_fault(40)> 强制 = False 调试 <log_fault_impl:log_fault(40)> self = {u'status': u'pending', u'notified_for': u'pending 调试 <log_fault_impl:log_fault(40)> fd = 5 调试 <log_fault_impl:log_fault(40)> fn = /var/spool/matterport/workerd/generate_mesh/d34fea
time_str
只需以适合日志文件、报告等的简单一致字符串形式返回 time_t(自纪元以来的秒数,可能是小数)。
请参阅下面的示例。
现在
将当前时间的元组作为 time_t 及其匹配的 time_str 重新生成。将两者放在一起允许将字符串用于日志等,并将 time_t 用作数字。例如:
$ ipython Python 2.7.6 (default, Mar 22 2014, 22:59:56) Type "copyright", "credits" or "license" for more information. IPython 1.2.1 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: import logtool In [2]: logtool.now () Out[2]: (1411075417, '21:23:37 Thu 18 Sep 2014 Z+0000') In [3]: logtool.time_str (logtool.now ()[0]) Out[3]: '14:23:42 Thu 18 Sep 2014 Z+0000'