【Python】日志logging模块

1,日志级别

DEBUG:打印调试信息,级别最低
INFO:打印正常的操作信息
WARNING:打印警告信息
ERROR:打印错误信息
CRITICAL:打印致命的错误信息,等级最高

测试程序 

# -*- coding: utf-8 -*-

import logging

if __name__ == "__main__":
    logging.debug('DEBUG级别')
    logging.info('INFO级别')
    logging.warning('WARNING级别')
    logging.error('ERROR级别')
    logging.critical('CRITICAL级别')

打印结果:

发现只输出下面三条信息,这是因为logging是分级别的,上面5个级别的信息从上到下依次递增,可以通过设置logging的level,使其只打印某个级别以上的信息。默认等级是 WARNING,所以只有 WARNING 以上级别的日志被打印出来。 如果想把debug和info也打印出来,可以使用 basicConfig 对其进行配置:

# -*- coding: utf-8 -*-

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG) #设置log默认级别为DEBUG
    logging.debug('DEBUG级别')
    logging.info('INFO级别')
    logging.warning('WARNING级别')
    logging.error('ERROR级别')
    logging.critical('CRITICAL级别')

打印结果:添加logging.basicConfig(level=logging.DEBUG)设置日志级别,DEBUG及以上的日志级别被打印出来。

 

 2,日志输出格式

%(name)s:Logger的名字

