python logging日志处理详解(1)

简介: python logging日志处理详解(1)

python 模块 logging日志处理

文章目录

python 模块 logging日志处理

1.介绍

1.1 架构

1.1.1 Logger 记录器

1.1.2 Handler 处理器

1.1.3 Formatter 格式化器

1.1.4 Filter 过滤器

2. 优点

3. 用法

3.1 默认输出

3.2 日志配置格式输出

3.2.1 配置输出级别并指定到文件

3.2.2 声明了一个 Logger 对象,它就是日志输出的主类

3.2.3 格式化输出

3.3 Handler配置

3.3.1 handler配置格式输出

3.3.2 多种handle输出

3.4 捕获 Traceback

3.5 配置共享

3.6 文件配置

3.6.1 yaml配置文件

3.6.2 ini配置文件

3.7 字符串拼接

3.8 异常处理

3.9 日志文件按照时间划分或者按照大小划分

3.9.1 TimedRotatingFileHandler构造函数

3.9.2 RotatingFileHandler 构造函数

3.10 logging.disable暂时禁止日志输出

1.介绍

在 Python 中有一个标准的 logging 模块,我们可以使用它来进行标注的日志记录,利用它我们可以更方便地进行日志记录,同时还可以做更方便的级别区分以及一些额外日志信息的记录,如时间、运行模块信息等。

1.1 架构

1832b220aa754cd18c504acc7686a560.png

整个日志记录的框架可以分为这么几个部分:


Logger 记录器,暴露了应用程序代码能直接使用的接口。

Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地。

Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。

Formatter 格式化器,指明了最终输出中日志记录的布局。

1.1.1 Logger 记录器

Logger是一个树形层级结构,在使用接口debug,info,warn,error,critical之前必须创建Logger实例,即创建一个记录器,如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(WARN),处理器Handler(StreamHandler,即将日志信息打印输出在标准输出上),和格式化器Formatter(默认的格式即为第一个简单使用程序中输出的格式)。

创建方法:

logger = logging.getLogger(logger_name)

创建Logger实例后,可以使用以下方法进行日志级别设置,增加处理器Handler。

logger.setLevel(logging.ERROR)    #设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出
logger.addHandler(handler_name) # 为Logger实例增加一个处理器
logger.removeHandler(handler_name) # 为Logger实例删除一个处理器

1.1.2 Handler 处理器

Handler处理器类型有很多种,比较常用的有三个,StreamHandler,FileHandler,NullHandler。

创建StreamHandler之后,可以通过使用以下方法设置日志级别,设置格式化器Formatter,增加或删除过滤器Filter。

ch.setLevel(logging.WARN)     #指定日志级别,低于WARN级别的日志将被忽略
ch.setFormatter(formatter_name)   #设置一个格式化器formatter
ch.addFilter(filter_name)    #增加一个过滤器,可以增加多个
ch.removeFilter(filter_name)   #删除一个过滤器

StreamHandler

创建方法:

sh = logging.StreamHandler(stream=None)

FileHandler

创建方法:

fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)

NullHandler

NullHandler类位于核心logging包,不做任何的格式化或者输出。

本质上它是个“什么都不做”的handler,由库开发者使用。

logging 模块提供的 全部Handler 有:

StreamHandler:logging.StreamHandler;  日志输出到流,可以是 sys.stderr,sys.stdout 或者文件。
FileHandler:logging.FileHandler;    日志输出到文件。
BaseRotatingHandler:logging.handlers.BaseRotatingHandler; 基本的日志回滚方式。
RotatingHandler:logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚。
TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日志回滚方式,在一定时间区域内回滚日志文件。
SocketHandler:logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets。
DatagramHandler:logging.handlers.DatagramHandler;远程输出日志到UDP sockets。
SMTPHandler:logging.handlers.SMTPHandler;远程输出日志到邮件地址。
SysLogHandler:logging.handlers.SysLogHandler;日志输出到syslog。
NTEventLogHandler:logging.handlers.NTEventLogHandler;远程输出日志到Windows NT/2000/XP的事件日志。
MemoryHandler:logging.handlers.MemoryHandler;日志输出到内存中的指定buffer。
HTTPHandler:logging.handlers.HTTPHandler;通过”GET”或者”POST”远程输出到HTTP服务器。

1.1.3 Formatter 格式化器

使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S

创建方法:

formatter = logging.Formatter(fmt=None, datefmt=None)

其中,fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用’%(message)s’。如果不指明datefmt,将使用ISO8601日期格式。

1.1.4 Filter 过滤器

Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤。Filter基类只允许特定Logger层次以下的事件。例如用‘A.B’初始化的Filter允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’等记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串来初始化,所有的事件都接受。

创建方法:

filter = logging.Filter(name='')

熟悉了这些概念之后,有另外一个比较重要的事情必须清楚,即Logger是一个树形层级结构;

Logger可以包含一个或多个Handler和Filter,即Logger与Handler或Fitler是一对多的关系;

