前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python学习笔记7.7-日志记录模块logging

python学习笔记7.7-日志记录模块logging

作者头像
锦小年
发布于 2019-05-26 02:34:28
发布于 2019-05-26 02:34:28
71500
代码可运行
举报
文章被收录于专栏:锦小年的博客锦小年的博客
运行总次数:0
代码可运行

段子里说,使用日志的程序员鄙视使用print记录信息的程序员,所以作为一个合格的程序员,合理的记录日志实数非常必要的。本文主要介绍在python中如何使用logging模块记录日志。

1. 如何记录日志

我想对于程序员来说,记录日志的重要性不言而喻,各种bug的调试都离不开日志信息的参考,但是如何记录日志以及该记录一些什么信息却不是轻而易举就能掌握的。对于如何使用日志,网络大神已经给出了很好的答案。

  • 不应该自己写log,应该熟练的使用编程语言中对应的日志记录的模块。
  • 应该将log信息对应到适当的级别,有一下经验可以遵循:
    • TRACE level: 如果使用在生产环境中,这是一个代码异味(code smell)。它可以用于开发过程中追踪bug,但不要提交到你的版本控制系统
    • DEBUG level: 把一切东西都记录在这里。这在debug过程中最常用到。我主张在进入生产阶段前减少debug语句的数量,只留下最有意义的部分,在调试(troubleshooting)的时候激活。
    • INFO level: 把用户行为(user-driven)和系统的特定行为(例如计划任务…)
    • NOTICE level: 这是生产环境中使用的级别。把一切不认为是错误的,可以记录的事件都log起来
    • WARN level: 记录在这个级别的事件都有可能成为一个error。例如,一次调用数据库使用的时间超过了预设时间,或者内存缓存即将到达容量上限。这可以让你适当地发出警报,或者在调试时更好地理解系统在failure之前做了些什么
    • ERROR level: 把每一个错误条件都记录在这。例如API调用返回了错误,或是内部错误条件
    • FATAL level: 末日来了。它极少被用到,在实际程序中也不应该出现多少。在这个级别上进行log意味着程序要结束了。例如一个网络守护进程无法bind到socket上,那么它唯一能做的就只有log到这里,然后退出运行。
  • 应该写有意义的log,每一个log都应该对应有其价值
  • 日志信息最好是使用英语,并且合理的使用一些公认的简称或者是代码
  • 日志格式比较重要,最好是遵循日志库提供的标准格式
  • 记录日志的时候可以多考虑阅读者
  • 日志的功能不仅在于调试,在审查、建档、统计等功能中也用的比较多

2. logging模块简介

logging是python内置的一个标准模块,主要用于输出或者保存程序运行日志,它有以下优点: - 可以设置输出日志的等级、日志保存路径、日志文件回滚 - 不仅可以控制台输出,还可以文件保存,不仅可以在代码中配置,还支持从配置文件中直接加载日志的配置 与print()函数相比,logging有很多优势,如果还在用print()记录日志,从现在起,习惯使用logging吧。

3. logging的等级

logging中包含了6个等级,分别是:(log是一个logging实例)

log等级

使用范围

函数

备注

FATAL

致命错误

log.fatal

CRITICAL

特别糟糕的事情

log.critical

如内存耗尽、磁盘空间为空,一般很少使用

ERROR

发生错误时

log.error

如 IO操作失败或者连接问题

WARNING

发生很重要的事件,但是并不是错误时

log.warning

如用户登录密码错误

INFO

处理请求或者状态变化等日常事务

log.info

DEBUG

调试过程中使用DEBUG等级

log.debug

如 算法中每个循环的中间状态

在这些等级中,由下向上严重性依次递增,也就是DEBUG是最轻的,FATAL是最严重的。每一个等级都对应于一个函数用于记录对应等级的日志。当设置了输出日志的等级后,只会输出或者保存当前等级以及更严重等级的信息,这样可以在不同的环境中输出不用的调试信息。例如设置了日志等级是DEBUG,那么所有的日志都会输出;如果设置为ERROR,那么就只有ERROR,CRITICAL,FATAL这三个等级会被保存或者输出。

4. logging的使用

logging的使用流程是:1. 配置logging,包括是在控制台输出还是保存在文件、输出内容、输出格式等(可以在代码中直接配置,也可以在配置中加载配置)2.初始化一个日志类 3. 使用不同的级别日志函数记录日志

