三十五、Python--日志logging模块

目录

1.什么是日志?

2.日志有什么用?

3.日志的五个级别

4.logging模块

5.logging日志系统的四大组件

6.logging.getlogger()

7.让每个文件都有专属的日志记录文件

8.日志记录算法


1.什么是日志?

        日志是一种可以追踪某些软甲运行时所发生的事情的方法。

2.日志有什么用?

        程序调试

        排错

        用户行为分析

3.日志的五个级别

        日志登记   数值表示    描述
        debug      10       最详细的日志信息,用于诊断问题
        INFO       20       详细日志信息仅次于DEBUG,记录关键节点的信息
        WARNING    30(默认)  当前不期望发生的事情
        ERROR      40       发生错误导致某些功能不能正常使用     
        CRITICAL   50       发生严重错误导致程序不能继续运行时使用

4.logging模块

        4.1使用logging模块

使用import导入模块logging

三十五、Python--日志logging模块_第1张图片

日志的默认级别为warning,只有不低于warning级别的日志才会输出 

        4.2修改日志配置 

import logging
logging.basicConfig(level=logging.DEBUG, format = " %(asctime)s - %(levelname)s -%(message)s", filename = "test.txt")
#level参数可以调整日志记录级别,这里调整为debug,即五种日志都会记录
#format参数调整日志的格式,这里调整为显示当前时间+日志级别+日志信息
#filename参数为调整为输出到文件,不输出到屏幕
logging.debug("This is a debug")
logging.info("This is a info")
logging.warning("This is a warning")
logging.error("This is a error")
logging.critical("This is a critical")

三十五、Python--日志logging模块_第2张图片 #可以看到日志都记录到了test.txt文件里,五种日志都记录了,且日志格式为我所调整的。

5.logging日志系统的四大组件

        日志器 logger

        处理器 Handler

        过滤器 Filter

        格式器 Formatter

import logging

# 获取logger对象,用于记录日志
logger = logging.getLogger()

# 设置一个日志记录级别
logger.setLevel(logging.DEBUG)

# 创建一个handler,用于写入日志,输出到文件
fh = logging.FileHandler(filename)

# 创建一个handler,用于输出到屏幕
ch = logging.StreamHandler()

# 创建一个formatter,用于处理日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s -%(message)s')

# 绑定formatter 到handler上
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# 绑定handler到logger对象上
logger.addHandler(fh)
logger.addHandler(ch)

# 定义好函数,我们直接调用就可以了

# 记录一条日志
logger.debug("This is a debug")

#我创建了一个格式器formatter,两个处理器fh和ch。

#将格式器绑定到处理器上,然后将处理器绑定到logger对象,接下来我们对logger操作即可。

#记录的一条日志既输出到屏幕上也输出到文件内。

三十五、Python--日志logging模块_第3张图片

6.logging.getlogger()

         获取一个日志器

三十五、Python--日志logging模块_第4张图片

我们查看getlogger函数定义可知,如果有传入指定名称,会返回一个root.name的日志器。

如果没有指定名称,则会返回一个root日志器。

root相当于linux中的/,指定名称相当于在root下一级创建。

def getLogger(name=None):
    """
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    """
    if not name or isinstance(name, str) and name == root.name:
        return root
    return Logger.manager.getLogger(name)

7.让每个文件都有专属的日志记录文件

        使用函数包装可以实现,在一个文件logset中创建一个产生日志文件的函数

import logging
def set_log(filename):
    # 获取logger对象,用于记录日志
    logger = logging.getLogger()

    #设置日志记录级别
    logger.setLevel(logging.DEBUG)

    # 创建一个handler,用于写入日志,输出到文件
    fh = logging.FileHandler(filename)

    # 创建一个handler,用于输出到屏幕
    ch = logging.StreamHandler()

    # 创建一个formatter,用于处理日志格式
    formatter = logging.Formatter('%(asctime)s - %(levelname)s -%(message)s')

    # 绑定formatter 到handler上
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)

    # 绑定handler到logger对象上
    logger.addHandler(fh)
    logger.addHandler(ch)

#在其余文件中导入logset函数的set_log方法,调用即可产生自定义的日志文件 

import logging
from logset import set_log
set_log("logchild.txt")

8.日志记录算法

        轮询记录

import logging
from logging.handlers import TimedRotatingFileHandler,RotatingFileHandler
# 获取logger对象,用于记录日志
def set_log(filename):
    logger = logging.getLogger()

    # 创建一个handler,用于写入日志,输出到文件

    fh = TimedRotatingFileHandler(filename, when = "S", interval = 1, backupCount = 3)
                                            # 文件名          秒              1       3个日志
    #fh = RotatingFileHandler(filename, maxBytes=500, backupCount=2)
    #写入500个字节就轮转一次
    # 创建一个handler,用于输出到屏幕
    # fh = logging.FileHandler(filename)
    ch = logging.StreamHandler()

    # 创建一个formatter,用于处理日志格式
    formatter = logging.Formatter('%(asctime)s - %(levelname)s -%(message)s')

    # 绑定formatter 到handler上
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)

    # 绑定handler到logger对象上
    logger.addHandler(fh)
    logger.addHandler(ch)
    logger.setLevel(logging.DEBUG)
import time
set_log("RR.txt")
logger = logging.getLogger(__name__)
for i in range(5):
    time.sleep(0.5)
    logger.warning("this is rotate time")

你可能感兴趣的:(Python,python)