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 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 logging使用_[译]Python Logging 使用指南相关推荐

  1. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  2. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  3. python翻译库_[译] 鲜为人知的数据科学 Python 库

    Python 是一个很棒的语言.它是世界上发展最快的编程语言之一.它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性.整个 Python 及其库的生态系统使它成为全世界用户(初学者和 ...

  4. python cs开发框架_用Python编写一个简单的CS架构后门的方法

    用Python编写一个简单的CS架构后门的方法 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  用Python编写一个简单的CS架构后门的方法.txt ] (友情 ...

  5. python queue 调试_学Python不是盲目的,是有做过功课认真去了解的

    有多少伙伴是因为一句'人生苦短,我用Python'萌生想法学Python的!我跟大家更新过很多Python学习教程普及过多次的Python相关知识,不过大家还是还得计划一下Python学习路线!Pyt ...

  6. python编写代码_用 Python 编写干净、可测试、高质量的代码

    用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...

  7. python 免费空间_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  8. python培训班-Python培训机构_高品质Python线下开发培训班推荐-黑马程序员

    Python编程基础基础班1 课时:15天技术点:97项测验:2次学习方式:线下面授 学习目标 1.掌握Python开发环境基本配置|2.掌握运算符.表达式.流程控制语句.数组等的使用|3.掌握字符串 ...

  9. python如何调试_调试python 程序的几种方法总结

    程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误 ...

最新文章

  1. 如何跨微服务共享DTO
  2. python做ui自动化_[python]RobotFramework自定义库实现UI自动化
  3. Java中 String的反转
  4. 011 数据结构逆向—二叉树
  5. Comparator 与 Comparable
  6. Java中this与super的区别
  7. ServletRequest startAsync()的用途有限
  8. 保存blob到本地_用12行代码提取浏览器自动保存的密码
  9. web前端工程师学习路线指南,完整Web前端学习路线图
  10. Linux基础——脚本
  11. python可视化(莫烦python代码)
  12. [37期]二三事。老师说标题长才霸气。长长长…
  13. 苹果微信更新不了最新版本_微信登录提示版本过低 微信登录不了的解决办法...
  14. 【开源】23个优秀的机器学习数据集,推荐!
  15. 音乐app用户推荐系统构建_一款专门给用户推荐动听音乐的音乐期刊类的应用。画面极简优美...
  16. 少儿机器人编程会学什么
  17. 企业级自定义表单引擎解决方案(十)--缓存设计2
  18. 【ArcGIS Pro微课1000例】0022:基于DEM进行流域分析生成流域图
  19. 抽象代数之12阶群的五种结构
  20. JavaScript 原型链和继承面试题

热门文章

  1. 微信网页授权获取用户信息实战代码
  2. 数据之路 - Python爬虫 - PySpider框架
  3. ZAM 3D 制作3D动画字幕 用于Xaml导出
  4. CentOS 7 使用yum安装出现错误
  5. 【转载】DXUT进阶
  6. js中的继承1--类继承
  7. TCP/IP网络编程
  8. 比较简单的解决键盘遮挡文本框的简单方法
  9. java生成二维码打印到浏览器
  10. JavaEE 微信支付