Python logging日志模块 详解logging模块

        在我们日常的运维工作中,很多情况下都需要解决问题/处理bug,而在解决问题和处理bug的过程离不开查看日志,而Python的logging就是为记录日志使用的,而且是线程安全的,这就意味这不必要去担心因日志模块的异常导致程序崩溃

1、首先我们来看一个简单的日志输出到终端的例子:

import logging

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

输出内容:

WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message

         可以看到,一共写入了五条内容,在打印时只打印了三条,这是因为在默认情况下,当Python的logging模块将日志打印到标准输出中时, 输出的是>=WARNING级别的日志,这就说明默认日志级别就是WARNING(日志级别:CRITICAL>ERROR>WARNING>INFO>DEBUG)。

日志级别含义如下:

  1. DEBUG:调试时的信息打印
  2. INFO:正常的日志信息
  3. WARNING:警告信息,但程序依然正常运行
  4. ERROR:发生错误,程序部分功能已经无法正常运行
  5. CRITICAL:发生严重错误,程序已经崩溃

以上是一个简单的例子,这不足以表明logging模块的强大,因为Python的内值函数也可实现此功能。下面我们来看第二个例子。

        2、将日志信息记录到文件,并将默认的日志级别改成DEBUG:

import logging

logging.basicConfig(filename='log1.log', level='DEBUG')

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

logging.basicConfig顾名思义是logging模块的基本配置函数,filename:定义日志输出的文件;level:指定日志输出的默认级别

我们可以查看'log1.log'文件,看到日志信息是从DEBUG开始的,并且当我们多次执行脚本时会发现文件中的日志内容是叠加的,说明默认的写入log文件的方式是追加。

3、我们还可以通过对logging模块配置来改变log文件的事件戳和写入方式。例如下面配置: 

import logging

logging.basicConfig(filename='log1.log', level='DEBUG',
format = '%(name)s-->%(asctime)s-->%(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',  # 定义时间戳
                    filemode='w')  # 指定写入的方式,'w'为覆盖写

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

文件内容:

root-->2022-11-01 20:50:52-->debug message
root-->2022-11-01 20:50:52-->info message
root-->2022-11-01 20:50:52-->warning message
root-->2022-11-01 20:50:52-->error message
root-->2022-11-01 20:50:52-->critical message

format参数可用的格式化字符串如下 

%(name)s:logging的名字

%(message)s:用户输出的消息

%(asctime)s:输出时间

%(levelno)s:数字形式的日志级别

%(levelname)s:文本形式的日志级别

%(pathname)s:调用日志输出函数的模块的完整路径名
%(filename)s:调用日志输出函数的模块的文件名

%(module)s:调用日志输出函数的模块

%(funcName)s:调用日志输出函数的函数名
%(lineno)d:调用日志输出函数的语句所在的代码行

%(created)f:当前事件;用UNIX标准表示时间的浮点数
%(relative:Created)d输出日志信息时;自logger创建以来的毫秒数

%(thread)d:线程ID

%(threadName)s:线程名可能没有
%(process)d:进程ID可能没有

现在的logging配置基本上已经可以满足我们的日常使用的需求,但还是体现不出logging模块的强大,下面我在介绍以下logging模块的四个基本概念:

logger:日志器(记录器),提供日志接口,供应用代码使用。

handler:处理器,将日志记录发送到合适的目的地。

filter:过滤器,提供一种优雅的方式决定一个日志记录是否发送到handler。

formatter:格式化器,指定日志输出的格式。

import logging

# 创建日志器
logger = logging.getLogger("qingyu")
logger.setLevel("DEBUG")

# 定义日志处理器
cl = logging.StreamHandler()  # 将日志输出到终端
fl = logging.FileHandler("log2.log", mode = "a", encoding = "utf-8")  # 输出日志到文本

# 定义初始化格式 # 定义两个日志布局
fmt1 = ("%(name)s---%(message)s---%(asctime)s")
fmt2 = ("%(lineno)d---%(name)s---%(message)s")

# 创建初始化器
a = logging.Formatter(fmt=fmt1)
b = logging.Formatter(fmt=fmt2)

# 添加处理器格式 将上面创建的初始化器添加
cl.setFormatter(a)
fl.setFormatter(b)

# 将处理器添加到日志器
logger.addHandler(cl)
logger.addHandler(fl)

logger.debug("debug message")
logger.info("debug message")
logger.warning("warning message")
logger.error("error message")
logger.critical("critical message")

猜你喜欢

转载自blog.csdn.net/qydjss/article/details/127640326