4.1 基本使用:在控制台输出日志信息

logging的基本使用是在控制台中,使用例程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
# config the logging
logging.basicConfig(level=logging.DEBUG, format='%(lineno)d - %(asctime)s - %(levelname)s - %(message)s')
# create a logging object
log = logging.getLogger(__name__)

# using logging function to log 
log.info('start logging')
log.debug('this is a debug')
log.warning('just a warning')
log.error('here is a error')
log.critical('here is a critical error')
log.fatal(' big bug')

因为设置的level是DEBUG,所以所有的信息都会打印输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
12 - 2018-09-16 21:05:38,837 - INFO - start logging
13 - 2018-09-16 21:05:38,838 - DEBUG - this is a debug
14 - 2018-09-16 21:05:38,839 - WARNING - just a warning
15 - 2018-09-16 21:05:38,840 - ERROR - here is a error
16 - 2018-09-16 21:05:38,841 - CRITICAL - here is a critical error
17 - 2018-09-16 21:05:38,842 - CRITICAL -  big bug

在logging.basicconfig中把level设置为ERROR,输出为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
15 - 2018-09-16 21:54:12,820 - ERROR - here is a error
16 - 2018-09-16 21:54:12,821 - CRITICAL - here is a critical error
17 - 2018-09-16 21:54:12,821 - CRITICAL -  big bug

这个例子就验证了前面所说的:当设置了输出日志的等级后,只会输出或者保存当前等级以及更严重等级的信息,这样可以在不同的环境中输出不用的调试信息。例如设置了日志等级是DEBUG,那么所有的日志都会输出;如果设置为ERROR,那么就只有ERROR,CRITICAL,FATAL这三个等级会被保存或者输出。

  • 下面说一下logging.basicConfig函数参数的含义:

参数名

作用

备注

filename

指定日志文件名

filemode

和file函数意义相同,指定日志文件的打开模式,’w’或者’a’;

format

指定输出的格式和内容

datefmt

指定时间格式,同time.strftime()

level

设置日志级别

默认为logging.WARNNING

stream

指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件

默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略;

- format参数的选择

参数名

参数意义

备注

%(levelno)s

打印日志级别的数值

%(levelname)s

打印日志级别的名称

%(pathname)s

打印当前执行程序的路径

其实就是sys.argv[0]

%(filename)s

打印当前执行程序名

%(funcName)s

打印日志的当前函数

%(lineno)d

打印日志的当前行号

%(asctime)s

打印日志的时间

%(thread)d

打印线程ID

%(threadName)s

打印线程名称

%(process)d

打印进程ID

%(message)s

打印日志信息

在实例中:format='%(lineno)d - %(asctime)s - %(levelname)s - %(message)s' 就是打印当前运行行,时间,级别,日志信息

4.2 将日志保存在文件

将日志保存在文件一般有三种形式:只保存在文件、控制台显示同时保存在文件、日志回滚

4.2.1 只保存在文件

