Python模块之 - logging

时间:2021-09-09 05:06:37

日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法。本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表。

Logging模块构成

组成

主要分为四个部分:

  • Loggers:提供应用程序直接使用的接口
  • Handlers:将Loggers产生的日志传到指定位置
  • Filters:对输出日志进行过滤
  • Formatters:控制输出格式

日志级别

Level Numeric value When it’s used
DEBUG 10 Detailed information, typically of interest only when diagnosing problems.
INFO 20 Confirmation that things are working as expected.
WARNING 30 An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected.
ERROR 40 Due to a more serious problem, the software has not been able to perform some function.
CRITICAL 50 A serious error, indicating that the program itself may be unable to continue running.
NOSET 0 getattr(logging, loglevel.upper())

默认级别是WARNING,可以使用打印到屏幕上的方式记录,也可以记录到文件中。Python模块之 - logging

使用示例

下面的代码展示了logging最基本的用法。

 # import logging
#
# logging.basicConfig(filename="log.txt",
# level=logging.DEBUG,
# format="%(asctime)s %(message)s",
# datefmt="%Y-%m")
# logging.debug("SS") """
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levename)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 用户输出的消息 """ # 同时输出到文件,屏幕
import logging class IgnoreBackupLogFilter(logging.Filter):
"""过滤带db backup 的日志""" def filter(self, record): # 固定写法
# true 不记录
return "db backup" not in record.getMessage() # 1、生成logger对象
logger = logging.getLogger("web")
logger.setLevel(logging.DEBUG) # 默认是warning
# 1、1 把filter对象添加到logger中
logger.addFilter(IgnoreBackupLogFilter()) # 2、生成handler对象
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# fh = logging.FileHandler("web.log") # 写到那个文件下
from logging import handlers
fh = handlers.TimedRotatingFileHandler("web.log",when="S",interval=5,backupCount=3)
fh.setLevel(logging.WARNING)
# 2.1 把handler对象 绑定到logger
logger.addHandler(ch)
logger.addHandler(fh) # 3、生成formatter对象
console_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s - %(message)s ")
file_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(lineno)d - %(filename)s - %(message)s ")
# 3、1 把formatter对象 绑定到handler对象
ch.setFormatter(console_formatter)
fh.setFormatter(file_formatter) logger.debug("s")
logger.info("d")
logger.warning("g")
logger.error("a324")
logger.info("db backup 2314") # globl debug
# console info
# file warning # 全局设置为DEBUG后,console handler 设置为INFO,如果输出的日志级别是debug,那就不输出 """
日志自动截断
"""
# 按文件大小截断
# from logging import handlers
# fh = handlers.RotatingFileHandler("web.log", maxBytes=100, backupCount=13) # 文件最大100个字节,最多保留3个文件,时间最早的删除
# 按时间长短截断
# from logging import handlers
# fh = handlers.TimedRotatingFileHandler("web.log",when="S",interval=5,backupCount=3)