# !/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()