导航:首页 > 编程语言 > python3日志模块

python3日志模块

发布时间:2022-12-07 08:48:09

‘壹’ python日志—Python日志模块logging介绍

从事与软件相关工作的人,应该都听过“日志”一词。

日志就是跟踪软件运行时事件的方法,为了能够在程序运行过程中记录错误。

通过日志记录程序的运行,方便我们查询信息,以便追踪问题、进行维护和调试、还是数据分析。

并且各编程语言都形成了各自的日志体系和相应的框架。

日志的作用总结:

首先我们要树立一个观点,那就是“不是为了记录日志而记录日志,日志也不是随意记的”。要实现能够只通过日志文件还原整个程序执行的过程,达到能透明地看到程序里执行情况,每个线程每个过程到底执行结果的目的。日志就像飞机的黑匣子一样,应当能够复原异常的整个现场乃至细节。

在项目中,日志这个功能非常重要,我们要重视起来。

在Python中,使用logging模块来进行日志的处理。

logging是Python的内置模块,主要用于将日志信息进行格式化内容输出,可将格式化内容输出到文件,也可输出到屏幕。

我们在开发过程中,常用print()函数来进行调试,但是在实际应用的部署时,我们要将日志信息输出到文件中,方便后续查找以及备份。

在我们使用日志管理时,我们也可以将日志格式化成Json对象转存到ELK中方便图形化查看及管理。

logging模块将日志系统从高向低依次定义了四个类,分别是logger(日志器)、handler(处理器)、filter(过滤器)和formatter(格式器)。其中由日志器生成的实例将接管原本日志记录函数logging.log的功能。

说明:

我们先来思考下下面的两个问题:

在软件开发阶段或部署开发环境时,为了尽可能详细的查看应用程序的运行状态来保证上线后的稳定性,我们可能需要把该应用程序所有的运行日志全部记录下来进行分析,这是非常耗费机器性能的。

当应用程序正式发布或在生产环境部署应用程序时,我们通常只需要记录应用程序的异常信息、错误信息等,这样既可以减小服务器的I/O压力,也可以避免我们在排查故障时被淹没在日志的海洋里。

那么怎样才能在不改动应用程序代码的情况下,根据事件的重要性或者称之为等级,实现在不同的环境中,记录不同详细程度的日志呢?

这就是日志等级的作用了,我们通过配置文件指定我们需要的日志等级就可以了。

说明:

总结:

开发应用程序时或部署开发环境时,可以使用DEBUG或INFO级别的日志获取尽可能详细的日志信息,可以方便进行开发或部署调试。 应用上线或部署生产环境时,应用使用WARNING或ERROR或CRITICAL级别的日志,来降低机器的I/O压力和提高获取错误日志信息的效率。 日志级别的指定通常都是在应用程序的配置文件中进行指定的。 不同的应用程序所定义的日志等级会有所差别,根据实际需求来决定。

‘贰’ python - 日志记录模块(logging)的二次封装

上篇文章 对logging做了基本介绍,我们可以使用logging来做日志的简单记录。但实际项目应用时,我们一般会根据自身需要对其做二次封装(loggingV2),然后在其他python文件中, 先import申明后直接调用。

废话不多说,下面给几个二次封装的简单示例:

示例一:

loggingV2.py - 封装

logMain.py - 应用

示例二:

    对上述示例进行 模块化封装 ,如下log.py

则任何声明了log模块的python文件都可以调用logging日志系统,如下logMain.py

示例三:

    对上述示例进行 定制化封装 ,如下myLog.py

    需求:

    1)同时实现终端显示与日志文件保存

    2)日志文件名除日期外,增加显示时间,精确到秒

    3)日志输出级别可配置

    4)日志保存路径与文件名可配置

    5)日志跨天(或者小时/分钟),另生成新文件保存

改写logMain.py,如下:

示例四:

    对上述示例进行 异步线程封装 ,如下myThreadLog.py

    需求:

        1)独立线程处理日志,不影响主程序性能

        2)使用队列异步处理日志记录

 继续改写logMain.py,如下:

    注意 - 线程相关操作函数(如下):

        1.threading.Thread() — 创建线程并初始化线程,可以为线程传递参数

        2.threading.enumerate() — 返回一个包含正在运行的线程的list

        3.threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果

        4.Thread.start() — 启动线程

        5.Thread.join() — 阻塞函数,一直等到线程结束

        6.Thread.isAlive() — 返回线程活动状态

        7.Thread.setName() — 设置线程名

        8.Thread.getName() — 获取线程名

        9.Thread.setDaemon() — 设置为后台线程,这里默认是False,设置为True之后则主线程不会再等待子线程结束才结束,而是主线程结束意味程序退出,子线程也立即结束,注意调用时必须设置在start()之前;

        10.除了以上常用函数,线程还经常与互斥锁Lock/事件Event/信号量Condition/队列Queue等函数配合使用

‘叁’ Python日志模块介绍

logging 模块预定义了5种日志级别,并根据它们所跟踪的事件的级别或严重程度来命名,具体如下:

注意:

Logger 对象有三个功能:

Logger 对象的使用最广泛的方法主要是:配置和记录消息

当配置了 Logger 对象后,就可以使用 Logger.debug() , Logger.info() , Logger.warning , Logger.error , Logger.critical() 方法来创建日志消息,只需将需要记录的消息写进括号内即可

Handler 对象负责将日志消息(基于日志消息的严重性)分派给处理器的指定目标。在上一步中提到,可以使用 Logger.addHandler() 来添加零个或多个处理器对象。例如,算法可以将所有日志消息都发送到控制台,将 ERROR 或者更高级别的消息发送到磁盘文件。这就需要两个单独的处理器。

处理器有很多 种类 ,常用的主要有以下几种:

Formatter 对象是用来配置日志消息的最终输出形式。其格式由 %(<dictionary key>)s 这样的表达形式来组合成字符串。例如:

其中,可以设置的<dictionary key>可参考 LogRecord属性

配置完后,我们就可以在我们算法想要进行日志记录的地方调用 Logger.debug() , Logger.info() , Logger.warning , Logger.error , Logger.critical() 来进行日志输出了。比如:

当运行算法时,你会看到控制台输出以下内容

https://docs.python.org/3/howto/logging.html#logging-howto

阅读全文

与python3日志模块相关的资料

热点内容
原创小说app哪个好看 浏览:97
首台湖南造鲲鹏服务器云服务器 浏览:266
redhatphp 浏览:454
android智能家居蓝牙 浏览:646
pt螺纹编程 浏览:451
手机电音app哪个好 浏览:749
checksum命令 浏览:637
java创建xml文件 浏览:170
算命源码国际版 浏览:283
三菱模块化编程 浏览:718
控件读取文件源码 浏览:445
文件夹侧面目录标签怎么制作 浏览:232
做程序员学什么 浏览:320
pdfeditor教程 浏览:880
fortran把文件放入文件夹 浏览:709
程序员1年经验不敢投简历 浏览:481
如何看电脑的源码 浏览:897
找工作app软件哪个好 浏览:96
信息管理网站源码 浏览:439
小说app哪个好免费 浏览:224