Skip to main content

Methods and tools that assist logging

Project description

Methods and tools that assist logging. Can be installed from PyPI:

$ pip install logtool

log_call

A decorator for function and method definitions that logs at DEBUG level a variety of data about every call made to that entrypoint.

Intended to supercede @log_func and log_func_noargs (see below). See log_func for example output.

Optional arguments:

log_enter

Log entrance to the decorated method. Defaults to True.

log_args

Log the arguments passed to the decorated method. Defaults to True.

log_exit

Log exit/returns from the decorated method along with the execution time. Defaults to True.

log_rc

Log the value returned by the decorated method. Defaults to True.

log_trace

Log each line of the decorated method as it is executed. Defaults to False.

log_level

Log level to use for the logging of the call. Defaults to logging.DBEUG.

@logtool.log_call
def a_method (...):
 ...etc...
@logtool.log_call (log_args = False, log_rc = False)
def big_complex_data (...):
 ...etc...

log_func

A decorator for function and method definitions that logs at DEBUG level every call to that function or method along with its arguments.

eg

@logtool.log_wrap
def my_method (self, *args):
  ...stuff here...

Resulting log entry from a real production usage (with a few of the argumentvalues redacted):

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') {})

The {} at the end shows that there were no named arguments passed to that call, else they would be shown there.

log_func_noargs

A decorator for function and method definitions that logs at DEBUG level every call to that function or method but without any arguments. This can be useful when traversing and dumping the arguments would be execssively expensive, or would potentially create infinite loops.

eg

@logtool.log_wrap_noargs
def my_method (self, *args):
  ...stuff here...

log_fault

Logs an exception in a standardised form, including the source file and line number of the exception, and if logging at DEBUG level, also logs a stack trace along with all the variables in each stack frame. eg

In WARN or higher mode:

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')

When logging at 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)> Locals by frame, innermost last:
DEBUG <log_fault_impl:log_fault(30)> Frame run in /usr/local/lib/python2.7/dist-packages/workerd-0.1.26_gbb342e2-py2.7.egg/workerd/do.py at line 248
DEBUG <log_fault_impl:log_fault(40)>                 self = <workerd.do.Do object at 0x7f5709e3d490>
DEBUG <log_fault_impl:log_fault(40)>                    e = [Errno 28] No space left on device
DEBUG <log_fault_impl:log_fault(40)>                   rc = 0
DEBUG <log_fault_impl:log_fault(30)> Frame wrapper_args in build/bdist.linux-x86_64/egg/mppy/log_wrap.py at line 27
DEBUG <log_fault_impl:log_fault(40)>                 args = (<workerd.do.Do object at 0x7f5709e3d490>,)
DEBUG <log_fault_impl:log_fault(40)>                   fn = <function do_job at 0x7f570a2936e0>
DEBUG <log_fault_impl:log_fault(40)>               kwargs = {}
DEBUG <log_fault_impl:log_fault(30)> Frame do_job in /usr/local/lib/python2.7/dist-packages/workerd-0.1.26_gbb342e2-py2.7.egg/workerd/do.py at line 227
DEBUG <log_fault_impl:log_fault(40)>                  toc = 1410867312.58
DEBUG <log_fault_impl:log_fault(40)>                 self = <workerd.do.Do object at 0x7f5709e3d490>
DEBUG <log_fault_impl:log_fault(40)>                  tic = 1410842559.54
DEBUG <log_fault_impl:log_fault(40)>                   rc = -99
DEBUG <log_fault_impl:log_fault(30)> Frame __setitem__ in build/bdist.linux-x86_64/egg/mppy/jsondict.py at line 69
DEBUG <log_fault_impl:log_fault(40)>                 self = {u'status': u'pending', u'notified_for': u'pending
DEBUG <log_fault_impl:log_fault(40)>                  key = execution_time
DEBUG <log_fault_impl:log_fault(40)>                  val = 24753.043578
DEBUG <log_fault_impl:log_fault(40)>               kwargs = {}
DEBUG <log_fault_impl:log_fault(30)> Frame wrapper in build/bdist.linux-x86_64/egg/mppy/jsondict.py at line 80
DEBUG <log_fault_impl:log_fault(40)>                 self = {u'status': u'pending', u'notified_for': u'pending
DEBUG <log_fault_impl:log_fault(40)>               kwargs = {}
DEBUG <log_fault_impl:log_fault(40)>                 attr = <bound method JsonDict.save of {u'status': u'pendi
DEBUG <log_fault_impl:log_fault(40)>                 args = ()
DEBUG <log_fault_impl:log_fault(40)>           was_loaded = True
DEBUG <log_fault_impl:log_fault(30)> Frame save in build/bdist.linux-x86_64/egg/mppy/jsondict.py at line 46
DEBUG <log_fault_impl:log_fault(40)>                force = False
DEBUG <log_fault_impl:log_fault(40)>                 self = {u'status': u'pending', u'notified_for': u'pending
DEBUG <log_fault_impl:log_fault(40)>                   fd = 5
DEBUG <log_fault_impl:log_fault(40)>                   fn = /var/spool/matterport/workerd/generate_mesh/d34fea

time_str

Simply returns a time_t (seconds since the epoch, possibly fractional) in a simple consistent string form suitable for logfiles, reports and the like.

See below under now for an example.

now

Reurns a tuple of the current time as a time_t, and its matching time_str. Getting the two together allows the string to be used for logs and the like, and the time_t to be used as a numeric. eg:

$ 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'

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

logtool-0.4.post2.tar.gz (8.2 kB view details)

Uploaded Source

Built Distribution

logtool-0.4.post2-py3-none-any.whl (9.3 kB view details)

Uploaded Python 3

File details

Details for the file logtool-0.4.post2.tar.gz.

File metadata

  • Download URL: logtool-0.4.post2.tar.gz
  • Upload date:
  • Size: 8.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.4 Linux/6.9.9-amd64

File hashes

Hashes for logtool-0.4.post2.tar.gz
Algorithm Hash digest
SHA256 78d4669f5be91591de7278947da6d8a4f15ab5016ee55aa39f9b000ef113a839
MD5 0cb321d9afa436debf5487e6ca3ff405
BLAKE2b-256 d8da5974a7a31b0e8d7fa2510e53c795740d2af5438f15186e3bf1506a31e647

See more details on using hashes here.

File details

Details for the file logtool-0.4.post2-py3-none-any.whl.

File metadata

  • Download URL: logtool-0.4.post2-py3-none-any.whl
  • Upload date:
  • Size: 9.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.4 Linux/6.9.9-amd64

File hashes

Hashes for logtool-0.4.post2-py3-none-any.whl
Algorithm Hash digest
SHA256 5f562a83e3d1323bd93f5ff55ac82b1bc00084f898067c4adf30e93394f7ef32
MD5 163ac2fa4f0c93886ea827f0fc9b9dcf
BLAKE2b-256 a7107214c164586762ad9a4bdddb34e3b19ac0f233acd27862596ae1a8113374

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page