1). 概述
- 日志模块,很重要:程序调试跟踪、线上故障处理、大数据计算等等。
- 模块导入方式
import logging
- 日志的级别
方法 | 级别描述 |
---|---|
logging.debug("?") | 调试级别,记录的很详细 |
logging.info("?") | 日常登录什么的记录 |
logging.warning("?") | 警告,没有发生错误,但是可能存在潜在的问题 |
logging.error("?") | 程序运行出问题了 |
logging.critical("?") | 程序运行出现了严重的问题 |
级别低的会包含级别高的。
2). 日志输出位置
- 默认输出日志信息到控制台
logging.warning("user attempted weong more than 3 times")
logging.critical("server is down")
- 配置输出日志信息到文件
-
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). 同时输出到屏幕和文件的配置
- 生成logger对象,获得日志
logger = logging.getLogger("web") # 生成logger对象
logger.setLevel(logging.DEBUG) #默认级别为warning,只会输出大于等于这个级别的日志信息,这里设置的优先级最高
- 把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中,功能是进行过滤
- 生成handler对象,将handler绑定到logger对象:屏幕输出
ch = logging.StreamHandler() # handler,屏幕
ch.setLevel(logging.DEBUG) # 可以设置屏幕handler的输出级别,先判断全局,再判断是否满足这里
logger.addHandler(ch)
- 生成handler对象,将handler绑定到logger对象:文件输出
fh = logging.FileHandler("web.log") # handler,文件
fh.setLevel(logging.WARNING) # 可以设置文件handler的输出级别,先判断全局,再判断是否满足这里
logger.addHandler(fh)
- 生成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 文件
- 日志文件到了按照一定规律进行分割配置的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同上
网友评论