​教你快速入门: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: 最高等级的日志输出,通常用于某些关键问题(取决于具体情况)。

最常用的日志类型有:DEBUGINFOERROR。然而,经常会出现因 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,这样我们就可以在其他日志处理器中设置任意日志等级。

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

对输出日志进行格式化

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”领取。

相关推荐

​黄梅四祖寺

​黄梅四祖寺

135

黄梅四祖寺 四祖寺,位于黄梅县西15公里的西山,又称破额山。山势环抱,双峰屹立,还称双峰山。四祖寺,古称幽居寺,正觉寺、西山寺、双峰寺,是唐初大医禅师禅宗四祖道信的道...

​甘肃灵活就业者的失业补贴如何申领

​甘肃灵活就业者的失业补贴如何申领

111

甘肃灵活就业者的失业补贴如何申领 在如今多元的就业环境下,甘肃有越来越多的人选择灵活就业。但当灵活就业者遭遇失业时,生活的压力往往会接踵而至。其实,符合条件的甘肃灵...

​使炎黄部落联盟形成的涿鹿之战和阪泉之战

​使炎黄部落联盟形成的涿鹿之战和阪泉之战

183

使炎黄部落联盟形成的涿鹿之战和阪泉之战 导言: 中华上下五千年的历史发展进程中,发生过不少的战争,自古以来,都有着胜者为王,败者为寇的说法,成王败寇是永远不变的定理...

​避暑旅游的好地方一一利川

​避暑旅游的好地方一一利川

139

避暑旅游的好地方一一利川 湖北省恩施州的利川市,平均海拔1000米以上,地处北纬30度,海拔1000米到1900米占全市总面积70%以上,全市4600多平方公里,是湖北省面积最大的县级市。也...

​在农村干这五大行业。收益真能轻松过万!

​在农村干这五大行业。收益真能轻松过万!

55

在农村干这五大行业。收益真能轻松过万! 嗨,大家好,我们又见面了,我是你们的老朋友农民大张。非常感谢大家在百忙之中抽空过来阅读我的文章,真心希望我的文章能对大家有所...

​中原大战的始末

​中原大战的始末

81

中原大战的始末 中原大战是指1930年(中华民国十九年)5月至10月的国民党内部因争夺权力而爆发的一场战争。(因为这次战争主要在中原地区进行,所以称为“中原大战”) 其达到了...

​裘盛戎:京剧净行泰斗 | 中华英才

​裘盛戎:京剧净行泰斗 | 中华英才

62

裘盛戎:京剧净行泰斗 | 中华英才 百年巨匠—— 裘盛戎:京剧净行泰斗 裘盛戎(1915年—1971年) 祖籍浙江绍兴,生于北京。京剧表演艺术家,花脸表演流派——裘派创始人。幼从父学...

​回顾2021中美高层战略对话

​回顾2021中美高层战略对话

181

回顾2021中美高层战略对话 2021年中美高层战略对话 举办地:美国阿拉斯加州安克雷奇 ——对话开始前,驻美大使崔天凯接受采访表示:中方并不指望一次对话能解决所有问题,并没有...

​2020年将Android屏幕镜像到PC的6种方法

​2020年将Android屏幕镜像到PC的6种方法

65

2020年将Android屏幕镜像到PC的6种方法 Android屏幕镜像不像生根或自定义之类的其他Android主题流行。 可能是因为没有多少人意识到这一点,或者只是不想处理麻烦。 但是现在有数百种屏幕...

​那些因为意外怀孕结婚的情侣,后来都怎么样了

​那些因为意外怀孕结婚的情侣,后来都怎么样了

63

那些因为意外怀孕结婚的情侣,后来都怎么样了 听到“奉子成婚”,看到婚礼上新娘怀着孕肚,你会想到什么呢? 甜蜜,人生赢家,还是被动,无可奈何? 我们采访了几位因为计划外...