python 實現裝飾器帶參數

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:victor Li
import logging, os

import traceback


def loggerInfo(msg, level="DEBUG"):
    logger = logging.getLogger("victor")
    logger.setLevel(level)
    ch = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s-'
                                  '%(levelname)s-'
                                  '%(filename)s-'
                                  '[line:%(lineno)d]-'
                                  '%(name)s-'
                                  '日誌信息:%(message)s'
                                  )
    root_path = os.path.abspath(os.path.dirname(__file__)).split('shippingSchedule')[0]
    fh = logging.FileHandler(root_path + "/log.txt", encoding="utf-8")
    ch.setFormatter(formatter)
    fh.setFormatter(formatter)
    # 設置收集級別
    fh.setLevel(level)
    ch.setLevel(level)
    # 日誌收集器與輸出渠道對接
    logger.addHandler(fh)
    #
    logger.addHandler(ch)

    if (level == "DEBUG"):
        logger.debug(msg)
    elif level == 'INFO':
        logger.info(msg)
    elif level == 'WARNING':
        logger.warning(msg)
    elif level == 'ERROR':
        logger.error(msg)
    else:
        logger.critical(msg)

    # 每次收集日誌後記得移除掉日誌收集器
    logger.removeHandler(ch)
    logger.removeHandler(fh)
    ch.close()
    fh.close() 


def logger(msg, errmgs=None):#裝飾器的參數
    def wrapper(func):#被裝飾的函數
        def inner(*args, **kwargs):#被裝飾的函數調用時需要的參數
            result = None
            try:
                if args == () and kwargs == {}:
                    result = func()
                else:
                    result = func(*args, **kwargs)#注意這裏要解包 如果不解包傳過去是個元組
                if result == None:
                    loggerInfo(msg)
                else:
                    loggerInfo(msg + "{}".format(result))
                    return result
            except Exception as err:

                loggerInfo(errmgs + " 失敗原因:{}\n 異常信息:{}".format(err.args, traceback.format_exc()), "ERROR")

        return inner

    return wrapper


@logger("測試通過", "測試失敗")
def demo():
    1 / 0
    return 123123


demo()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章