这种方式的使用过程是:设置logging并创建一个FileHandler,并对输出消息的格式进行设置,将其添加到logger,然后将日志写入到指定的文件中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
# Instantiate a logging
logger = logging.getLogger(__name__)
# set level
logger.setLevel(level = logging.INFO)
# use FileHander to set file
handler = logging.FileHandler("log.txt")
# set level
handler.setLevel(logging.INFO)
# set format
formatter = logging.Formatter('%(lineno)d - %(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

logger.addHandler(handler)

logger.info("this is a info")
logger.debug("just debug")
logger.warning("this ia a warning")
logger.error("sorry, this is a bug")

查看txt中的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
16 - 2018-09-16 22:19:31,449 - __main__ - INFO - this is a info
18 - 2018-09-16 22:19:31,449 - __main__ - WARNING - this ia a warning
19 - 2018-09-16 22:19:31,449 - __main__ - ERROR - sorry, this is a bug

因为LEVEL设置为INFO所以debug的日志没有记录(debug级别比info更低) - NOTES 代码中有两个设置level的地方,logger.setLevel(level = logging.INFO)是设置整个logging的level,handler.setLevel(logging.INFO)是设置打印到文件的level,实际工作中只会保存两个level中级别最严格的那个

4.2.2 控制台输出同时文件保存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

console = logging.StreamHandler()
console.setLevel(logging.ERROR)

# TWO kind way must be added
logger.addHandler(handler)
logger.addHandler(console)

logger.info("this is a info")
logger.debug("just debug")
logger.warning("this ia a warning")
logger.error("sorry, this is a bug")

控制台输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sorry, this is a bug

txt文件中的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2018-09-16 22:30:30,913 - __main__ - INFO - this is a info
2018-09-16 22:30:30,914 - __main__ - WARNING - this ia a warning
2018-09-16 22:30:30,914 - __main__ - ERROR - sorry, this is a bug

因为控制台和文件的level设置的不一样,所以日志信息不一样 - notes 也就是说,保存文件个控制台都可以单独设置level,实际工作中以单独了level和全局level中最严格的那个level为准

4.2.3 日志回滚

将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统的性能。因此,有必要对日志文件按某种条件进行切分,要切分日志文件,这种方式就是日志回滚。 分割日志的触发条件:大小、日期,或者大小加上日期。说是切分,实际上是,当一个日志文件达到触发条件后,对日志文件进行重命名,之后再新建原来名称的日志文件(此时就是空文件了),新产生的日志就写入新的日志文件。 为啥叫回滚呢?当分割的日志文件达到指定数目的上限个数时,最老的日志文件就会被删除。 logging模块中使用RotatingFileHandler,可以实现日志回滚。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
#定义一个RotatingFileHandler,最多备份3个日志文件,每个日志文件最大1K
rHandler = RotatingFileHandler("log.txt",maxBytes = 1*512,backupCount = 3)
rHandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rHandler.setFormatter(formatter)

console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter)

logger.addHandler(rHandler)
logger.addHandler(console)

logger.info("this is a info")
logger.debug("just debug")
logger.warning("this ia a warning")
logger.error("sorry, this is a bug")

多运行几次,就看到产生了很多txt文件,但最多三个txt日志文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-a----        2018/9/16     22:40            453 log.txt
-a----        2018/9/16     22:39            512 log.txt.1

4.2.4 捕获异常

logging还可以用来捕获python异常,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

console = logging.StreamHandler()
console.setLevel(logging.INFO)

logger.addHandler(handler)
logger.addHandler(console)

logger.info("this is a info")
logger.debug("just debug")
logger.warning("this ia a warning")
logger.error("sorry, this is a bug")

try:
    open("a.txt","rb")
except (SystemExit,KeyboardInterrupt):
    raise
except Exception:
    logger.error(" ",exc_info = True)

txt文件中就可以看到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Traceback (most recent call last):
  File "g:\myfiles\home\Python\HBN\get_ibfo.py", line 21, in <module>
    open("a.txt","rb")
FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'

