Python的学习之旅———logging模块

日志模块的级别

critical=50
error=40
warning=30
info=20
debug=10
notset=0

1 import logging #默认的日志级别是:warning,默认的输出目标是:终端
2 
3 logging.debug('debug')
4 logging.info('info')
5 logging.warning('warn123')
6 logging.error('error')
7 logging.critical('critical')

logging模块的主要部分

1logger=logging.getLogger()  l

ogger:日志对象,logging模块中最基础的对象,用logging.getLogger(name)方法进行初始化,name可以不填。通常logger的名字我们对应模块名,如聊天模块、数据库模块、验证模块等。

2 Handler 对象

3 Formatter

4 Filter

 1 import logging
 2 #一:Logger对象:负责产生日志信息
 3 logger=logging.getLogger('root')
 4 
 5 
 6 #二:Filter对象:略
 7 
 8 
 9 #三:Handler对象:负责接收Logger对象传来的日志内容,控制打印到终端or文件
10 h1=logging.FileHandler('t1.log')
11 h2=logging.FileHandler('t2.log')
12 h3=logging.StreamHandler()
13 
14 
15 #四:formmater对象
16 #给文件
17 formatter1=logging.Formatter(
18     '%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
19     datefmt='%Y-%m-%d %H:%M:%S %p',
20 )
21 
22 #给终端
23 formatter2=logging.Formatter(
24     '%(asctime)s - %(message)s',
25     datefmt='%Y-%m-%d %H:%M:%S %p',
26 )
27 
28 #五:为handler对象绑定日志格式,设置日志级别
29 #给文件:绑定到Filehandler对象
30 h1.setFormatter(formatter1)
31 h2.setFormatter(formatter1)
32 #给终端:绑定到Streamhandler对象
33 h3.setFormatter(formatter2)
34 
35 #设置日志级别
36 h1.setLevel(30)
37 h2.setLevel(30)
38 h3.setLevel(30)
39 
40 
41 #六:把h1,h2,h3都add给logger,这样logger对象才能把自己的日志交给他们三负责输出
42 logger.addHandler(h1)
43 logger.addHandler(h2)
44 logger.addHandler(h3)
45 logger.setLevel(20) #括号的数字一定要<=Hanlder对象的数字
46 
47 
48 #七:测试
49 # logger.debug('debug')
50 # logger.info('info')
51 # logger.warning('warn123') #30
52 # logger.error('error')
53 # logger.critical('critical')

 用法推荐:

使用字典配置的方法

将配置文件写成字典的形式.

使用 

导入logging

导入logging.config

将写好的字典传给logging.config.dicConfig()

配置字典

 1 """
 2 logging配置
 3 """
 4 
 5 import os
 6 import logging.config
 7 
 8 # 定义三种日志输出格式 开始
 9 
10 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
11                   '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
12 
13 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
14 
15 id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
16 
17 # 定义日志输出格式 结束
18 
19 logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录
20 
21 logfile_name = 'all2.log'  # log文件名
22 
23 # 如果不存在定义的日志目录就创建一个
24 if not os.path.isdir(logfile_dir):
25     os.mkdir(logfile_dir)
26 
27 # log文件的全路径
28 logfile_path = os.path.join(logfile_dir, logfile_name)
29 
30 # log配置字典
31 LOGGING_DIC = {
32     'version': 1,
33     'disable_existing_loggers': False,
34     'formatters': {
35         'standard': {
36             'format': standard_format
37         },
38         'simple': {
39             'format': simple_format
40         },
41     },
42     'filters': {},
43     'handlers': {
44         #打印到终端的日志
45         'console': {
46             'level': 'DEBUG',
47             'class': 'logging.StreamHandler',  # 打印到屏幕
48             'formatter': 'simple'
49         },
50         #打印到文件的日志,收集info及以上的日志
51         'default': {
52             'level': 'DEBUG',
53             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
54             'formatter': 'standard',
55             'filename': logfile_path,  # 日志文件
56             'maxBytes': 1024*1024*5,  # 日志大小 5M
57             'backupCount': 5,
58             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
59         },
60     },
61     'loggers': {
62         #logging.getLogger(__name__)拿到的logger配置
63         '': {
64             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
65             'level': 'DEBUG',
66             'propagate': True,  # 向上(更高level的logger)传递
67         },
68     },
69 }
70 
71 
72 def load_my_logging_cfg():
73     logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
74     logger = logging.getLogger(__name__)  # 生成一个log实例
75     logger.info('It works!')  # 记录该文件的运行状态
76 
77 if __name__ == '__main__':
78     load_my_logging_cfg()
79 
80 logging配置文件
logging

 logger=logging.getLogger(name) 获取logger

此处的name对应的是字典中loggers选项 ,如下

 1  'loggers': {
 2         #logging.getLogger(__name__)拿到的logger配置
 3         # l1=logging.getLogger('collect')拿到的logger配置
 4         # l2=logging.getLogger('l1')拿到的logger配置
 5         '': {
 6             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
 7             'level': 'DEBUG',
 8             'propagate': True,  # 向上(更高level的logger)传递
 9         },
10         'collect': {
11             'handlers': ['collect', ],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
12             'level': 'DEBUG',
13             'propagate': False,  # 向上(更高level的logger)传递
14         },

这个字典一个选项默认是空.这样你传入的参数可以使用name=__name__ 的形式传入参数.这么传入参数的逻辑是传入的参数

1 是'__main__' 或者是代码所在的文件名.无论哪种,在字典中都没有对应的值,logging模块做了一个判断,获取的是字典中' '的选项

2 传入的是字典中对应的名字 'collect'那就获取了对应的配置选项.

原文地址:https://www.cnblogs.com/surehunter/p/7725361.html