logging模块详解

logging模块

import logging

# 1.生成一个logger对象
logger = logging.getLogger()

# 2.设置日志格式
formatter = logging.Formatter(fmt="%(asctime)s - %(levelname)s :  %(message)s", datefmt='%Y-%m-%d %H:%M:%S')

# 3.生成Handler对象
handler = logging.FileHandler('log_test.log', encoding='utf-8')  # FileHandler表示将日志保存到文件中

# 4.为Handler对象设置日志格式
handler.setFormatter(formatter)

# 5.为logger对象添加Handler处理器
logger.addHandler(handler)

# 6.设置日志级别
logger.setLevel(logging.INFO)

# 设置需要的日志信息
logger.info('good')
logger.debug('debug')   # 级别低于info,不会输出


# 结果在log_test.log中
# 2020-06-08 17:26:52 - INFO :  good

一、Logger对象

logging.getLogger('区分logger属于那个功能的日志')

区分日志是属于那个功能的日志

二、Level日志级别

CRITICAL > ERROR > WARNING > INFO > DEBUG

日志错误程度越高,级别越高

  • critical :日志设为该等级,只打印critical级别的日志,一个严重的错误,这表明程序本身可能无法继续运行

  • error : 日志设为该等级,打印errorcritical级别的日志,更严重的问题,软件没能执行一些功能

  • warning : 日志设为该等级,打印warningerrorcritical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作

  • info : 日志设为该等级,打印infowarningerrorcritical级别的日志,确认一切按预期运行

  • debug : 日志设为该等级,打印全部的日志,详细的信息,通常只出现在诊断问题上

三、Handler处理器

handler对象负责发送相关的信息到指定目的地

1、StreamHandler

logging.StreamHandler()

输出日志到控制台,使用StreamHandler可以类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。

2、FileHandler

logging.FileHandler(filename, encoding='UTF-8', mode='a')

输出日志在文件中,FileHandler会自动打开filename文件。

filename是文件名字,mode是文件打开方式,默认以a方式打开,encoding指定编码格式。

3、handlers.RotatingFileHandler

logging.handlers.RotaingFileHandler(filename[, mode[, maxBytes[, backupCount]]])

可以管理文件大小,当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。

  • filename指定文件名字

  • mode指定文件打开方式

  • maxBytes指定日志文件的最大文件大小(如果为0,表示无限大,就不存在重命名)。例如,日志名字为log.log,当log.log达到指定的大小之后,会自动将名字改为log.log.1,如果log.log.1已存在,会先把log.log.1改为log.log.2,再log.log重命名为log.log.1,然后创建log.log继续输出日志。

  • backupCount用于指定保留的日志文件的个数。例如,如果指定为2,表示只保留两个日志文件,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除

4、handlers.TimedRotatingFileHandler

logging.handlers.TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])

间隔一定时间就自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间

  • filename指定文件名字

  • interval指定时间间隔

  • when指定时间间隔单位

    • S 秒
    • M 分
    • H 小时
    • D 天
  • backupCount用于指定保留的日志文件的个数。例如,如果指定为2,表示只保留两个日志文件,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除

5、处理器的level

sh.setLevel(),fh.setLevel()

除了logger,handler也可以设置级别,只有两个级别都通过时,才会输出日志。

四、Formatter日志格式

%(asctime)s 打印日志的时间
%(filename)s 打印当前执行程序名称
%(levelname)s 打印日志级别名称
%(message)s 打印日志信息
%(levelno)s 打印日志级别的数值
%(pathname)s 打印当前执行程序的路径
%(funcName)s 打印日志的当前函数
%(lineno)d 打印日志的当前行号
%(thread)d 打印线程id
%(threadName)s 打印线程名称
%(process)d 打印进程ID
logging.Formatter(ftm, dateftm)
  • ftm日志格式,例如%(asctime)s-%(filename)s-%(levelname)s: %(message)s
  • dateftm时间格式,例如:%Y-%m-%d %H:%M:%S

五、日志封装成类

#! /usr/bin/python3
# -*-coding:utf-8-*-

import logging


class Logger:
    def __init__(self, path, clevel=logging.DEBUG, Flevel=logging.DEBUG):
        self.logger = logging.getLogger(path)
        self.logger.setLevel(logging.DEBUG)   # 设置logger级别
        fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')

        # 设置CMD日志
        sh = logging.StreamHandler()
        sh.setFormatter(fmt)
        sh.setLevel(clevel)   # 设置处理器的Level

        # 设置文件日志
        fh = logging.FileHandler(path)
        fh.setFormatter(fmt)
        fh.setLevel(Flevel)		# 设置处理器的Level
        
        self.logger.addHandler(sh)
        self.logger.addHandler(fh)

    def debug(self, message):
        self.logger.debug(message)

    def info(self, message):
        self.logger.info(message)

    def war(self, message):
        self.logger.warn(message)

    def error(self, message):
        self.logger.error(message)

    def cri(self, message):
        self.logger.critical(message)


if __name__ == '__main__':
    logyyx = Logger('yyx.log', logging.ERROR, logging.DEBUG)
    logyyx.debug('一个debug信息')
    logyyx.info('一个info信息')
    logyyx.war('一个warning信息')
    logyyx.error('一个error信息')
    logyyx.cri('一个致命critical信息')

上篇logging:https://www.cnblogs.com/linagcheng/p/9456885.html

原文地址:https://www.cnblogs.com/linagcheng/p/13067901.html