侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python Logging 日志记录入门学习

Python  /  管理员 发布于 7年前   153

Python Logging原来真的远比我想象的要复杂很多很多,学习路线堪比git。但是又绕不过去,alternatives又少,所以必须要予以重视,踏踏实实认认真真的来好好学学才行。

学习Logging的目的:

简单脚本还好,print足够。

但是稍微复杂点,哪怕是三四个文件加起来两三百行代码,调试也开始变复杂起来了。

再加上如果是后台长期运行的那种脚本,运行信息的调查更是复杂起来。

一开始我还在各种查crontab的日志查看,或者是python后台运行查看,或者是python stdout的获取等等,全都找错了方向。

真正的解决方案在于正确的logging。

记录好了的话,我不需要去找python的控制台输出stdout,也不需要找crontab的日志,只需要查看log文件即可。

下面是python的logging学习记录。

最简单的日志输出(无文件记录)

import logging logging.error("出现了错误")logging.info("打印信息")logging.warning("警告信息")

首先,忘掉logging.info()! 忘掉logging.basicConfig()!

网上各种关于python logging的文章实在是太不体谅新手了,logging这么复杂的东西竟然想表现得很简单,还用各种简单的东西做假象。

实际上我们真正要用起来的日志,绝对是不会直接用logging.info()和logging.basicConfig()这样的,这是此模块的官方推出来迷惑人的――看似让你一键上手,快速看到结果,但是跟实际真的不搭!

所以为了后面解释起来轻松,必须先警告这点:忘记它们俩!

记住,唯一要用到logging.什么的,就只有logging.getLogger()这一次。

了解logging的工作流

不想上流程图一类的东西,那样反而更迷糊。

简单说吧:

logging模块是会自动将你自定制的logger对象全局化的,

也就是说,你在自己的模块里只要定义了一次某个logger,比如叫log,那么只要是在同一个模块中运行的其他文件都能读取到它。

比如说,你在主文件main.py中自定义了一个logger,可能设置了什么输出文件、输出格式什么的,然后你在main.py中会引用一些别的文件或模块,比如sub.py,那么在这个sub.py中你什么都不用设置,只要用一句logger = logging.getLogger('之前在main.py定义的日志名')即可获得之前的一切自定义设置。

当然,被调用的文件(先称为子模块)中,用logging.getLogger('日志名')时,最好在日志名后加一个.子名称这样的,比如main.sub。这样输出的时候就会显示出来某条日志记录是来自于这个文件里了。当然,.前面的父级logger必须名字一致,是会被识别出来的!

然后,子日志还可以再子日志,甚至一个子模块可以再让所有函数各又一个子子日志,比如main.sub.func1这样的。logging都会根据.识别出来上下级关系的。

这样一说,实际上也就是class类继承的那种机制了。你按照父级名称继承,然后还可以改写自己的新设置等。

了解了这些概念以后,才能来谈代码。实际上也就好理解多了。

设置logger的方法

看来看去,这篇文章说得比较全面也最清楚,以下很多都参考到它的内容:Python 101: An Intro to logging

一般想要自定义一个logger,比如让它输出信息时按照什么格式显示,输出到哪个文件,要不要输出到屏幕一类,有三种方法可以达到设置:

  1. 直接在python代码里设置
  2. 用外部的config.ini文件配置
  3. 用python的dict字典配置

三种达到的目的都是一样的,字典用的人很少也不方便,配置文件比较好用只是.ini的语法不是很方便读,且不容易做到变量的动态设置,所以一般直接在python代码里写就好。

常用设置语句

以下是程序主入口文件的通用写法,注意,一定要在主入口定义好logger,这样其他所有的子模块才能够继承到。

#  main.pyimport loggingimport otherMod2  # 等下会调用到的子模块def main():  """  这个文件是程序的主入口  """  define_logger()  log = logging.getLogger('exampleApp')  # 输出信息测试  logger.info("Program started")  result = otherMod2.add(7, 8)   # 这个是来自别的模块的方法  logger.info("Done!")def define_logger():  logger = logging.getLogger("exampleApp")  logger.setLevel(logging.INFO)  # 设置输出格式  formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')   # 设置日志文件处理器  fh = logging.FileHandler("new_snake.log")  fh.setFormatter(formatter)  # 为这个处理器添加格式  # 设置屏幕stdout输出处理器  sh = logging.StreamHandler(stream=None)  sh.setFormatter(formatter)   # 把处理器加到logger上  logger.addHandler(fh)  logger.addHandler(sh) if __name__ == "__main__":  main()

下面是子模块中的调用方法(很简单):

# otherMod2.pyimport logging module_logger = logging.getLogger("exampleApp.otherMod2")def add(x, y):  # 这里一句`getLogger`就继承到父级的logger了  logger = logging.getLogger("exampleApp.otherMod2.add")  # 输出测试  logger.info("added %s and %s to get %s" % (x, y, x+y))  return x+y

注意,主文件中,在什么地方定义logger都可以,可以在main()里也可以在任何单独的函数或类里,无所谓。只要在调用子模块之前定义好了就可以了。一旦定义过,日志名就会被记下来,然后子模块就可以轻松继承到。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python中字符串的操作方法大全
    下一条:
    python实现寻找最长回文子序列的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客