您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python Logging 使用指南

时间:2020-10-14 11:15:13  来源:  作者:



程序员来说,Logging 是一种非常重要的功能。无论调试程序还是程序运行时的信息显示,Logging 都很有用。在本文中,我会演示为什么要使用以及如何使用 Python/ target=_blank class=infotextkey>Python 中的 Logging 模块。

为什么要使用 Logging 而不使用 print()

print 语句跟 Logging 输出存在本质上的不同。一般地,print 语句用于向 stdout(标准输出)写入有用的信息或程序需要输出的信息。然而 Logging 将这些信息写入 stderr(标准错误输出)。

import logging
logging.basicConfig(level=logging.INFO) #We'll talk about this soon!
logging.warning('Something bad could hAppen!')
logging.info('You are running the program')
logging.error('Aw snap! Everything failed.')
print("This is the program output")
复制代码

如果我运行这段程序,可以看到命令行输出了如下信息。

$ python log_test.py
WARNING:root:Something bad could happen!INFO:root:You are running the program
ERROR:root:Aw snap! Everything failed.This is the program output
复制代码

然而对于普通用户来说,信息太多了。虽然这些都在命令行显示,但数据却被分开了。所以用户应当这样运行程序。

这里多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并私信“01”即可领取。

$ python log_test.py > program_output.txt
WARNING:root:Something bad could happen!INFO:root:You are running the program
ERROR:root:Aw snap! Everything failed.$ cat program_output.txtThis is the program output
复制代码

在这里,需要输出的信息通过重定向符 > 写入到一个文件。所以我们能看到终端的运行情况,也可以方便地从文件中得到输出信息。现在我们来了解日志等级!

Logging 和日志等级

需要使用 Logging 的原因各有不同。这些原因可以根据严重性的不同分为如下几类。

  • DEBUG: 开发者调试信息,包括经计算得到的值、参数估值、URL、API 调用信息等。
  • INFO: 一般性的信息。
  • WARNING: 关于输入、参数等的警告。
  • ERROR: 报告由于用户操作不当或程序运行时发生的错误。
  • CRITICAL: 最高等级的日志输出,通常用于某些关键问题(取决于具体情况)。

最常用的日志类型有:DEBUGINFO 和 ERROR。然而,经常会出现因 Python 版本不匹配抛出警告的情况。

配置 Logger 和日志处理程序

Logger 可以配置不同的参数,可以配置特定日志等级、日志文件名、文件模式和日志打印的输出格式。

配置 Logger 的参数

Logger 可采用如下配置。

import logging
logging.basicConfig(filename='program.log', filemode='w', level=logging.DEBUG)
logging.warning('You are given a warning!')
复制代码

上面的代码向 program.log 文件输出日志。filemode='w' 用于设置文件读写模式。filemode='w' 表示需要打开一个新文件并覆盖原来的内容。该参数默认设置为 'a',此时会打开相应文件,并追加日志内容,因为有时需要获取历史日志。表示等级的参数 level 用于确定日志的最低等级。例如,当设置 level 为 INFO,程序就不会输出 DEBUG 级别的日志。你可能知道,需要设置 'verbose=debug' 才能获取一些参数。日志等级默认为 INFO

创建日志处理器

虽然上述方法直接明了,满足了一个简单的应用程序的需求,但对于一个软件产品或服务来说,需要全面的日志处理流程。因为很难在数以百万计的 DEBUG 级日志中找到某个 ERROR 级日志。此外,在整个程序和模块中,我们应当使用单一的 Logger。这样我们就可以正确地把日志添加到同一文件中。所以我们可以使用具有不同配置的 Handler 来处理这种任务。

import logging
logger = logging.getLogger("My Logger")
logger.setLevel(logging.DEBUG)console_handler = logging.StreamHandler()file_handler = logging.FileHandler('file.log', mode='w')
console_handler.setLevel(logging.INFO)file_handler.setLevel(logging.DEBUG)logger.addHandler(console_handler)logger.addHandler(file_handler)复制代码

可以看出,我们首先通过名称获取到一个 Logger。以此可以在程序的其他任意地方使用同一个 Logger。我们把全局的 Logging 等级设为最低的 DEBUG,这样我们就可以在其他日志处理器中设置任意日志等级。

接着,我们创建两个日志处理器,分别用于 console 和 file 形式的输出,并设置各自的日志等级。这可以减少控制台输出的开销,转而在文件中输出。这方便了以后的调试。

 

对输出日志进行格式化

Logging 不是只用来打印我们自己的信息的。有时候我们需要打印其他信息,例如时间、日志等级、进程 ID。因此我们需要对日志进行格式化。我们来看下面的代码。

console_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
file_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(console_format)file_handler.setFormatter(file_format)复制代码

添加 Handler 之前,我们可以像上面的代码那样设置日志输出的格式。可以用于设置日志格式的参数远不止这些,你可以访问(docs.python.org/3/library/l…

可重用的代码

下面是我在许多应用程序中都用到的代码段。它可能会对你有所帮助。

import logging
logger = logging.getLogger('Program Name-Version')
logger.setLevel(logging.DEBUG)formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
consoleHeader = logging.StreamHandler()consoleHeader.setFormatter(formatter)consoleHeader.setLevel(logging.INFO)fileHandler = logging.FileHandler(f"{output}/metabcc-lr.log")
fileHandler.setLevel(logging.DEBUG)fileHandler.setFormatter(formatter)logger.addHandler(fileHandler)logger.addHandler(consoleHeader)复制代码

Logging 与多线程有关的特征

记住,Logging 模块是线程安全的。所以除了极少数例外情况(不在本文讨论范围内)使用 Logging 不需要为多线程编写额外的处理逻辑。

本文虽然短小、简单,但我也希望它对初级程序员有所帮助。



Tags:Python Logging   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
对程序员来说,Logging 是一种非常重要的功能。无论调试程序还是程序运行时的信息显示,Logging 都很有用。在本文中,我会演示为什么要使用以及如何使用 Python 中的 Logging...【详细内容】
2020-10-14  Tags: Python Logging  点击:(123)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条