• 『无为则无心』Python日志 — 64、Python日志模块logging介绍


    1、日志的作用

    从事与软件相关工作的人,应该都听过“日志”一词。

    日志就是跟踪软件运行时事件的方法,为了能够在程序运行过程中记录错误。

    通过日志记录程序的运行,方便我们查询信息,以便追踪问题、进行维护和调试、还是数据分析。

    并且各编程语言都形成了各自的日志体系和相应的框架。

    日志的作用总结:

    • 程序调试。
    • 了解软件程序运行情况是否正常。
    • 软件程序运行故障分析与问题定位。

    2、为什么需要写日志

    首先我们要树立一个观点,那就是“不是为了记录日志而记录日志,日志也不是随意记的”。要实现能够只通过日志文件还原整个程序执行的过程,达到能透明地看到程序里执行情况,每个线程每个过程到底执行结果的目的。日志就像飞机的黑匣子一样,应当能够复原异常的整个现场乃至细节。

    在项目中,日志这个功能非常重要,我们要重视起来。

    • 我们要知道日志能用来干什么,能干到什么程度。
    • 要知道日志框架的使用方法和配置方式。
    • 要知道什么地方该进行日志记录。
    • 要知道进行什么级别的日志记录。
    • 日志中该写些什么内容。

    3、Python中的日志处理

    (1)logging模块介绍

    在Python中,使用logging模块来进行日志的处理。

    logging是Python的内置模块,主要用于将日志信息进行格式化内容输出,可将格式化内容输出到文件,也可输出到屏幕。

    我们在开发过程中,常用print()函数来进行调试,但是在实际应用的部署时,我们要将日志信息输出到文件中,方便后续查找以及备份。

    在我们使用日志管理时,我们也可以将日志格式化成Json对象转存到ELK中方便图形化查看及管理。

    (2)logging模块的四大组件

    logging模块将日志系统从高向低依次定义了四个类,分别是logger(日志器)、handler(处理器)、filter(过滤器)和formatter(格式器)。其中由日志器生成的实例将接管原本日志记录函数logging.log的功能。

    组件 说明
    logger 提供应用程序代码直接使用的接口。
    handler 用于将日志记录发送到指定的目的位置。
    formatter 用于控制日志信息的最终输出格式,格式化输出。
    filter 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略)。

    说明:

    • Logger:用于记录日志的对象。
      工作流程如下:
      1、判断需要记录的日志level是否满足当前logger对象设置的level等级要求。
      比如logger设置的levelInfo,记录时使用的logger.debug,那么就会不满足,所以不会记录日志。
      2、查看loggerfilter过滤器是否满足。
      3、filter通过之后,交给loggerhandler来记录日志,一个logger是可以设置多个handler
      注意:在整个应用中可以有多个logger,使用logging.getLogger时通过指定name来获取对象,实际logging中还存在一个Manager类,由Manager来进行多logger的单例模式管理。
    • Handler:用于记录日志到具体的文件、输出流或其他的管道。
      功能如下:
      1、查看记录日志是否满足过滤器。
      2、满足过滤器,按照设置的Formatter生成字符串。
      3、将内容写入到具体的文件或者输出流
      不同的Handler可能有不同的处理,但是底层原理还是做这三件事情。

    (3)logging日志级别

    我们先来思考下下面的两个问题:

    • 作为开发人员,在开发一个应用程序时需要什么日志信息?在应用程序正式上线后需要什么日志信息?
    • 作为应用运维人员,在部署开发环境时需要什么日志信息?在部署生产环境时需要什么日志信息?

    在软件开发阶段或部署开发环境时,为了尽可能详细的查看应用程序的运行状态来保证上线后的稳定性,我们可能需要把该应用程序所有的运行日志全部记录下来进行分析,这是非常耗费机器性能的。

    当应用程序正式发布或在生产环境部署应用程序时,我们通常只需要记录应用程序的异常信息、错误信息等,这样既可以减小服务器的I/O压力,也可以避免我们在排查故障时被淹没在日志的海洋里。

    那么怎样才能在不改动应用程序代码的情况下,根据事件的重要性或者称之为等级,实现在不同的环境中,记录不同详细程度的日志呢?

    这就是日志等级的作用了,我们通过配置文件指定我们需要的日志等级就可以了。

    级别 何时使用
    DEBUG 细节信息,仅当诊断问题时适用。
    INFO 确认程序按预期运行。
    WARNING 表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。但程序还是在正常工作。
    ERROR 由于严重的问题,程序的某些功能已经不能正常执行。
    CRITICAL 严重的错误,表明程序已不能继续运行了。

    说明:

    • 上面列表中的日志等级是从上到下依次升高的,即:DEBUGINFOWARNINGERRORCRITICAL。而日志的信息量是依次减少的。
    • 当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息,小于该等级的日志记录将会被丢弃。

    总结:

    • 开发应用程序时或部署开发环境时,可以使用DEBUGINFO级别的日志获取尽可能详细的日志信息,可以方便进行开发或部署调试。
    • 应用上线或部署生产环境时,应用使用WARNINGERRORCRITICAL级别的日志,来降低机器的I/O压力和提高获取错误日志信息的效率。
    • 日志级别的指定通常都是在应用程序的配置文件中进行指定的。
    • 不同的应用程序所定义的日志等级会有所差别,根据实际需求来决定。

    参考:


    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/15963454.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Net Core API +Vue Nginx集成发布
    计算机毕业设计基于springboot+vue+elementUI的在线动漫漫画投稿播放平台 前后端分离(源码+系统+mysql数据库+Lw文档)
    golang学习笔记——missing go.sum entry for go.mod file
    手写一个简单爬虫--手刃豆瓣top250排行榜
    MC9S12DP512VPVE、MC9S12DT512CPVE HCS12系列 微控制器 16位 闪存 112LQFP
    Flink CEP(复杂事件处理)高级进阶
    基于复数卷积神经网络的辐射源识别方法
    11月14号|Move生态Meetup相约浪漫土耳其
    嵌入式led灯效驱动(easy_led)
    (Java)设计模式:创建型
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/15963454.html