美文网首页
python logging详解及运用

python logging详解及运用

作者: dd1991 | 来源:发表于2022-01-06 19:51 被阅读0次

很多小伙伴平时写代码的时候,大部分情况利用print()函数来进行一些日志的打印,但是当把代码迁移到测试环境或者生成环境的时候,很难去定位BUG,而在python中,logging就可用来记录一些日志信息,便于我们维护和定位bug..

日志的重要性:

    1.健全自己的代码,便于问题定位和分析

    2.进行程序(代码)的调试

    3.收集程序运行的情况

接下我们开始步入正题:

一、logging日志等级

logging 日志等级

import logging

# 设置打印日志的级别,level级别以上的日志会打印出

# level=logging.DEBUG 、INFO 、WARNING、ERROR、CRITICAL

def log_testing():

# 此处进行Logging.basicConfig() 设置,后面设置无效

        logging.basicConfig(level=logging.ERROR)

        logging.debug('debug,用来打印一些调试信息,级别最低')

        logging.info('info,用来打印一些正常的操作信息')

        logging.warning('waring,用来用来打印警告信息')

        logging.error('error,一般用来打印一些错误信息')

        logging.critical('critical,用来打印一些致命的错误信息,等级最高')

log_testing()

上面的日志目前只会打印在控制台上,业务一般需要保存在文档中,这个时候就需要我们自己去配置相关信息:

二、Logging.basicConfig()

logging.basicConfig()的参数除了日志等级的这个参数可以设置以外,还可以设置其他的参数,比如:

logging.basicConfig()

import logging

# 设置打印日志的级别,level级别以上的日志会打印出

# level=logging.DEBUG 、INFO 、WARNING、ERROR、CRITICAL

def log_testing():

# 此处进行Logging.basicConfig() 设置,后面设置无效

        logging.basicConfig(filename='log.txt',

        format ='%(asctime)s - %(name)s - %(levelname)s - %(message)s-%(funcName)s',

        level=logging.ERROR)

        logging.debug('debug,用来打印一些调试信息,级别最低')

        logging.info('info,用来打印一些正常的操作信息')

        logging.warning('waring,用来用来打印警告信息')

        logging.error('error,一般用来打印一些错误信息')

        logging.critical('critical,用来打印一些致命的错误信息,等级最高')

log_testing()

上述代码产生的日志文件截图如下:

三、Logging组件

Logging中除了以上的一些设置之外,logging还提供了几个组件(类)供我们实现一些特殊的功能,它们主要是:

这些组件共同完成日志的配置和输出:

Logger需要通过handler将日志信息输出到目标位置,目标位置可以是sys.stdout和文件等。

不同的Handler可以将日志输出到不同的位置(不同的日志文件)。

Logger可以设置多个handler将同一条日志记录输出到不同的位置。

每个Handler都可以设置自己的filter从而实现日志过滤,保留实际项目中需要的日志。

formatter实现同一条日志以不同的格式输出到不同的地方。

简单的说就是:日志器作为入口,通过设置处理器的方式将日志输出,处理器再通过过滤器和格式器对日志进行相应的处理操作。

我们来简单的介绍一下这些组件中一些常用的方法:

1.Logger类

2.Handler类

3.Fliter类

看名字大家就知道这是一个过滤类,那么过滤什么呢?

Filter可以被Handler和Logger用来做比之前设置的日志等级level更为细粒度的、更复杂的相关过滤功能。

简单的说Filter是一个过滤器基类,它只允许某个logger层级下的日志事件通过过滤,保存下来。该类定义如下:

classlogging.Filter(name='')filter(record)

过滤举例:

例如用 ‘A.B’ 初始化的 Filter,那么其允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’ 等日志记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不满足过滤的条件。

如果用空字符串来对Filter初始化,所有日志记录的事件都将不会被过滤。

4.Formater类

Formater类主要负责日志的格式化输出的。

可通过logging.basicConfiglogging.Formatter函数来配置日志输出内容。

如:formatter = logging.Formatter(fmt=None, datefmt=None)。

如果不指明 fmt,将默认使用 '%(message)s' ,如果不指明 datefmt,将默认使用 ISO8601 日期格式。

说了这么多,我们先看两个简单的例子:

# 例1

import logging

from logging.handlersimport RotatingFileHandler

def logging_fun():

        # 创建日志的记录等级设

        logging.basicConfig(level=logging.DEBUG)

        # 创建日志记录器,指明日志保存的路径,每个日志文件的最大值,保存的日志文件个数上限

        log_handle = RotatingFileHandler("log.txt",maxBytes=1024 *1024,backupCount=5)

        # 创建日志记录的格式

        formatter = logging.Formatter("format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s-%(funcName)s',")

        # 为创建的日志记录器设置日志记录格式

          log_handle.setFormatter(formatter)

            # 为全局的日志工具对象添加日志记录器

            logging.getLogger().addHandler(log_handle)

            logging.warning('用来用来打印警告信息')

            logging.error('一般用来打印一些错误信息')

            logging.critical('用来打印一些致命的错误信息,等级最高')

logging_fun()

四 :自定义logger日志输出文件

以上介绍的知识点,大家在平时或在实际的项目中使用基本上就足够了,下面我们简单的介绍一下怎么进行自定义logger进行日志的输出。

我们写一个sel_def_logger.py文件,文件中的定义一个类,内容如下:

import os

import sys

import logging

from timeimport strftime

# 输出日志路径

PATH = os.path.abspath('.') +'/logs/'

# 设置日志格式#和时间格式

FMT ='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s: %(message)s'

DATEFMT ='%Y-%m-%d %H:%M:%S'

class MyLog(object):

        def __init__(self):

                self.logger = logging.getLogger()

                self.formatter = logging.Formatter(fmt=FMT,datefmt=DATEFMT)

                self.log_filename ='{0}{1}.log'.format(PATH, strftime("%Y-%m-%d"))

                self.logger.addHandler(self.get_file_handler(self.log_filename))

                self.logger.addHandler(self.get_console_handler())

                # 设置日志的默认级别

                self.logger.setLevel(logging.DEBUG)

          # 输出到文件handler的函数定义

          def get_file_handler(self, filename):

                 filehandler = logging.FileHandler(filename,encoding="utf-8")

                 filehandler.setFormatter(self.formatter)

                    return filehandler

            # 输出到控制台handler的函数定义

            def get_console_handler(self):

                    console_handler = logging.StreamHandler(sys.stdout)

                    console_handler.setFormatter(self.formatter)

                    return console_handler

那么使用这个类的方法可以这样写:

import os

import sys

import logging

from timeimport strftime

# 输出日志路径

PATH = os.path.abspath('.') +'/logs/'

# 设置日志格式#和时间格式

FMT ='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s: %(message)s'

DATEFMT ='%Y-%m-%d %H:%M:%S'

import datetime

from sef_def_loggerimport MyLog

my_logg = MyLog().logger

my_logg.info("代码开始运行的时间{}".format(datetime.datetime.now()))

my_logg.debug('看看debug')

my_logg.error('This is a error')

生成的结果在我们预先生成的文件夹logs下,有类似的时间命名的日志文件如:2020-07-05.log,日志内容如下:

logging --- Python 的日志记录工具 — Python 3.10.1 文档

相关文章

网友评论

      本文标题:python logging详解及运用

      本文链接:https://www.haomeiwen.com/subject/etarcrtx.html