一个Logger实例可以新增多个Handler,一个Handler可以新增多个格式化器或多个过滤器,而且日志级别将会继承。

1832b220aa754cd18c504acc7686a560.png

2. 优点

总的来说 logging 模块相比 print 有这么几个优点:


可以在 logging 模块中设置日志等级,在不同的版本(如开发环境、生产环境)上通过设置不同的输出等级来记录对应的日志,非常灵活。

print 的输出信息都会输出到标准输出流中,而 logging 模块就更加灵活,可以设置输出到任意位置,如写入文件、写入远程服务器等。

logging 模块具有灵活的配置和格式化功能,如配置输出当前模块信息、运行时间等,相比 print 的字符串格式化更加方便易用。

3. 用法

3.1 默认输出

高于WARNING的日志信息才会输出

$ cat log1.py 
import logging
logging.basicConfig()
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

输出:

$ python log1.py 
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message

3.2 日志配置格式输出

配置方式

显式创建记录器Logger、处理器Handler和格式化器Formatter,并进行相关设置;

通过简单方式进行配置,使用basicConfig()函数直接进行配置;

通过配置文件进行配置,使用fileConfig()函数读取配置文件;

通过配置字典进行配置,使用dictConfig()函数读取配置信息;

通过网络进行配置,使用listen()函数进行网络配置。

basicConfig关键字参数

关键字 描述
filename  创建一个FileHandler,使用指定的文件名,而不是使用StreamHandler。
filemode  如果指明了文件名,指明打开文件的模式(如果没有指明filemode,默认为'a')。
format  handler使用指明的格式化字符串。
datefmt 使用指明的日期/时间格式。
level 指明根logger的级别。
stream  使用指明的流来初始化StreamHandler。该参数与'filename'不兼容,如果两个都有,'stream'被忽略。

format格式

格式  描述
%(levelno)s 打印日志级别的数值
%(levelname)s 打印日志级别名称
%(pathname)s  打印当前执行程序的路径
%(filename)s  打印当前执行程序名称
%(funcName)s  打印日志的当前函数
%(lineno)d  打印日志的当前行号
%(asctime)s 打印日志的时间
%(thread)d  打印线程id
%(threadName)s  打印线程名称
%(process)d 打印进程ID
%(message)s 打印日志信息

3.2.1 配置输出级别并指定到文件

$ cat log2.py 
#!/usr/local/bin/python
# -*- coding:utf-8 -*-
import logging
# 通过下面的方式进行简单配置输出方式与日志级别
logging.basicConfig(filename='logger.log', level=logging.INFO)
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')

输出:

$ python log2.py
$ cat logger.log
INFO:root:info message  #info级别也能输出
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message

3.2.2 声明了一个 Logger 对象,它就是日志输出的主类

$ cat log3.py 
#!/usr/local/bin/python
# -*- coding:utf-8 -*-
import logging
# 通过下面的方式进行简单配置输出方式与日志级别
logging.basicConfig(filename='logger.log', level=logging.INFO)
logger = logging.getLogger(__name__)
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

输出:

$ python log3.py
$ cat logger.log 
INFO:__main__:info message
WARNING:__main__:warn message
ERROR:__main__:error message
CRITICAL:__main__:critical message

3.2.3 格式化输出

$ cat log4.py 
import logging
logging.basicConfig(filename="logger.log", filemode="w", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%d-%M-%Y %H:%M:%S", level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

输出:

$ python log4.py
$ cat logger.log 
17-49-2020 13:49:16 __main__:DEBUG:debug message
17-49-2020 13:49:16 __main__:INFO:info message
17-49-2020 13:49:16 __main__:WARNING:warn message
17-49-2020 13:49:16 __main__:ERROR:error message
17-49-2020 13:49:16 __main__:CRITICAL:critical message
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
监控 安全 中间件
Python 日志处理详解:从基础到实战
【2月更文挑战第5天】Python 日志处理详解:从基础到实战
60 2
|
1月前
|
消息中间件 测试技术 Python
Python使用多线程解析超大日志文件
Python使用多线程解析超大日志文件
22 0
|
1月前
|
存储 数据库 Python
Loguru:Python中强大的日志库
Loguru:Python中强大的日志库
44 2
|
1月前
|
存储 安全 算法
Python如何在打印日志时隐藏明文密码?
Python如何在打印日志时隐藏明文密码?
34 0
|
1月前
|
监控 Python
Python生成日志文件
Python生成日志文件
22 0
|
2月前
|
监控 IDE 开发工具
Python中的日志记录与调试技巧
Python中的日志记录与调试技巧
|
3月前
|
存储 BI 网络安全
正在等待继续编辑 - Python - 基础知识专题 - 配置文件与日志管理
正在等待继续编辑 - Python - 基础知识专题 - 配置文件与日志管理
22 0
|
3月前
|
Python
python正确使用logging日志的方式
python正确使用logging日志的方式
34 0
|
3月前
|
开发者 Python
Python学习 -- logging模块
Python学习 -- logging模块
20 0

热门文章

最新文章