day17 logging 日志模块

Posted smart1san

tags:

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

一、基本用法

logging模块的四个对象:

logger :产生日志对象

Filter :过滤日志对象(不常用)

Handler :接收日志,控制打印到不同的路径(Filehandler打印到文件中,StreamHandler打印到控制台)

Formatter :定制不同的日志格式对象,绑定给不同的Handler对象使用

 1 import logging
 2 import sys
 3 
 4 #获取logger实例,参数为空时返回root logger
 5 logger=logging.getLogger("日志名")
 6 
 7 #指定logger输出格式
 8 formatter=logging.Formatter(%(asctime)s-%(levelname)s-%(message)s)
 9 #asctime: 时间
10 #levelname:等级名称
11 #message:需要提示的信息
12 
13 #文件输出日志
14 file_handler=logging.FileHandler("test.log")
15 file_handler.setFormatter(formatter)   # 通过setFormatter指定日志输出格式
16 
17 #控制台输出日志
18 console_handler=logging.StreamHandler(sys.stdout)
19 console_handler.formatter=formatter #也可直接为formatter赋值
20 
21 #为logger添加日志处理器
22 logger.addHandler(file_handler)
23 logger.addHandler(console_handler)
24 
25 #指定最低输出级别,正常情况下默认为warn级别
26 logger.setLevel(logging.INFO)
27 
28 #如需输出不同程度级别的log,可以自由选择
29 logger.debug("DEBUG")  #调试
30 logger.info("INFO")   #信息
31 logger.warn("WARN")   #警告
32 logger.error("ERROR") #报错
33 logger.fatal("FATAL")   # 与critical一样
34 logger.critical("CRITICAL")   #崩溃
35 
36 
37 
38 #移除一些日志处理器
39 logger.removed(file_handler)

 

二、应用?????

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

 

   ?从字典中加载配置:logging.config.dictConfig(settings.LOGGING_DIC)

  ?logger对象都是配置到字典的 logges 键对应的子字典中的,

        于是我们如需获取不同的logger对象就是

        logger=logging.getLogger("loggers子字典的 key 名")

?Question: 问题是 logger 名的 logger 对象都公用一段配置,需定义多个key,这是不现实的

 ??  解决方式:定义一个空的 key

loggers: {
‘‘: {
handlers: [default, console], 
level: DEBUG,
propagate: True, 
},
}

  当我们再次去取 logger 对象时:

logging.getLogger(__name__),不同的文件__name__不同,这保证了打印日志时标识信息不同,

但是当拿着该名字取 loggers 里找 key 名时却发现找不到,于是默认使用 key=" " 的配置

以上是关于day17 logging 日志模块的主要内容,如果未能解决你的问题,请参考以下文章

day6 subprocess模块logging模块

day5-logging模块

python基础学习日志day5---logging模块

python-day28--logging模块

argparse 代码片段只打印部分日志

python_day6 log模块