import os, sys
import logging, inspect
from inspect import( isclass, ismethod, isfunction )
from pprint import pprint
logger = logging.getLogger("LogHelper")
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
def log_decorator(instance=None, *arg, **kwarg):
qualname = lambda obj: obj.__qualname__
eventlog = logging.getLogger('LogHelper')
self = None
try:
self = instance()
except TypeError:
self = instance
if isfunction(instance):
try:
channel = kwarg['channel']
except KeyError as ex:
if isfunction(instance):
raise TypeError('''Missing required 'channel' argument.''')
else:
pass
def log(message, level = logging.INFO, *arg_list, **kwarg_list):
if isclass(instance):
#caller_id = "%s::%s" %( qualname(instance.__class__ ), attr )
caller_id = "WIP"
else:
caller_id = qualname(instance)
eventlog.log( level, message, extra={ 'caller': caller_id, 'log_channel': channel })
def debug(message, *arg_list, **kwarg_list):
log( message, logging.DEBUG, *arg_list, **kwarg_list)
def info(message, *arg_list, **kwarg_list):
log( message, logging.INFO, *arg_list, **kwarg_list)
def warn(message, *arg_list, **kwarg_list):
log( message, logging.WARNING, *arg_list, **kwarg_list)
def error(message, *arg_list, **kwarg_list):
log( message, logging.ERROR, *arg_list, **kwarg_list)
def critical(message, *arg_list, **kwarg_list):
log( message, logging.CRITICAL, *arg_list, **kwarg_list)
def wrapper(self, *args, **kw_arg):
return self(*args, **kw_arg)
globals = [
( 'log', log ),
( 'debug', debug ),
( 'info', info ),
( 'warn', warn ),
( 'error', error ),
( 'critical', critical )
]
if self is not None:
print(self, isinstance(self, self.__class__))
if isinstance(self, self.__class__):
## I'll see about this.
code, scope = None, {}
else:
print("HI.")
code, scope = self.__code__, self.__globals__
for i, (name, handler) in enumerate(globals):
scope[name] = handler
else:
# We didn't receive the function on this call, so the return value
# of this call will receive it, and we're getting the options now.
def partial_inner(arg0=instance):
return log_decorator(arg0, *arg, **kwarg)
return partial_inner
return wrapper
@log_decorator(channel='FooChannel')
def foo():
pass #log("Hi, world.")
foo()
@log_decorator
class FooClass(object):
channel = 'FooClassObj'
def bar(self):
pass #log('Method logged.')
#f = FooClass()
#f.bar()
aW1wb3J0IG9zLCBzeXMKaW1wb3J0IGxvZ2dpbmcsIGluc3BlY3QKZnJvbSBpbnNwZWN0IGltcG9ydCggaXNjbGFzcywgaXNtZXRob2QsIGlzZnVuY3Rpb24gKQpmcm9tIHBwcmludCBpbXBvcnQgcHByaW50Cgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiTG9nSGVscGVyIikKbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCgpoYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKCkKaGFuZGxlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQoKZGVmIGxvZ19kZWNvcmF0b3IoaW5zdGFuY2U9Tm9uZSwgKmFyZywgKiprd2FyZyk6CgkKCXF1YWxuYW1lID0gbGFtYmRhIG9iajogb2JqLl9fcXVhbG5hbWVfXwoJZXZlbnRsb2cgPSBsb2dnaW5nLmdldExvZ2dlcignTG9nSGVscGVyJykKCXNlbGYgPSBOb25lCgkKCXRyeToKCQlzZWxmID0gaW5zdGFuY2UoKQoJZXhjZXB0IFR5cGVFcnJvcjoKCQlzZWxmID0gaW5zdGFuY2UKCQoJaWYgaXNmdW5jdGlvbihpbnN0YW5jZSk6CgkJdHJ5OgoJCQljaGFubmVsID0ga3dhcmdbJ2NoYW5uZWwnXQoJCWV4Y2VwdCBLZXlFcnJvciBhcyBleDoKCQkJaWYgaXNmdW5jdGlvbihpbnN0YW5jZSk6CgkJCQlyYWlzZSBUeXBlRXJyb3IoJycnTWlzc2luZyByZXF1aXJlZCAnY2hhbm5lbCcgYXJndW1lbnQuJycnKQoJZWxzZToKCQlwYXNzCgkKCWRlZiBsb2cobWVzc2FnZSwgbGV2ZWwgPSBsb2dnaW5nLklORk8sICphcmdfbGlzdCwgKiprd2FyZ19saXN0KToKCQkKCQlpZiBpc2NsYXNzKGluc3RhbmNlKToKCQkJI2NhbGxlcl9pZCA9ICIlczo6JXMiICUoIHF1YWxuYW1lKGluc3RhbmNlLl9fY2xhc3NfXyApLCBhdHRyICkKCQkJY2FsbGVyX2lkID0gIldJUCIKCQllbHNlOgoJCQljYWxsZXJfaWQgPSBxdWFsbmFtZShpbnN0YW5jZSkKCQkKCQlldmVudGxvZy5sb2coIGxldmVsLCBtZXNzYWdlLCBleHRyYT17ICdjYWxsZXInOiBjYWxsZXJfaWQsICdsb2dfY2hhbm5lbCc6IGNoYW5uZWwgfSkKCQoJZGVmIGRlYnVnKG1lc3NhZ2UsICphcmdfbGlzdCwgKiprd2FyZ19saXN0KToKCQlsb2coIG1lc3NhZ2UsIGxvZ2dpbmcuREVCVUcsICphcmdfbGlzdCwgKiprd2FyZ19saXN0KQoJCglkZWYgaW5mbyhtZXNzYWdlLCAqYXJnX2xpc3QsICoqa3dhcmdfbGlzdCk6CgkJbG9nKCBtZXNzYWdlLCBsb2dnaW5nLklORk8sICphcmdfbGlzdCwgKiprd2FyZ19saXN0KQoJCglkZWYgd2FybihtZXNzYWdlLCAqYXJnX2xpc3QsICoqa3dhcmdfbGlzdCk6CgkJbG9nKCBtZXNzYWdlLCBsb2dnaW5nLldBUk5JTkcsICphcmdfbGlzdCwgKiprd2FyZ19saXN0KQoJCglkZWYgZXJyb3IobWVzc2FnZSwgKmFyZ19saXN0LCAqKmt3YXJnX2xpc3QpOgoJCWxvZyggbWVzc2FnZSwgbG9nZ2luZy5FUlJPUiwgKmFyZ19saXN0LCAqKmt3YXJnX2xpc3QpCgkKCWRlZiBjcml0aWNhbChtZXNzYWdlLCAqYXJnX2xpc3QsICoqa3dhcmdfbGlzdCk6CgkJbG9nKCBtZXNzYWdlLCBsb2dnaW5nLkNSSVRJQ0FMLCAqYXJnX2xpc3QsICoqa3dhcmdfbGlzdCkKCQoJZGVmIHdyYXBwZXIoc2VsZiwgKmFyZ3MsICoqa3dfYXJnKToKCQlyZXR1cm4gc2VsZigqYXJncywgKiprd19hcmcpCgkJCglnbG9iYWxzID0gWwoJCSggJ2xvZycsIGxvZyApLAoJCSggJ2RlYnVnJywgZGVidWcgKSwKCQkoICdpbmZvJywgaW5mbyApLAoJCSggJ3dhcm4nLCB3YXJuICksCgkJKCAnZXJyb3InLCBlcnJvciApLAoJCSggJ2NyaXRpY2FsJywgY3JpdGljYWwgKQoJXQoJCglpZiBzZWxmIGlzIG5vdCBOb25lOgoJCXByaW50KHNlbGYsIGlzaW5zdGFuY2Uoc2VsZiwgc2VsZi5fX2NsYXNzX18pKQoJCQoJCWlmIGlzaW5zdGFuY2Uoc2VsZiwgc2VsZi5fX2NsYXNzX18pOgoJCQkjIyBJJ2xsIHNlZSBhYm91dCB0aGlzLgoJCQljb2RlLCBzY29wZSA9IE5vbmUsIHt9CgkJZWxzZToKCQkJcHJpbnQoIkhJLiIpCgkJCWNvZGUsIHNjb3BlID0gc2VsZi5fX2NvZGVfXywgc2VsZi5fX2dsb2JhbHNfXwoJCQoJCWZvciBpLCAobmFtZSwgaGFuZGxlcikgaW4gZW51bWVyYXRlKGdsb2JhbHMpOgoJCQlzY29wZVtuYW1lXSA9IGhhbmRsZXIKCWVsc2U6CgkJIyBXZSBkaWRuJ3QgcmVjZWl2ZSB0aGUgZnVuY3Rpb24gb24gdGhpcyBjYWxsLCBzbyB0aGUgcmV0dXJuIHZhbHVlCgkJIyBvZiB0aGlzIGNhbGwgd2lsbCByZWNlaXZlIGl0LCBhbmQgd2UncmUgZ2V0dGluZyB0aGUgb3B0aW9ucyBub3cuCgkJZGVmIHBhcnRpYWxfaW5uZXIoYXJnMD1pbnN0YW5jZSk6CgkJCXJldHVybiBsb2dfZGVjb3JhdG9yKGFyZzAsICphcmcsICoqa3dhcmcpCgkJCgkJcmV0dXJuIHBhcnRpYWxfaW5uZXIKCQoJcmV0dXJuIHdyYXBwZXIKCkBsb2dfZGVjb3JhdG9yKGNoYW5uZWw9J0Zvb0NoYW5uZWwnKQpkZWYgZm9vKCk6CglwYXNzICNsb2coIkhpLCB3b3JsZC4iKQoKZm9vKCkKCkBsb2dfZGVjb3JhdG9yCmNsYXNzIEZvb0NsYXNzKG9iamVjdCk6CgljaGFubmVsID0gJ0Zvb0NsYXNzT2JqJwoJCglkZWYgYmFyKHNlbGYpOgoJCXBhc3MgI2xvZygnTWV0aG9kIGxvZ2dlZC4nKQoJCiNmID0gRm9vQ2xhc3MoKQojZi5iYXIoKQo=