python之路--day15--常用模块之logging模块

Posted 木夂各

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之路--day15--常用模块之logging模块相关的知识,希望对你有一定的参考价值。

常用模块

  1 logging模块

  日志级别:Noset (不设置)

      Debug---(调试信息)----也可用10表示

      Info--(消息信息)----也可用20表示

      Warning---(警告信息)----也可用30表示

      Error------(错误消息)----也可用40表示

      Critical---(严重错误)---也可用50表示

  默认级别是Warning,默认打印到终端 

 1 import logging
 2 
 3 logging.debug(调试debug)
 4 logging.info(消息info)
 5 logging.warning(警告warn)
 6 logging.error(错误error)
 7 logging.critical(严重critical)
 8 
 9 ‘‘‘
10 WARNING:root:警告warn
11 ERROR:root:错误error
12 CRITICAL:root:严重critical
13 ‘‘‘

 

2,logging模块全局配置,针对所有logger有效

  logging模块的四个对象:  

Logger:产生日志的对象
Filter:过滤日志的对象(不常用,可以忽略)
Handler:接受日志然后控制打印到不同的地方,
            FileHandler用来打印到文件中,StreamHandler用来打印到终端
Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式

  

配置参数:

  filename:用指定的文件名创建FiledHandler,这样日志会被存储在文件中

  filemode:文件打开方式,在指定了filename时使用这个参数,默认值为‘a’,还可以指定为‘w’

  format:指定handler使用的日志显示格式

  datafmt:指定日期时间格式

  level:设置rootlogger的日志级别

  stream:用指定的stream创建StreamHandler,可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。如果同时列出filename和stream两个参数,那么stream参数会被忽略

 

  格式:

%(name)s:Logger的名字,并非用户名,详细查看

%(levelno)s:数字形式的日志级别

%(levelname)s:文本形式的日志级别

%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有

%(filename)s:调用日志输出函数的模块的文件名

%(module)s:调用日志输出函数的模块名

%(funcName)s:调用日志输出函数的函数名

%(lineno)d:调用日志输出函数的语句所在的代码行

%(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示

%(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数

%(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

%(thread)d:线程ID。可能没有

%(threadName)s:线程名。可能没有

%(process)d:进程ID。可能没有

%(message)s:用户输出的消息

 

Logger与Handler的级别

  logger是第一级过滤,然后才能到handler,我们可以给logger和handler同时设置level,但是需要主要的是:

  无法通过logger级别过滤,日志就不会打印;

  无法通过handler级别过滤,日志也不会打印

  只有同时通过logger级别,和handler级别过滤的日志才能打印

 

定义好的logging配置文件(修改相关信息之后就可以在其他地方使用)

 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配置文件

    注意:

    logger字典定义一个空key的原因:

    

 1     
 2 #我们的解决方式是,定义一个空的key
 3     loggers: {
 4         ‘‘: {
 5             handlers: [default, console], 
 6             level: DEBUG,
 7             propagate: True, 
 8         },
 9 
10 }
11 
12 这样我们再取logger对象时
13 logging.getLogger(__name__),不同的文件__name__不同,这保证了打印日志时标识信息不同,但是拿着该名字去loggers里找key名时却发现找不到,于是默认使用key=‘‘的配置

 

以上是关于python之路--day15--常用模块之logging模块的主要内容,如果未能解决你的问题,请参考以下文章

python之路--day15---软件开发目录规范

Python 之路 Day5 - 常用模块学习

Python 之路 Day5 - 常用模块学习

Python全栈之路----常用模块----logging模块

python之路_day96_爬虫之requests模块补充

Python 之路 Day06 模块