Python之日志处理(logging模块二实战)


实战篇

 1 import logging
 2 import logging.handlers
 3 
 4 LOG_PATH = r'./'
 5 
 6 def logConfig_1():
 7     '''
 8     配置 log 输出到文件 : fileName 中
 9     '''
10     fileName = LOG_PATH + r"\%s.txt"%getlogname()
11     #print(lfname)
12     logformat='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
13     logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别
14                     filename=fileName,
15                     filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
16                     #a是追加模式,默认如果不写的话,就是追加模式
17                     format=logformat
18                     #日志格式
19                     )
20     print('logConfig_2配置完成')
21 #logConfig_1()#配置log
22 
23 def logConfig_2():
24     '''
25     配置 log 输出到文件 和 控制台:
26     即 需要2个处理器:
27         1-输出到文件
28         2-输出到控制台
29     '''
30     logfilename = LOG_PATH + r"\%s.txt"%getlogname()
31     logformat_1='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
32     
33     
34     #获取日志器 Logger ,并取名 'mylogger'
35     logger = logging.getLogger('mylogger')
36     logger.setLevel(logging.DEBUG)#统一设置log打印级别
37     logger.handler = []
38     
39     #创建处理器 Handler:fileHandler、streamHandler
40     fileHandler = logging.FileHandler(logfilename)#输出到文件
41     fileHandler.setFormatter(logging.Formatter(logformat_1))
42     
43     streamHandler = logging.StreamHandler()#输出到控制台
44     streamHandler.setLevel(logging.ERROR)#可单独对handler设置log打印级别
45     logformat_2=' %(name)s-%(asctime)s - %(module)s-%(funcName)s[line:%(lineno)d] - %(levelname)s: %(message)s'
46     streamHandler.setFormatter(logging.Formatter(logformat_2))
47     
48     #将处理器添加到日志器中
49     logger.addHandler(fileHandler)
50     logger.addHandler(streamHandler)
51     
52     print('logConfig_2配置完成')
53     return logger
54 #全局变量
55 logger = logConfig_2()#配置log,在其他模块中引用的时候直接运用logger,不能再次创建
56 
57 def getlogname():
58     logfilename = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
59     return logfilename                   
60                     
61 
62 if __name__ == '__main__':
63     #logging.debug('debug message %s - %d ......','hello', 1)
64 
65     logger.debug('debug message')
66     logger.info('info message')
67     logger.warning('warning message')
68     logger.error('error message')
69     logger.critical('critical message')

其他模块中引用:

 1 import logging
 2 import loggingtest1
 3 from logConfig import *
 4 
 5 #logger = logConfig_2()  #不能重新获取,否则会多次打印
 6 logger.debug('debug message')
 7 logger.info('info message')
 8 logger.warning('warning message')
 9 logger.error('error message')
10 logger.critical('critical message')
11 
12 loggingtest1.test()
 1 import logging
 2 from logConfig import *
 3 
 4 #logger = logConfig_2()  #同样不能调用该函数,否则会重复打印,调用n
 5 次打印+n次
 6 
 7 def test():
 8     flag = 'test1-test'
 9     logger.debug('debug message%s',flag)
10     logger.info('info message%s',flag)
11     logger.warning('warning message%s',flag)
12     logger.error('error message%s',flag)
13     logger.critical('critical message%s',flag)

注意:不能多次创建处理器(handler),否则会打印+n次,解决办法就是定义全局变量,使用同一个logger去打印