python的logging模块

1、logging模块介绍

  这个模块为应用与库实现了灵活的事件日志系统的函数与类。

  我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间、描述信息以及错误或者异常发生时候的特定上下文信息。Python中自带的logging模块提供了标准的日志接口,在debug时使用往往会事半功倍。

  logging的优势就在于可以控制日志的级别,把不需要的信息进行过滤,且可以决定它输出到什么地方、如何输出,还可以通过控制等级把特定等级的信息输出到特定的位置等。logging一共分为四个部分:

    • logger:记录器暴露了应用程序代码直接使用的接口。

    • handler:处理器将日志记录(由记录器创建)发送到适当的目标。

    • Filter:过滤器提供了更细粒度的功能,用于确定要输出的日志记录。

    • Formater:格式器指定最终输出中日志记录的样式

2、日志等级

logging将logger的等级划分成5个level,由低到高分别是DEBUG、INFO、WARNING、ERROE、CRITICAL,默认是WARNING级别,CRITICAL最高,相关等级说明如下:

Level说明
DEBUG 输出详细的运行信息,主要用于调试,追踪问题时使用
INFO 输出正常的运行的信息,一切按预期进行的情况
WARNING 一些意想不到的或即将会发生的情况,比如警告:内存空间不足,但不影响程序运行
ERROR 由于某些问题,程序的一些功能会受到影响,还可以继续运行
CRITICAL 一个严重的错误,表明程序本身可能无法继续运行

​ 这些等级的日志中低包含高,比如INFO,会收集INFO及以上等级的日志,DEBUG等级的日志将不进行收集。

3、logger 记录器

记录器有以下的属性和方法。注意 永远 不要直接实例化记录器,应当通过模块级别的函数 logging.getLogger(name) 。多次使用相同的名字调用 getLogger() 会一直返回相同的 Logger 对象的引用。

 日志是怎么被收集和输出的呢?答案就是日志收集器,设置一个收集器,把指等级的日志信息输出到指定的地方,控制台或文件等,其工作过程大致如下:

4、handler日志处理器

上面例子中设置的收集器都是输出到控制台,除此我们还可以输出到文件中。

​ Handlers(处理器)的作用就是将logger发过来的信息进行准确地分配,送往正确的地方。比如,送往控制台、文件或者是两者。它决定了每个日志收集器的行为,是创建收集器之后需要配置的重点区域。每个Handler同样有一个日志级别,一个logger可以拥有多个handler也就是说logger可以根据不同的日志级别将日志传递给不同的handler。当然也可以相同的级别传递给多个handler,这就根据需求来灵活的配置了。

​ 下面实例中设置了两个handler,一个是输出到控制台,一个是输出到文件中。关键代码:

  • logging.StreamHandler:输出到控制台的处理器
  • logging.FileHandler:输出到文件的处理器
  • addHandler:添加处理器
  • removeHandler:移除处理器

5、Fomter日志格式器

顾名思义,对日志进行格式化,因为常规的日志输出并不直观美观,通过美化日志的输出格式,可以让我们阅读起来更加舒服。

​ format常用格式如下:

  • %(name)s: 打印收集器名称
  • %(levelno)s: 打印日志级别的数值
  • %(levelname)s: 打印日志级别名称
  • %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
  • %(filename)s: 打印当前执行程序名
  • %(funcName)s: 打印日志的当前函数
  • %(lineno)d: 打印日志的当前行号
  • %(asctime)s: 打印日志的时间
  • %(thread)d: 打印线程ID
  • %(threadName)s: 打印线程名称
  • %(process)d: 打印进程ID
  • %(message)s: 打印日志信息

理论未完 待更新.............

查看代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Richard_Kong
import logging
from logging import handlers
import sys


