每个 Python 程序员都要知道的日志实践
admin
2023-07-30 22:27:45
0

在现实生活中,记录日志非常重要。银行转账时会有转账记录;飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切。如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么。

对于系统开发、调试以及运行,记录日志都是同样的重要。如果没有日志记录,程序崩溃时你几乎就没办法弄明白到底发生了什么事情。举个例子,当你在写一个服务器程序时,记录日志是非常有必要的。下面展示的就是 EZComet.com 服务器的日志文件截图。

服务崩溃后,如果没有日志,我几乎没办法知道到底发生了错误。日志不仅对于服务器很重要,对于桌面图形应用同样十分重要。比如,当你的客户的 PC 机程序崩溃时,你可以让他们把日志文件发给你,这样你就可以找到问题到底出在哪儿。相信我,在不同的 PC 环境下,你永远不会知道会有怎样奇怪的问题。我曾经就接收到过这样的错误日志。

1234567891011121314 20110822 17:52:54,828 root ERROR [Errno 10104] getaddrinfo failedTraceback (most recent call last):  File \”\”, line 124, in main  File \”\”, line 20, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/wx._core\”, line 7978, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/wx._core\”, line 7552, in _BootstrapApp  File \”\”, line 84, in OnInit  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.wxreactor\”, line 175, in install  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet._threadedselect\”, line 106, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.base\”, line 488, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.posixbase\”, line 266, in installWaker  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.posixbase\”, line 74, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/socket\”, line 224, in methgaierror: [Errno 10104] getaddrinfo failed

我最终发现,这个客户的 PC 机被一种病毒感染,导致了调用 gethostname 函数失败。看吧,如果没有日志可以查你怎么可能知道这些。

打印输出不是个好办法

尽管记录日志非常重要,但是并不是所有的开发者都能正确地使用它。我曾看到一些开发者是这样记录日志的,在开发的过程中插入 print 语句,开发结束后再将这些语句移除。就像这样:

123456 print \’Start reading database\’records = model.read_recrods()print \’# records\’, recordsprint \’Updating record …\’model.update_records(records)print \’done\’

这种方式对于简单脚本型程序有用,但是如果是复杂的系统,你最好不要使用这样的方式。首先,你没办法做到在日志文件中只留下极其重要的消息。你会看到大量的消息日志。但是你却找不到任何有用的信息。你除了移除这输出语句这外,没别的办法控制代码,但是极有可能的是你忘记了移出那些没用的输出。再者,print 输出的所有信息都到了标准输出中,这将严重影响到你从标准输出中查看其它输出数据。当然,你也可以把消息输出到 stderr ,但是用 print 做日志记录的方式还是不好。

使用 python 的标准日志模块

那么,怎么样记录日志才是正确的呢?其实非常简单,使用 python 的标准日志模块。多亏 python 社区将日志做成了一个标准模块。它非常简单易用且十分灵活。你可以像这样使用日志系统:

12345678910111213 import logginglogging.basicConfig(level=logging.INFO)logger = logging.getLogger(__name__) logger.info(\’Start reading database\’)# read database here records = {\’john\’: 55, \’tom\’: 66}logger.debug(\’Records: %s\’, records)logger.info(\’Updating records …\’)# update records here logger.info(\’Finish updating records\’)

运行的时候就可看到:

123 INFO:__main__:Start reading databaseINFO:__main__:Updating records ...INFO:__main__:Finish updating records

你可能会问这与使用 print 有什么不同呢。它有以下的优势:

  • 你可以控制消息的级别,过滤掉那些并不重要的消息。
  • 你可决定输出到什么地方,以及怎么输出。

有许多的重要性别级可供选择,debug、info、warning、error 以及 critical。通过赋予 logger 或者 handler 不同的级别,你就可以只输出错误消息到特定的记录文件中,或者在调试时只记录调试信息。让我们把 logger 的级别改成 DEBUG 再看一下输出结果:

1 logging.basicConfig(level=logging.DEBUG)ython\”>Victor lin。欢迎加入翻译组。

在现实生活中,记录日志非常重要。银行转账时会有转账记录;飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切。如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么。

对于系统开发、调试以及运行,记录日志都是同样的重要。如果没有日志记录,程序崩溃时你几乎就没办法弄明白到底发生了什么事情。举个例子,当你在写一个服务器程序时,记录日志是非常有必要的。下面展示的就是 EZComet.com 服务器的日志文件截图。

服务崩溃后,如果没有日志,我几乎没办法知道到底发生了错误。日志不仅对于服务器很重要,对于桌面图形应用同样十分重要。比如,当你的客户的 PC 机程序崩溃时,你可以让他们把日志文件发给你,这样你就可以找到问题到底出在哪儿。相信我,在不同的 PC 环境下,你永远不会知道会有怎样奇怪的问题。我曾经就接收到过这样的错误日志。

1234567891011121314 20110822 17:52:54,828 root ERROR [Errno 10104] getaddrinfo failedTraceback (most recent call last):  File \”\”, line 124, in main  File \”\”, line 20, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/wx._core\”, line 7978, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/wx._core\”, line 7552, in _BootstrapApp  File \”\”, line 84, in OnInit  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.wxreactor\”, line 175, in install  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet._threadedselect\”, line 106, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.base\”, line 488, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.posixbase\”, line 266, in installWaker  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.posixbase\”, line 74, in __init__  File \”h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/socket\”, line 224, in methgaierror: [Errno 10104] getaddrinfo failed

我最终发现,这个客户的 PC 机被一种病毒感染,导致了调用 gethostname 函数失败。看吧,如果没有日志可以查你怎么可能知道这些。

打印输出不是个好办法

尽管记录日志非常重要,但是并不是所有的开发者都能正确地使用它。我曾看到一些开发者是这样记录日志的,在开发的过程中插入 print 语句,开发结束后再将这些语句移除。就像这样:

123456 print \’Start reading database\’records = model.read_recrods()print \’# records\’, recordsprint \’Updating record …\’model.update_records(records)print \’done\’

这种方式对于简单脚本型程序有用,但是如果是复杂的系统,你最好不要使用这样的方式。首先,你没办法做到在日志文件中只留下极其重要的消息。你会看到大量的消息日志。但是你却找不到任何有用的信息。你除了移除这输出语句这外,没别的办法控制代码,但是极有可能的是你忘记了移出那些没用的输出。再者,print 输出的所有信息都到了标准输出中,这将严重影响到你从标准输出中查看其它输出数据。当然,你也可以把消息输出到 stderr ,但是用 print 做日志记录的方式还是不好。

使用 python 的标准日志模块

那么,怎么样记录日志才是正确的呢?其实非常简单,使用 python 的标准日志模块。多亏 python 社区将日志做成了一个标准模块。它非常简单易用且十分灵活。你可以像这样使用日志系统:

12345678910111213 import logginglogging.basicConfig(level=logging.INFO)logger = logging.getLogger(__name__) logger.info(\’Start reading database\’)# read database here records = {\’john\’: 55, \’tom\’: 66}logger.debug(\’Records: %s\’, records)logger.info(\’Updating records …\’)# update records here logger.info(\’Finish updating records\’)

运行的时候就可看到:

123 INFO:__main__:Start reading databaseINFO:__main__:Updating records ...INFO:__main__:Finish updating records

你可能会问这与使用 print 有什么不同呢。它有以下的优势:

  • 你可以控制消息的级别,过滤掉那些并不重要的消息。
  • 你可决定输出到什么地方,以及怎么输出。

有许多的重要性别级可供选择,debug、info、warning、error 以及 critical。通过赋予 logger 或者 handler 不同的级别,你就可以只输出错误消息到特定的记录文件中,或者在调试时只记录调试信息。让我们把 logger 的级别改成 DEBUG 再看一下输出结果:

1

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...