1、logging模块介绍
这个模块为应用与库实现了灵活的事件日志系统的函数与类。
我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间、描述信息以及错误或者异常发生时候的特定上下文信息。Python中自带的logging模块提供了标准的日志接口,在debug时使用往往会事半功倍。
logging的优势就在于可以控制日志的级别,把不需要的信息进行过滤,且可以决定它输出到什么地方、如何输出,还可以通过控制等级把特定等级的信息输出到特定的位置等。logging一共分为四个部分:
logger:记录器暴露了应用程序代码直接使用的接口。
handler:处理器将日志记录(由记录器创建)发送到适当的目标。
Filter:过滤器提供了更细粒度的功能,用于确定要输出的日志记录。
Formater:格式器指定最终输出中日志记录的样式
2、日志等级
logging将logger的等级划分成5个level,由低到高分别是DEBUG、INFO、WARNING、ERROE、CRITICAL,默认是WARNING级别,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):
"""
定义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")
原文:https://www.cnblogs.com/1050619969kong/p/15001450.html