%(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:打印日志信息

 如:filefmt = "%(asctime)s: %(levelname)s: [Func:%(funcName)s]: %(message)s: %(filename)s[line:%(lineno)d]"

打印日志格式如下:

3,日志输出到日志文件

最简单方式:

logging.basicConfig(format="%(asctime)s: %(levelname)s: [Func:%(funcName)s]: %(message)s: %(filename)s[line:%(lineno)d]", level=logging.DEBUG, filename="log.txt", filemode="a")

 但是进行这样的操作之后,发现控制台不输出了,怎么做到既输出到控制台又写入到文件呢?

按照如下处理,既能输出到日志文件,又可以打印到控制台:完整程序如下

# -*- coding: utf-8 -*-

import logging
from logging import handlers
import os,time

# 设置日志打印格式
filefmt    = "%(asctime)s: %(levelname)s: [Func:%(funcName)s]: %(message)s: %(filename)s[line:%(lineno)d]"
consolefmt = "%(asctime)s: %(levelname)s: [Func:%(funcName)s]: %(message)s: %(filename)s[line:%(lineno)d]"

class Logger(object):
    def __init__(self, fileName, level=logging.DEBUG):
        # 1:创建日志对象
        # logging.basicConfig(level=logging.DEBUG) // 不能加这条配置,加上会打印重复信息
        self.logger = logging.getLogger(fileName)
        self.logger.setLevel(level=level)
        path = os.path.dirname(os.path.abspath(__file__))
        self.logFileName = os.path.join(path, fileName)

    def file_handle(self):
        # 创建日志文件句柄
        file_handle = logging.FileHandler(filename=self.logFileName, mode="a", encoding="utf-8")
        filefmatter = logging.Formatter(fmt=filefmt)
        file_handle.setFormatter(fmt=filefmatter)
        return file_handle

    def console_handle(self):
        # 1,控制台日志
        console_handle = logging.StreamHandler()
        # 2,设置控制台日志输出等级
        console_handle.setLevel(level=logging.DEBUG)
        # 3,设置文件日志格式
        consolefmatter = logging.Formatter(fmt=consolefmt)
        console_handle.setFormatter(fmt=consolefmatter)
        return console_handle

    def get_console_logfile_logger(self):
        """
        获取日志管理器:将日志保存到日志文件同时打印到控制台
        :return:
        """
        self.logger.addHandler(self.file_handle())
        self.logger.addHandler(self.console_handle())
        return self.logger

    def get_console_logger(self):
        """
        获取日志管理器:仅将日志打印在控制台
        :return:
        """
        self.logger.addHandler(self.console_handle())
        return self.logger

    def get_file_logger(self):
        """
        获取日志管理器:仅将日志添加到日志文件
        :return:
        """
        self.logger.addHandler(self.file_handle())
        return self.logger

    def get_auto_segmentation_logger_by_time(self, filename, when="D"):
        """
        获取日志管理器:根据时间自动分割日志文件
        :return:
        """
        file_handler = handlers.TimedRotatingFileHandler(filename=filename, when=when)
        file_handler.setLevel(logging.DEBUG)
        file_handler.setFormatter(filefmt)

        return file_handler

    def get_auto_segmentation_logger_by_size(self, size=12328960):
        """
        获取日志管理器:根据日志文件大小自动分割日志文件,默认10M=1024*1024*10
        :return:
        """
        file_handler = handlers.RotatingFileHandler(filename=self.logFileName, maxBytes=size)
        file_handler.setLevel(logging.DEBUG)
        file_handler.setFormatter(filefmt)

        return file_handler

if __name__ == "__main__":
    logger = Logger("log.txt").get_console_logfile_logger()
    logger.debug('DEBUG:打印调试信息,级别最低')
    logger.info('INFO:打印正常的操作信息')
    logger.warning('WARNING:打印警告信息')
    logger.error('ERROR:打印错误信息')
    logger.critical('CRITICAL:打印致命的错误信息,等级最高')

 上述Logger类中 get_console_logfile_logger()表示获取同时将日志打印到控制台和保存到日志文件,测试如下。

if __name__ == "__main__":
    logger = Logger("log.txt").get_console_logfile_logger()
    logger.debug('DEBUG:打印调试信息,级别最低')
    logger.info('INFO:打印正常的操作信息')
    logger.warning('WARNING:打印警告信息')
    logger.error('ERROR:打印错误信息')
    logger.critical('CRITICAL:打印致命的错误信息,等级最高')

日志文件信息:

控制台信息:

 日志文件和控制台显示日志信息完全一致。也可以定制不同的显示格式。

4, 自动分割日志文件

当日志比较大或者时间比较久需要对日志文件进行分割,方便管理。python 提供了两个分割文件处理器:
logging.handlers.RotatingFileHandler : 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件。
logging.handlers.TimedRotatingFileHandler:按照时间自动分割日志文件。

    def get_auto_segmentation_logger_by_time(self,when="D"):
        """
        获取日志管理器:根据时间自动分割日志文件
        :return:
        """
        file_handler = handlers.TimedRotatingFileHandler(filename=self.logFileName, when=when)
        file_handler.setLevel(logging.DEBUG)
        file_handler.setFormatter(filefmt)
        self.logger.addHandler(file_handler)

        return self.logger

    def get_auto_segmentation_logger_by_size(self, size=12328960):
        """
        获取日志管理器:根据日志文件大小自动分割日志文件,默认10M=1024*1024*10
        :return:
        """
        file_handler = handlers.RotatingFileHandler(filename=self.logFileName, maxBytes=size)
        file_handler.setLevel(logging.DEBUG)
        file_handler.setFormatter(filefmt)
        self.logger.addHandler(file_handler)

        return self.logger

测试按s自动分割日志文件:---自动分割日志没有调通,暂不可用

TimedRotatingFileHandler类参数详解如下:
filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None
#interval是时间间隔
#backupCount是备份文件的个数,如果超过这个个数,就会自动删除
#when是间隔的时间单位,单位有以下几种:
    # S 秒
    # M 分
    # H 小时、
    # D 天、
    # W 每星期(interval==0时代表星期一)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: logging模块Python标准库中的一个模块,用于记录程序运行时的日志信息。它提供了一种灵活的方式来控制日志记录的级别、格式和输出目标,可以将日志信息输出控制台、文件、网络等不同的位置。使用logging模块可以帮助我们更好地理解程序的运行情况,快速定位问题并进行调试。在使用logging模块时,我们需要定义一个Logger对象,然后使用它来记录日志信息。Logger对象可以设置多个Handler对象,每个Handler对象可以设置不同的日志级别和输出目标。日志级别包括DEBUG、INFO、WARNING、ERROR和CRITICAL五个级别,级别越高,记录的信息越重要。在记录日志信息时,我们可以使用不同的格式化字符串来控制日志信息输出格式,例如时间、级别、模块名、函数名等。除了基本的日志记录功能外,logging模块还提供了一些高级功能,例如日志回滚、日志过滤、日志轮换等,可以根据实际需求进行配置。 ### 回答2: logging模块Python内置的一个用于输出日志信息模块,通过它我们可以记录程序运行时产生的各种信息,帮助我们了解程序运行过程中的动态情况,有助于快速排查问题和系统优化。 logging模块的主要特点: 1.提供了5种不同的日志级别控制,从低到高分别是DEBUG、INFO、WARNING、ERROR、CRITICAL,不同级别的日志信息可以按照需求进行输出和记录。 2.可以灵活配置日志输出位置和格式,包括控制台输出、文件输出和邮件输出等,还可以通过配置格式化器进行日志信息格式化。 3.支持输出、记录异常信息及堆栈信息等,便于排查问题。 以下是logging模块的一些常用方法及用法: 1. basicConfig():进行一些基本配置,如日志级别、输出格式、输出位置等,通常在程序入口处调用。 2. getLogger():获取一个logger实例,可以用来输出日志信息,常用于创建模块级别的日志记录器。 3. setLevel():设置日志级别,只有比设置级别高的日志才会输出。 4. addHandler():添加处理器,将日志信息发送到指定的输出位置,比如文件、控制台等。 5. Formatter():定义日志信息的格式化方式,可以定义不同的格式化字符串实现不同的输出格式。 6. 异常处理:可以使用try-except语句结合logging模块来记录异常信息及堆栈信息,方便排查问题。 7. 多模块日志处理:使用getLogger()方法可以创建多个记录器,为不同的模块或功能区分开来,方便排查问题。 总之,logging模块Python中非常有用的一个模块,它可以帮助我们记录程序运行中的各种信息,并提供各种定制化的输出方式,有助于提高代码的可读性和可维护性,快速排查问题。同时,也要注意在实际使用中避免频繁输出日志信息导致程序性能下降。 ### 回答3: Python中的logging模块是一个优秀的记录日志的方式,可以将程序中任何需要记录的信息输出到特定的位置,如控制台、文件或者网络。logging模块提供了强大的日志功能,可以将输出日志进行分级、格式化、过滤、存储等多种功能,可以让开发者方便地实现程序日志输出。下面将对logging模块的详细使用进行介绍。 logging模块的主要概念包括Logger、Handler、Formatter。Logger表示一个日志记录器对象,可以设定日志记录级别、输出地点和格式;Handler表示在哪里输出日志,不同Handler可以输出到不同位置;Formatter表示日志输出的格式。 使用logging模块记录日志需要以下步骤: 1. 创建一个Logger对象,用于记录日志信息。Logger对象可以指定名字,如果不指定,会使用rootLogger。 ```python import logging logger = logging.getLogger("mylogger") ``` 2. 设置Logger的级别,只有高于该级别的日志才会输出。默认级别为warning。 ```python logger.setLevel(logging.DEBUG) ``` 3. 创建Handler对象,用于将日志信息输出到指定位置。常用的Handler有StreamHandler(输出控制台)、FileHandler(输出到文件)、HTTPHandler(输出到网络)等。 ```python stream_handler = logging.StreamHandler() file_handler = logging.FileHandler("log.txt") ``` 4. 设置Handler的级别,如果不设置,默认级别为warning。 ```python stream_handler.setLevel(logging.INFO) file_handler.setLevel(logging.ERROR) ``` 5. 创建Formatter对象,用于确定日志信息输出格式。 ```python formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) file_handler.setFormatter(formatter) ``` 6. 将Handler添加到Logger对象中。 ```python logger.addHandler(stream_handler) logger.addHandler(file_handler) ``` 7. 使用Logger对象记录日志。 ```python logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message') ``` 日志级别从高到低为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET。 最后,logging模块还可以进行日志的过滤、日志的旋转等操作,可以根据实际需求进行设置。总的来说,logging模块Python程序提供了一种方便、灵活的日志记录方式,可以帮助开发者更好地了解程序的运行状态,方便地进行调试和问题排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值