class log():
    """
    创建 log 类 供其他类进行调用,只需要对类进行初始化一次 其他类进行调用即可
    """

    def __init__(self, log_level=logging.DEBUG):
        """
        设置log初始化,设置log的输入日志file 和终端输出
        还有按照文件大小进行日志分割
        按照时间进行日志分割
        """
        """设置将log输出到文件log和终端中"""
        """参数when决定了时间间隔的类型,参数interval决定了多少的时间间隔。如when=‘D’,
        interval=2,就是指两天的时间间隔,backupCount决定了能留几个日志文件。超过数量就会丢弃掉老的日志文件"""

        self.logger = logging.getLogger("log")
        self.file_handler = logging.FileHandler("log", "a+")
        self.stream_handler = logging.StreamHandler(sys.stdout)
        self.error_file_handler = logging.FileHandler("error_log", "a+")
        self.time_rotate_fileLogger = logging.handlers.TimedRotatingFileHandler(
            filename="test.log", when="H", interval=2, backupCount=5)
        """设置 log的输出格式 日期+ 日志级别 + 具体日志信息"""
        self.file_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
        self.stream_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
        self.error_file_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
        self.time_rotate_fileLogger.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
        """设置log的输出等级,默认不传等级的级别为DEBUG级别"""
        self.logger.setLevel(log_level)
        self.error_file_handler.setLevel(logging.ERROR)
        self.time_rotate_fileLogger.setLevel(log_level)
        """将handler 添加到logger实例对象中"""
        self.logger.addHandler(self.file_handler)
        self.logger.addHandler(self.stream_handler)
        self.logger.addHandler(self.error_file_handler)
        self.logger.addHandler(self.time_rotate_fileLogger)

    def debug(self, message):
        """
        定义log的debug函数,将message传递进来
        :param message:
        :return:
        """
        self.logger.debug(message)

    def info(self, message):
        """
        定义log的info函数,将message传递进来
        :param message:
        :return:
        """
        self.logger.info(message)

    def warning(self, message):
        """
        定义log的warning函数,将message传递进来
        :param message:
        :return:
        """
        self.logger.warning(message)

    def error(self, message):
        """
        定义log的error函数,将message传递进来
        :param message:
        :return:
        """
        self.logger.error(message)

    def critical(self, message):
        """
        定义log的critical函数,将message传递进来
        :param message:
        :return:
        """
        self.logger.critical(message)


if __name__ == '__main__':
    logger = log()
    logger.debug("this is debug log")
    logger.info("this is info log")
    logger.warning("this is warning log")
    logger.error("this is error log")
    logger.critical("this is critical log")

 

# -*- coding:utf-8 -*-
# Author:Richard_Kong
import logging
from logging import handlers
import sys


class log():
"""
创建 log 类 供其他类进行调用,只需要对类进行初始化一次 其他类进行调用即可
"""

def __init__(self, log_level=logging.DEBUG):
"""
设置log初始化,设置log的输入日志file 和终端输出
还有按照文件大小进行日志分割
按照时间进行日志分割
"""
"""设置将log输出到文件log和终端中"""
"""参数when决定了时间间隔的类型,参数interval决定了多少的时间间隔。如when=‘D’
interval=2,就是指两天的时间间隔,backupCount决定了能留几个日志文件。超过数量就会丢弃掉老的日志文件"""

self.logger = logging.getLogger("log")
self.file_handler = logging.FileHandler("log", "a+")
self.stream_handler = logging.StreamHandler(sys.stdout)
self.error_file_handler = logging.FileHandler("error_log", "a+")
self.time_rotate_fileLogger = logging.handlers.TimedRotatingFileHandler(
filename="test.log", when="H", interval=2, backupCount=5)
"""设置 log的输出格式 日期+ 日志级别 + 具体日志信息"""
self.file_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
self.stream_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
self.error_file_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
self.time_rotate_fileLogger.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
"""设置log的输出等级,默认不传等级的级别为DEBUG级别"""
self.logger.setLevel(log_level)
self.error_file_handler.setLevel(logging.ERROR)
self.time_rotate_fileLogger.setLevel(log_level)
"""handler 添加到logger实例对象中"""
self.logger.addHandler(self.file_handler)
self.logger.addHandler(self.stream_handler)
self.logger.addHandler(self.error_file_handler)
self.logger.addHandler(self.time_rotate_fileLogger)

def debug(self, message):
"""
定义logdebug函数,将message传递进来
:param message:
:return:
"""
self.logger.debug(message)

def info(self, message):
"""
定义loginfo函数,将message传递进来
:param message:
:return:
"""
self.logger.info(message)

def warning(self, message):
"""
定义logwarning函数,将message传递进来
:param message:
:return:
"""
self.logger.warning(message)

def error(self, message):
"""
定义logerror函数,将message传递进来
:param message:
:return:
"""
self.logger.error(message)

def critical(self, message):
"""
定义logcritical函数,将message传递进来
:param message:
:return:
"""
self.logger.critical(message)


if __name__ == '__main__':
logger = log()
logger.debug("this is debug log")
logger.info("this is info log")
logger.warning("this is warning log")
logger.error("this is error log")
logger.critical("this is critical log")
posted @ 2021-07-12 11:47  GalaxyStar  阅读(175)  评论(0编辑  收藏  举报