Python 程序员必须掌握的日志记录

写在之前

在我们的现实生活中,「日志记录」其实是一件非常重要的事情,比如银行的转账记录,汽车的行车记录仪记录行驶过程中的一切,如果出现了什么问题,我们可以通过「日志记录」来搞清楚到底发生了什么事情。

除了在生活中,在日常的系统开发以及调试等过程中,记录日志同样是一件很重要的事情。很多编程初学者并没有「记录日志」的习惯,认为记录日志是一件可有可无的事情,出现问题的时候只要使用 print 函数打印一下程序的中间结果即可,真是 too young too naive。只是 print 的话对于简单的脚本程序来说或许可行,可是到了碰到复杂的系统,你如果还是只用 print 这种方式的话,你会看到大量的消息,看到吐也不一定能找到其中有用的消息。

「日志」是一个系统的重要组成部分,用来记录用户操作、系统运行状态和错误信息,它的好坏直接影响到系统出现问题时定位的速度,有日志记录,我们可以在服务崩溃的时候很快的通过查看日志来发现问题出现的地方,同样也可以通过对日志的观察和分析,提前发现系统可能存在的风险。

Python 的标准日志模块

上面我们说了「日志」是如此的重要,作为无所不能的 Python 当然也有日志相关的功能,Python 标准库中提供了 logging 模块供我们使用。在最简单的使用中,默认情况下 logging 将日志打印到屏幕终端,我们可以直接导入 logging 模块,然后调用 debug,info,warn,error 和 critical 等函数来记录日志,默认日志的级别为 warning,级别比 warning 高的日志才会被显示(critical > error > warning > info > debug),「级别」是一个逻辑上的概念,用来区分日志的重要程度。

import logging

logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')

上述代码的执行结果如下所示:

WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message

我在上面说过,用 print 的话会产生大量的信息,从而很难从中找到真正有用的信息。而 logging 中将日志分成不同的级别以后,我们在大多数时间只保存级别比较高的日志信息,从而提高了日志的性能和分析速度,这样我们就可以很快速的从一个很大的日志文件里找到错误的信息。

配置日志格式

我们在用 logging 来记录日志之前,先来进行一些简单的配置:

import logging

logging.basicConfig(filename= 'test.log', level= logging.INFO)

logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')

上面的例子中,我是用 basicConfig 对日志进行了简单的配置,其实我们还可以进行更为复杂些的配置,在此之前,我们先来了解一下 logging 中的几个概念:

  • Logger:日志记录器,是应用程序中可以直接使用的接口。
  • Handler:日志处理器,用以表明将日志保存到什么地方以及保存多久。
  • Formatter:格式化,用以配置日志的输出格式。

上述三者的关系是:一个 Logger 使用一个 Handler,一个 Handler 使用一个 Formatter。那么概念我们知道了,该如何去使用它们呢?我们的 logging 中有很多种方式来配置文件,简单的就用上面所说的 basicConfig,对于比较复杂的我们可以将日志的配置保存在一个配置文件中,然后在主程序中使用 fileConfig 读取配置文件。

基本的知识我们知道了,下面我们来做一个小的题目:日志文件保存所有 debug 及其以上级别的日志,每条日志中要有打印日志的时间,日志的级别和日志的内容。请先自己尝试着思考一下,如果你已经思考完毕请继续向下看:

import logging

logging.basicConfig(
  level= logging.DEBUG,
  format = '%(asctime)s : %(levelname)s : %(message)s',
  filename= "test.log"
)

logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')

上述代码的一次运行结果如下:

2018-10-19 22:50:35,225 : DEBUG : debug message
2018-10-19 22:50:35,225 : INFO : info message
2018-10-19 22:50:35,225 : WARNING : warn message
2018-10-19 22:50:35,225 : ERROR : error message
2018-10-19 22:50:35,225 : CRITICAL : critical message

我刚刚在上面说过,对于比较复杂的我们可以将日志的配置保存在一个配置文件中,然后在主程序中使用 fileConfig 读取配置文件。下面我们就来看一个典型的日志配置文件(配置文件名为 logging.conf):

[loggers]
keys = root

[handlers]
keys = logfile

[formatters]
keys = generic

[logger_root]
handlers = logfile

[handler_logfile]
class = handlers.TimedRotatingFileHandler
args = ('test.log', 'midnight', 1, 10)
level = DEBUG
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s

在上述的日志配置文件中,首先我们在 [loggers] 中声明了一个叫做 root 的日志记录器(logger),在 [handlers] 中声明了一个叫 logfile 的日志处理器(handler),在 [formatters] 中声明了一个名为 generic 的格式化(formatter)。之后在 [logger_root] 中定义 root 这个日志处理器(logger) 所使用的日志处理器(handler) 是哪个,在 [handler_logfile] 中定义了日志处理器(handler) 输出日志的方式、日志文件的切换时间等。最后在 [formatter_generic] 中定义了日志的格式,包括日志的产生时间,级别、文件名以及行号等信息。

有了上述的配置文件以后,我们就可以在主代码中使用 logging.conf 模块的 fileConfig 函数加载日志配置:

import logging
import logging.config

logging.config.fileConfig('logging.conf')

logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')

上述代码的运行一次的结果如下所示:

2018-10-19 23:00:02,809 WARNI [root:8] warn message
2018-10-19 23:00:02,809 ERROR [root:9] error message
2018-10-19 23:00:02,809 CRITI [root:10] critical message

