22.logging模块

2019-12-26  本文已影响0人  哈哈大圣

1). 概述

  1. 日志模块,很重要:程序调试跟踪、线上故障处理、大数据计算等等。
  2. 模块导入方式
import logging
  1. 日志的级别
方法 级别描述
logging.debug("?") 调试级别,记录的很详细
logging.info("?") 日常登录什么的记录
logging.warning("?") 警告,没有发生错误,但是可能存在潜在的问题
logging.error("?") 程序运行出问题了
logging.critical("?") 程序运行出现了严重的问题

级别低的会包含级别高的。

2). 日志输出位置

  1. 默认输出日志信息到控制台
logging.warning("user attempted weong more than 3 times")
logging.critical("server is down")
  1. 配置输出日志信息到文件
    • basicConfig 给出基本的配置
logging.basicConfig(filename = "log_test.org", 
                    level = logging.INFO,
                    format = "%(asctime)s:%(message)s:%(levelno)s",
                    datefmt = "%Y-%m-%d %I:%M:%S %p"
                    )

logging.debug("debug")
logging.info("info")
logging.warning("warning")

3). format格式

format 描述
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别10-debug ... 50-critical
%(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 用户输出的消息

4). 同时输出到屏幕和文件的配置

  1. 生成logger对象,获得日志
logger = logging.getLogger("web") # 生成logger对象
logger.setLevel(logging.DEBUG) #默认级别为warning,只会输出大于等于这个级别的日志信息,这里设置的优先级最高
  1. 把filter对象添加到logger中
class IgnoreBackupLogFilter(logging.Filter):
    """忽略带db backup的日志"""
    def filter(self, record): #非固定写法
        return "db backup" not in record.getMessage() #如果日志中的信息有db backup 忽略掉这一条日志
        
logger.addFilter(IgnoreBackupLogFilter()) #把filter对象添加到logger中,功能是进行过滤
  1. 生成handler对象,将handler绑定到logger对象:屏幕输出
ch = logging.StreamHandler() # handler,屏幕
ch.setLevel(logging.DEBUG)   # 可以设置屏幕handler的输出级别,先判断全局,再判断是否满足这里
logger.addHandler(ch)
  1. 生成handler对象,将handler绑定到logger对象:文件输出
fh = logging.FileHandler("web.log") # handler,文件
fh.setLevel(logging.WARNING)        # 可以设置文件handler的输出级别,先判断全局,再判断是否满足这里
logger.addHandler(fh)
  1. 生成formatter对象;formatter对象绑定handler
console_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(lineno)d")  #formatter 对象 屏幕
file_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(lineno)d")  #formatter 对象 文件
ch.setFormatter(console_formatter)  #formatter对象绑定handler 屏幕
fh.setFormatter(file_formatter) #formatter对象绑定handler 文件
  1. 日志文件到了按照一定规律进行分割配置的Handler设置
from logging import handlers

# 按照大小截断,backupCount表示最多存几个
fh = handlers.RotatingFileHandler("web.log",maxBytes=10,backupCount=3) 

# when 按照时间S M H D W midnight(秒 分 时 天 每星期<interval=0代表星期一> 每天凌晨) interval设定when的长度
fh = handlers.TimedRotatingFileHandler("web.log",when="W",interval=0,backupCount=3)

绑定handler同上

上一篇 下一篇

猜你喜欢

热点阅读