教你快速入门:Python Logging 使用指南
教你快速入门:Python Logging 使用指南
对程序员来说,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”领取。
下一篇:没有了
-
- 侯勇:现实版“李洪海”,三婚娶小20岁90后,被甜蜜称“侯大宝”
-
2025-07-14 13:03:44
-
- 杨怡扮“妈姐”,张继聪当男一,这部TVB经典民初剧不该被忽略
-
2025-07-14 12:58:36
-
- 事实证明,“被劝离婚”的吴京和谢楠,揭露了明星夫妻的残酷真相
-
2025-07-14 12:52:33
-
- 变·妆 | 北国美妆焕新升级 全新演绎美力格局
-
2025-07-14 12:47:26
-
- 《红楼梦》真正的作者到底是谁?
-
2025-07-14 12:44:15
-
- 心理学识人术:心机很重的人,往往有这4个奇怪行为,要警觉
-
2025-07-14 12:26:55
-
- 6.26国际禁毒日||“有魔鬼要抓我”,吸毒致幻有多可怕?
-
2025-07-14 12:23:45
-
- 洗三文化:小孩出生后的第三天,为什么要洗三?洗三有哪些流程?
-
2025-07-14 12:10:28
-
- 刘德华2018年香港红馆演唱会
-
2025-07-14 12:08:13
-
- 9年后再看陈晓、赵丽颖,两人人生泾渭分明,那么甜的CP也不行了
-
2025-07-14 12:03:05
-
- 已致5人死亡!洛杉矶山火失控,亲历者:太恐怖了
-
2025-07-14 11:59:56
-
- 虐文:用刀剖子宫,递给他你要的,我给你了!黄泉路上你别等我
-
2025-07-14 11:49:30
-
- 真实版:高校辅导员收入的那些事儿
-
2025-07-14 11:47:15
-
- “如果你爱我,你会来找我?”我的不安全感就是需要你来安抚
-
2025-07-14 11:44:04
-
- 有人没毕业就被提前录用,小语种人才炙手可热,薪资在12到15万间
-
2025-07-14 11:31:40
-
- 最近家里的宝宝喜欢吃牛排,小编整理了中国十大牛排品牌!
-
2025-07-14 11:01:02
-
- 医院太平间里的猫腻
-
2025-07-14 10:58:48
-
- 探访太和东站
-
2025-07-14 10:55:37
-
- 中国牛散前100强名单公布(2025年牛散100强名单一览)
-
2025-07-14 10:53:21
-
- 为什么哈贝马斯的思想如此重要?“交往”两个字背后的深层次内涵
-
2025-07-14 10:51:06



《雷霆沙赞2》北美首周末票房3050万美元 全球首周票房6550万美元
从陈飞宇、张颂文身上,我看到了粉圈产业链的“死灰复燃”之势