后续更新在不用的模块中同时使用log以及怎么通过配置文件加载logging的配置

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年09月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python入门之logging模块
本章目录:     一、logging模块简介     二、logging模块的使用     三、通过JSON或者YMAL文件配置logging模块 ===================================================== 一、logging模块简介  Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自
Jetpropelledsnake21
2018/05/03
1.1K0
Python入门之logging模块
Python模块知识5:日志logging
logging模块提供了通用的日志系统,可以采用不同的方式记录日志,比如文件,HTTP、GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式; 日志分不同提醒级别,级别顺序为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,可以自己定义日志级别。 级别越高打印的日志等级越少,反之亦然。 debug: 打印全部的日志(notset等同于debug) info:打印info、warning、error、critical级别的日志 w
企鹅号小编
2018/01/11
7950
Python模块知识5:日志logging
日志记录模块logging
在python中,日志记录显示有两种方式,一种是保存在文件和打印屏幕上,一种保存在文件中。
py3study
2020/01/20
5450
Python开发之日志记录模块:logg
最近在开发一个应用软件,为方便调试和后期维护,在代码中添加了日志,用的是Python内置的logging模块,看了许多博主的博文,颇有所得。不得不说,有许多博主大牛总结得确实很好。似乎我再写关于logging的博文有些多余,但不写总结又总觉得没掌握。那就写写吧,也方便日后回顾。
py3study
2020/01/16
1.4K0
Python开发之日志记录模块:logg
Python logging模块
logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。
py3study
2020/01/09
4440
一篇文章带你搞定Python中logging模块
日志是什么?这个不用多解释。百分之九十的程序都需要提供日志功能。Python内置的logging模块,为我们提供了现成的高效好用的日志解决方案。但是,不是所有的场景都需要使用logging模块,
Go进阶者
2021/11/19
4470
一篇文章带你搞定Python中logging模块
Python3日志记录模块
描述: Logging 库是非常常用的记录日志库,通过logging模块存储各种格式的日志,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚、日志按时分秒进行切割等.
全栈工程师修炼指南
2022/09/29
5300
Python3日志记录模块
轻松搞定Python日志记录:logging模块详解与实战
在开发和维护软件时,日志记录是一个非常重要的环节。它可以帮助开发者调试代码、监控应用运行状态、记录系统行为等。Python的logging模块提供了一个灵活且强大的日志记录功能,能够满足各种日志记录需求。本文将详细介绍logging模块的使用,包括基本概念、配置方法、日志级别、日志处理器和格式化器的使用,以及实际应用案例。
sergiojune
2024/08/02
8850
轻松搞定Python日志记录:logging模块详解与实战
Python logging模块怎么使用,你会了吗?
在开发和维护Python应用程序时,日志记录是一项非常重要的任务。Python提供了内置的logging模块,它可以帮助我们方便地记录应用程序的运行时信息、错误和调试信息。本文将介绍如何使用Python logging模块进行日志记录。
霍格沃兹测试开发Muller老师
2023/09/07
2380
Python日志模块logging
logger只输出高于或等于当前级别的日志, logging的root logger默认级别为info.
菲宇
2022/12/21
3490
Python日志模块logging
深入理解 Python 中的日志 logging 模块
日志记录是软件开发中的一个重要环节,它可以帮助我们监控程序运行过程中的状态、诊断问题以及分析性能。Python 中通常使用 logging 模块,让我们能够方便地记录日志信息。
Mirza Zhao
2023/11/17
4620
深入理解 Python 中的日志 logging 模块
python + logging 实现日志输出及保存到文件
最近因为一个小需求,需要保存日志到文件中。因为平时调试都只是用print,当不需要的时候又得把print删掉,这样很不方便,而且这样也只能把报错信息输出到控制台。于是上网查了一下,python有一个内置模块logging,用来输出日志信息,可以进行各种配置,看了之后有种相见恨晚的感觉。下面进行一些个人的总结,主要是对自己学习进行的归纳,也希望能对你有所帮助。
梦飞
2022/06/23
6.2K0
python + logging 实现日志输出及保存到文件
Python日志处理logging模块
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等。
用户5521279
2020/05/08
7960
【测试开发】python系列教程:logging日志模块
在我们正常的开发中,总能想要打印一些信息,或者打印日志,我们都是用的print,但是在小规模的程序开发中是可以来用的,也便于调试,但是对于大点的项目,我们想要保存执行过程中的日志,用print来打印来说就不能满足了。我们用loggin模块可以来记录,以排查程序在某一个时候崩溃的具体原因,以便及时定位Bug进行抢救。
雷子
2023/08/21
2360
【测试开发】python系列教程:logging日志模块
【Python日志模块全面指南】:记录每一行代码的呼吸,掌握应用程序的脉搏
日志是记录了一系列事件或活动的文件。在计算机领域,它通常用于记录程序或系统的运行状况和维护信息,以便在需要时进行故障排除或回溯。通过分析日志文件,管理员可以了解系统的使用情况、问题发生的原因以及如何解决这些问题。
爱喝兽奶的熊孩子
2024/06/23
4400
【Python日志模块全面指南】:记录每一行代码的呼吸,掌握应用程序的脉搏
logging模块
logging模块 函数式简单配置 import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNIN
用户1214487
2018/01/23
6970
python3 logging模块
很多程序都有记录日志的需求,并且日志包含的信息有正常的程序访问日志还可能有错误,警告等信息输出,python的logging模块提供了标准的日志接口,可以通过它存储各种格式的日志,日志级别等级:cri
用户1679793
2018/04/28
1.4K0
python3 logging模块
Python3-logging模块
因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章。传送门:https://www.cnblogs.com/testdjt/p/7834856.html
润森
2019/10/24
7420
Python日志处理logging模块详解
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点
王大力测试进阶之路
2020/01/26
9680
Python 使用 logging模块打印日志
开发过程中出现bug是必不可免的,你会怎样debug?从第1行代码开始看么?还是有个文件里面记录着哪里错了更方便呢!!!log日志
Devops海洋的渔夫
2019/05/31
1.3K0
相关推荐
Python入门之logging模块
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档