教你快速入门:Python Logging 使用指南
off999 2024-10-07 12:18 14 浏览 0 评论
对程序员来说,Logging 是一种非常重要的功能。无论调试程序还是程序运行时的信息显示,Logging 都很有用。在本文中,我会演示为什么要使用以及如何使用 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.txt
This is the program output
复制代码
在这里,需要输出的信息通过重定向符 > 写入到一个文件。所以我们能看到终端的运行情况,也可以方便地从文件中得到输出信息。现在我们来了解日志等级!
Logging 和日志等级
需要使用 Logging 的原因各有不同。这些原因可以根据严重性的不同分为如下几类。
- DEBUG: 开发者调试信息,包括经计算得到的值、参数估值、URL、API 调用信息等。
- INFO: 一般性的信息。
- WARNING: 关于输入、参数等的警告。
- ERROR: 报告由于用户操作不当或程序运行时发生的错误。
- CRITICAL: 最高等级的日志输出,通常用于某些关键问题(取决于具体情况)。
最常用的日志类型有:DEBUG、INFO 和 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 不需要为多线程编写额外的处理逻辑。
本文虽然短小、简单,但我也希望它对初级程序员有所帮助。
最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并私信“01”领取。
相关推荐
- python基础模块三剑客:sys、os、shutil(增加示例代码)
-
注:上个篇由于不熟悉头条号编辑器,导致示例代码丢失。现在全部以图片的形式加回。有同学问了个问题:在python里如何复制、删除、重命名文件?有个同学知道os.system(),就回答说:os.syst...
- Python常用文件操作库使用详解(python 对文件操作)
-
Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能:文件...
- 你知道Python 如何进行高效的代码重构吗?
-
点赞、收藏、加关注,下次找我不迷路写出高质量的代码是每个程序员的追求。而代码重构作为提升代码质量的重要手段,却常常被新手忽视。很多新手在编写代码时,只关注功能是否实现,却不注重代码的结构和可维护性,...
- Python常用内置模块介绍——文件与系统操作详解
-
Python提供了多个强大的内置模块用于文件和系统操作,下面我将详细介绍最常用的几个模块及其核心功能。1.os模块-操作系统交互os模块提供了与操作系统交互的接口,包括文件/目录操作、进程管理、环...
- Python的tarfile模块解压缩.tar/.tar.gz等文件
-
python中的标准库tarfile模块可以帮助我们快速压缩或者解压后缀为.tar/.tar.gz/.tar.bz2/.tar.xz的文件。01、tarfile核心类与函数介绍使用方法因为tarfil...
- 批量重命名工具,Bulk Rename Utility软件体验
-
平常在电脑上处理电子文件,经常在得到文件本身时,没有空闲和精力去为文件重命名,像是一张图片,要作为下一个步骤的素材。而处理完事过后就不理它了,顺手直接丢回收站或者放在硬盘里。但是想把文件存档和提交给上...
- 照片怎样重命名?方法有四种(照片怎么可以重命名)
-
照片怎样重命名?照片在我们日常生活中扮演着越来越重要的角色,但是有时候,我们需要对照片进行重命名,以便更好地组织和查找它们,这样也可以大大提高我们的效率。在这篇文章中,我们将介绍四种简单的方法,让你轻...
- 你需要批量创建文件夹并命名吗,给你推荐几个方法
-
小李是一家设计公司的项目经理,最近接了一个大项目,需要整理大量的设计稿。每个设计稿都需要单独创建一个文件夹,以方便团队成员协作。手动创建文件夹效率太低,而且容易出错。小李在网上搜索了各种方法,尝试了P...
- 怎样批量重命名一个工作簿中的所有工作表
-
上篇文章,Python数据的选取和处理,阅读量93,收藏15,没有评论。目前正在复习Python+Excel实现办公自动化,有兴趣的可以一起讨论,共同提高。花了近4个小时终于把6个分部的统计工作表做好...
- Windows如何批量修改文件后缀名(电脑如何批量修改文件后缀名)
-
在Windows系统中药批量修改文件后缀名的方式非常多,每个方法的优缺点各有不同,下面通过几个常见的方式给大家介绍下,Windows如何批量修改文件后缀名的。给有需要的朋友几个参考。方法一:使用文件资...
- Python3+ 变量命名全攻略:PEP8 规范 + 官方禁忌 + 实战技巧,全搞懂!
-
Python3+变量命名规则与约定详解一、官方命名规则(必须遵守)1.合法字符集变量名只能包含:大小写字母(a-z,A-Z)数字(0-9)下划线(_)2.禁止数字开头合法:user_age,...
- python代码实现读取文件并生成韦恩图
-
00、背景今天战略解码,有同学用韦恩图展示各个产品线的占比,效果不错。韦恩图(Venndiagram),是在集合论数学分支中,在不太严格的意义下用以表示集合的一种图解。它们用于展示在不同的事物群组之...
- python学习第二天:用Pycharm新建的第一个程序
-
分享第一次使用Pycharm学到的内容第一次打开得到上面图片projects:项目customize:自定义plugins:插件learn:学习newproject新建项目聪明如我在插件那里找到了汉...
- 如何编写第一个Python程序(python第一个代码)
-
一、第一个python程序[掌握]python:python解释器,将python代码解释成计算机认识的语言pycharm:IDE(集成开发环境),写代码的一个软件,集成了写代码,...
- Python文件读写操作详解:从基础到实战
-
Python文件的读写操作在Python中,文件操作非常常见,可以通过内建的open()函数进行文件的读取、写入、创建等操作。理解文件操作的模式和with语句对于确保代码的简洁性和效率至...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python重命名文件 (54)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)