1 # coding:utf-8
2
3
4 class log(object):
5
6 def __init__(self, **kwargs):
7 '''
8 <logFm>,<funcLog>:日志输出格式
9 #外层日志格式<logFm>[时间,日志名<logName>,日志级别,日志信息]
10 #内层日志格式<funcLog>[函数名称,函数参数,函数位置]
11 <logName>,:输出日志名称
12 <conLevel>:日志显示级别
13 <fileLevel>:日志文件记录级别
14 ----------------------------------------------------------------------------------------------------------------
15 <fileFm><fileLevel>,<filePath>,<logName>[日志记录格式,日志级别,日志路径,日志名称]
16 #日志保存文件默认关闭,默认路径./log.log,默认级别DEBUG#
17 <funcLog>修改涉及函数操作:
18 def funclogfm(self, func, *args, **kwargs):
19 if self.funcLogFm == None:
20 self.funcLogFm = self.funcLog % (
21 func.__name__, args, kwargs, func.__code__.co_firstlineno, func.__code__.co_filename)
22 return self.funcLogFm
23 ----------------------------------------------------------------------------------------------------------------
24 '''
25 from functools import wraps
26 import logging, sys, inspect
27 if 'logFm' in kwargs.keys():
28 self.logFm = kwargs['logFm']
29 else:
30 self.logFm = '%(asctime)s - %(name)s - %(levelname)s - %(message)s;'
31 if 'funcLog' in kwargs.keys():
32 self.funcLog = kwargs['funcLog']
33 else:
34 self.funcLog = 'line:%s - funcName:<%s> - path:%s - parm:[%s, %s]'
35 if 'conLevel' in kwargs.keys():
36 for le in ['INFO', 'WARNING']:
37 if le == kwargs['conLevel']:
38 s = 'logging.' + le
39 ConLevel = eval(s)
40 logging.basicConfig(level=ConLevel, format=self.logFm)
41 else:
42 logging.basicConfig(level=logging.DEBUG, format=self.logFm)
43 if 'logName' in kwargs.keys():
44 self.logger = logging.getLogger(kwargs['logName'])
45 else:
46 self.logger = logging.getLogger('log')
47 if 'filePath' in kwargs.keys():
48 self.handler = logging.FileHandler(kwargs['filePath'])
49 else:
50 self.handler = logging.FileHandler("log.log")
51 if 'fileFm' in kwargs.keys():
52 formatter = logging.Formatter(kwargs['fileFm'])
53 else:
54 formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
55 if 'fileLevel' in kwargs.keys():
56 for le in ['INFO', 'WARNING']:
57 if le == kwargs['fileLevel']:
58 s = 'logging.' + le
59 FileLevel = eval(s)
60 self.handler.setLevel(FileLevel)
61 else:
62 self.handler.setLevel(logging.INFO)
63 self.handler.setFormatter(formatter)
64 self.wraps = wraps
65 self.funcLogFm = None
66 self.logger.addHandler(self.handler)
67 self.sys = sys
68 self.inspect = inspect
69
70 def funclogfm(self, func, *args, **kwargs):
71 lineno = func.__code__.co_firstlineno
72 who = func.__name__
73 path = func.__code__.co_filename
74 self.funcLogFm = self.funcLog % (lineno, who, path, args, kwargs,)
75 return self.funcLogFm
76
77 def DEBUG(self, func):
78 '''日志装饰器'''
79
80 @self.wraps(func)
81 def tmp(*args, **kwargs):
82 self.logger.debug(self.funclogfm(func, args, kwargs))
83 try:
84 return func(*args, **kwargs)
85 except:
86 err = "There was an exception in "
87 err += func.__name__
88 self.logger.exception(err)
89
90 return tmp
91
92 def INFO(self, func):
93 '''日志装饰器'''
94
95 @self.wraps(func)
96 def tmp(*args, **kwargs):
97 self.logger.info(self.funclogfm(func, args, kwargs))
98 try:
99 return func(*args, **kwargs)
100 except:
101 err = "There was an exception in "
102 err += func.__name__
103 self.logger.exception(err)
104
105 return tmp
106
107 def WARNING(self, func):
108 '''日志装饰器'''
109
110 @self.wraps(func)
111 def tmp(*args, **kwargs):
112 self.logger.warning(self.funclogfm(func, args, kwargs))
113 try:
114 return func(*args, **kwargs)
115 except:
116 err = "There was an exception in "
117 err += func.__name__
118 self.logger.exception(err)
119
120 return tmp
121
122 def debug(self, message):
123 import inspect
124 '''返回程序中的当前行号:inspect.currentframe().f_back.f_lineno'''
125 lineno = inspect.currentframe().f_back.f_lineno
126 who = inspect.getframeinfo(inspect.currentframe().f_back)
127 msg = 'line:%s - funcName:<%s> - path:%s - parm:%s' % (lineno, who[2], who[0], message)
128 return self.logger.debug(msg)
129
130 def info(self, message):
131 import inspect
132 '''返回程序中的当前行号:inspect.currentframe().f_back.f_lineno'''
133 lineno = inspect.currentframe().f_back.f_lineno
134 who = inspect.getframeinfo(inspect.currentframe().f_back)
135 msg = 'line:%s - funcName:<%s> - path:%s - parm:%s' % (lineno, who[2], who[0], message)
136 return self.logger.info(msg)
137
138 def warning(self, message):
139 import inspect
140 '''返回程序中的当前行号:inspect.currentframe().f_back.f_lineno'''
141 lineno = inspect.currentframe().f_back.f_lineno
142 who = inspect.getframeinfo(inspect.currentframe().f_back)
143 msg = 'line:%s - funcName:<%s> - path:%s - parm:%s' % (lineno, who[2], who[0], message)
144 return self.logger.warning(msg)