写在之后

正如标题中所说的那样,我认为「日志记录」是每个 Python 程序员必须要知道且学会的东西,也是每个程序员必须具备的意识。如果你之前没有使用过日志亦或者说不知道该怎么去使用日志记录,这篇文章我相信会给你带来一些帮助。

Python 的日志库设计之好,用起来之灵活,可以说是 Python 标准库中相当优秀的存在。当然上面我们所说的只是 Python 日志库中很少的一部分,更多的操作和内容还需要你在今后的学习和实践中自己去发掘和运用。

The end。

以上就是Python 程序员必须掌握的日志记录的详细内容,更多关于python 日志的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python 记录日志的灵活性和可配置性介绍

    对一名开发者来说最糟糕的情况,莫过于要弄清楚一个不熟悉的应用为何不工作.有时候,你甚至不知道系统运行,是否跟原始设计一致. 在线运行的应用就是黑盒子,需要被跟踪监控.最简单也最重要的方式就是记录日志.记录日志允许我们在开发软件的同时,让程序在系统运行时发出信息,这些信息对于我们和系统管理员来说都是有用的. 就像为将来的程序员写代码文档一样,我们应该让新软件产生足够的日志供系统的开发者和管理员使用.日志是关于应用运行状态的系统文件的关键部分.给软件加日志产生句时,要向给未来维护系统的开发者和管理员

  • python3中的logging记录日志实现过程及封装成类的操作

    作用: 主要记录信息,便于定位查看问题. python logging模块官网: https://docs.python.org/zh-cn/3.7/library/logging.html#formatter-objects 三种定位问题方法: print debug调试:代码写好后,就不需要再进行调试了,所以引入了logger logging.debug() – 一般在测试环境中用 logger:当生产环境中有问题时,可以查看logger定位问题 步骤: 1.初始化日志 收集器 2.设置日志

  • python logging重复记录日志问题的解决方法

    日志相关概念 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变量数据的消息来描述.此外,事件也有重要性的概念,这个重要性也可以被称为严重性级别(level). 日志的作用 通过log的分析,可以方便用户了解系统或软件.应用的运行情况:如果你的应用log足够丰富,也可以分析以往用户的操作行为.类型喜好.地域分布或其他更多信息:如果一个应用的log同时也分了多个级别,那么可以很轻易地分析得到该应

  • Python Logging 日志记录入门学习

    Python Logging原来真的远比我想象的要复杂很多很多,学习路线堪比git.但是又绕不过去,alternatives又少,所以必须要予以重视,踏踏实实认认真真的来好好学学才行. 学习Logging的目的: 简单脚本还好,print足够. 但是稍微复杂点,哪怕是三四个文件加起来两三百行代码,调试也开始变复杂起来了. 再加上如果是后台长期运行的那种脚本,运行信息的调查更是复杂起来. 一开始我还在各种查crontab的日志查看,或者是python后台运行查看,或者是python stdout的

  • Python loguru日志库之高效输出控制台日志和日志记录

    1安装loguru loguru的PyPI地址为:https://pypi.org/project/loguru/ GitHub仓库地址为:https://github.com/Delgan/loguru 我们可以直接使用pip命令对其进行安装 pip install loguru 或者下载其源码,使用Python命令进行安装. |2loguru简单使用 from loguru import logger logger.info("中文loguru") logger.debug(&qu

  • python日志记录模块实例及改进

    python 打印对象的所有属性值: def prn_obj(obj): print '\n'.join(['%s:%s' % item for item in obj.__dict__.items()]) Python logger对象属性(由上述函数获取的) name:get_data parent:<logging.RootLogger instance at 0x1d8bd88> handlers:[<logging.FileHandler instance at 0x21bcc

  • Python记录详细调用堆栈日志的方法

    本文实例讲述了Python记录详细调用堆栈日志的方法.分享给大家供大家参考.具体实现方法如下: import sys import os def detailtrace(info): retStr = "" curindex=0 f = sys._getframe() f = f.f_back # first frame is detailtrace, ignore it while hasattr(f, "f_code"): co = f.f_code retSt

  • 记录Python脚本的运行日志的方法

    一.logging模块 Python中有一个模块logging,可以直接记录日志 # 日志级别 # CRITICAL 50 # ERROR 40 # WARNING 30 # INFO 20 # DEBUG 10 logging.basicConfig()函数中的具体参数: filename:   指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中: filemode:   文件打开方式,在指定了filename时使用这个参数,默认值为"w"还可指定为"

  • Python中logging日志记录到文件及自动分割的操作代码

    日志作为项目开发和运行中必备组件,python提供了内置的logging模块来完成这个工作:借助 TimedRotatingFileHandler 可以按日期自动分割日志,自动保留日志文件数量等,下面是对日志的一个简单封装和测试. import logging import os from logging import handlers class Logger(object): # 日志级别关系映射 level_relations = { 'debug': logging.DEBUG, 'in

  • python多进程下实现日志记录按时间分割

    python多进程下实现日志记录按时间分割,供大家参考,具体内容如下 原理:自定义日志handler继承TimedRotatingFileHandler,并重写computeRollover与doRollover函数.其中重写computeRollover是为了能按整分钟/小时/天来分割日志,如按天分割,2018-04-10 00:00:00~2018-04-11 00:00:00,是一个半闭半开区间,且不是原意的:从日志创建时间或当前时间开始,到明天的这个时候. 代码如下: #!/usr/bi

随机推荐