一、基本用法
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=" " 的配置
原文地址:https://www.cnblogs.com/Smart1san/p/9206815.html
时间: 2024-10-18 21:57:49