版权声明:本文为博主原创文章,转载敬请作出引用声明方便相互交流学习! https://blog.csdn.net/sweeper_freedoman/article/details/88747598
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
create_author : 蛙鳜鸡鹳狸猿
create_time : 2019-03-20
program : *_* log logging handler *_*
"""
import sys
import logging
import functools
class LOG(object):
"""
Log logging definition.
"""
def __init__(self, args=None):
"""
LOG init.
:param args: Dict.
every items are parameters pass to standard library logging.basicConfig().
"""
self.ARGS = args
if not self.ARGS:
self.ARGS = {
"level": logging.DEBUG,
"stream": sys.stdout,
"format": "%(asctime)s\t%(levelname)s\t[Module: %(module)s, Function: %(funcName)s]",
"datefmt": "%Y-%m-%d %H:%M:%S",
"filename": None,
}
def logger(self, name=__name__):
"""
Logger object generates.
:param name: Logger name(parameters pass to standard library logging.getLogger()).
:return: Logger object.
"""
try:
if not self.ARGS["filename"]:
del self.ARGS["filename"]
except KeyError:
pass
logging.basicConfig(**self.ARGS)
return logging.getLogger(name)
def raise_log(raised_except, msg=''):
"""
Raise exception by hand to escape error exit caused by built-in [raise].
:param raised_except: Exception object.
:param msg: Exception feedback message.
:return: Python's built-in exit code.
Output Exception of [raised_except].
"""
try:
raise raised_except(msg)
except raised_except as E:
logging.exception(E)
def log(logger=None, exc_msg='', if_exit=False, exit_msg='', result_check=False, check_except=None, check_msg=''):
"""
Log logging decorator function.
:param logger: Logger object(see also logging.getLogger()).
:param exc_msg: extra message to return when exceptions catch.
:param if_exit: Boolean.
Whether to exit or not when catching exception.
:param exit_msg: extra message to return when exceptions catch and exit.
:param result_check: Boolean.
Whether or not to check Python's False status result of [func]'s return.
:param check_except: Exception object to raise when [result_check].
:param check_msg: Exception feedback message to return when [result_check].
:return: decorated function [func]'s return.
"""
if not logger:
logger = LOG().logger()
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
result = None
try:
result = func(*args, **kwargs)
except BaseException:
logger.exception(exc_msg)
if if_exit:
sys.exit(exit_msg)
finally:
if result_check:
if not result:
raise_log(check_except, check_msg)
return result
return wrapper
return decorator
if __name__ == "__main__":
LOG_Test = LOG
# LOG().logger().info("INFO:Come...")
# LOG().logger().error("ERROR:Come...")
# @log()
# def get(a, b):
# return a / b
# get(a=1, b=0)