logging日志模块

logging日志模块

因为最近学习的代码中使用到了logging模块,而logging的相关文档网上又多又杂,因此,我在B站上完成了logging模块的学习!下面是logging的简单介绍

预备知识

什么是日志?

日志是一种可以卓总某些软件运行时所发生事情的方法。软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。一个事件可包含可选变量数据的消息来描述。此外,时间也有重要性的概念,这个重要性也可以被称为严重性级别(level)。

日志的等级

级别何时使用
DEBUG详细信息,典型地调试问题时会感兴趣。详细的debug信息。
INFO证明事情按预期工作。关键事件。
WARNING表明发生了一些意外,或者不久的将来会发生问题(如”磁盘满了“)。软件还是在正常工作。
ERROR由于更严重的问题,软件已不能执行一些共嗯那个。一般错误消息。
CRITICAL严重错误,表明软件已不能继续运行了。
NOTICE不是错误,但是可能需要处理。普通但是重要的时事件。
ALERT需要立即修复,例如系统数据库损坏。
EMERGENCY紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。

java的log4j,log4php等第三方库也能较好的提供日志操作功能,有机会可以试着了解了解

logging的日志等级

日志等级(level)描述
DEBUG最详细的日志信息,典型应用场景是 问题诊断
INFO信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL当发生严重错误,导致应用程序不能继续运行时记录的信息
  • 该列表中的日志等级是从上到下依次增高,日志内容依次减少,即DEBUG可以显示所有日志,CRITICAL只能显示自己。例子如下:
import logging

logging.debug("this is s debug message")
logging.info("this is a info message")
logging.warning("this is a warning message")
logging.error("this is a error message")
logging.critical("this is a critical message")
# 根据默认的显示,这里只显示warning及以上的日志
WARNING:root:this is a warning message
CRITICAL:root:this is a critical message
ERROR:root:this is a error message

logging的使用方法

常用函数

函数说明
logging.debug(msg,* args,** kwargs)创建一条严重级别为DEBUG放入日志记录
logging.info(msg,* args,** kwargs)创建一条严重级别为INFO的日志
ogging.warning(msg, * args, ** kwargs)创建一条严重级别为WARNING的日志记录
logging.error(msg, * args, ** kwargs)创建一条严重级别为ERROR的日志记录
logging.critical(msg, * args, ** kwargs)创建一条严重级别为CRITICAL的日志记录
logging.log(level, * args, ** kwargs)创建一条严重级别为level的日志记录
logging.basicConfig(** kwargs)对root logger进行一次性配置

不推荐使用logging.basicConfig对日志等级进行自我创作

logging.basicConfig(level=logging.DEBUG)#将日志的输出级别调节为debug
logging.basicConfig(filename='demo.log',level=logging.DEBUG)#将日志的输出到demo.log文件中
logging.basicConfig(filename='demo.log',filemote='w',level=logging.DEBUG)#先清空再写入,也可以设置为继续写

常用的输出(字符串格式化输出)

logging.basicConfig(level=logging.DEBUG)
name = "LitraLin"
age = 20
logging.debug("姓名:%s 年龄:%d",name,age)
logging.debug("姓名:{} 年龄:{}".format(name,age))
DEBUG:root:姓名:LitraLin 年龄:20
DEBUG:root:姓名:LitraLin 年龄:20

加上时间字符串

logging.basicConfig(format="%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s",level=logging.DEBUG)
>>> 2020-07-16 15:35:58|DEBUG16-3.py:13|姓名 张三,年龄 18

注意:如果同时和上面的代码一起运行的话,可能会出现显示不出想要的结果,问题主要出在logging.basicConfig()上,因为前面的代码使用过该函数来确定本日志的输出级别,所以再一次调用它,最新一条logging.basicConfig()中的参数信息将不能传递到编译器中,也就不能显示想要的结果。解决方法,当需要再次调用logging.basicConfig时,将前面已经调用的那一行注释掉,或者之前在前面添加参数。

小结

上面讲了那么多关于logging的知识以及使用,但在实际项目中,我们一般不使用logging来查看代码的日志(因为在大项目中是经常需要查看日志的,如果每一次日志的格式不同,使用logging就意味着每次都需要改动logging的代码,这对项目的开发十分不利),所以,下面,我们将介绍在中大型项目中经常使用的logger。

logger的高级应用

相关组件

名称作用
Loggers记录器,提供应用程序代码直接使用的接口
Handlers处理器,将记录器产生的日志发送至目的地
Filters过滤器,提供更好的粒度控制,决定哪些日志会被输出
Formatters格式化器,设置日志内容的组成结构和消息字段

img

Handlers

它们将日志分发到不同的目的地。可以是文件、标准输出、邮件、或者通过 socke、htt等协议发送到任何地方
setFormatter():设置当前Handler对象使用的消息格式

  • Streamhandler
    标准输出stout分发器
sh = logging.StreamHandler(stream=None)
  • Filehandler
    将日志保存到磁盘文件的处理器
fh = logging.FileHandler(filename,mode='a',encoding=None,delay=False)
  • BaseRotatingHandler
  • Rotating Filehandler
    滚动的多日志输出,按照时间or其他方式去生成多个日志
  • TimedRotatingfilehandler

以下的使用较少

  • Sockethandler
  • Dataaramhandler
  • Smtphandler
  • Sysloghandler
  • Nteventloghandler
  • Httphandler
  • WatchedFilehandler
  • Qutelehandler
  • Nullhandler

Formatters格式

属性格式描述
asctime%(asctime)s日志产生的时间,默认格式为msecs2003-07-0816:49:45,896
msecs%(msecs)d日志生成时间的亳秒部分
created%(created)ftime.tme)生成的日志创建时间戳
message%(message)s具体的日志信息
filename%(filename)s生成日志的程序名
name%(name)s日志调用者
funcname%( funcname)s调用日志的函数名
levelname%(levelname)s日志级別( DEBUG,INFO, WARNING, 'ERRORCRITICAL)
levene%( leveling)s日志级别对应的数值
lineno%(lineno)d日志所针对的代码行号(如果可用的话)
module%( module)s生成日志的模块名
pathname%( pathname)s生成日志的文件的完整路径
process%( (process)d生成日志的进程D(如果可用)
processname(processname)s进程名(如果可用)
thread%(thread)d生成日志的线程D(如果可用)
threadname%( threadname)s线程名(如果可用)

举例

#记录器
logger = logging.getLogger('cn.cccb.applog')
logger.setLevel(logging.DEBUG)
#必须设置为两个handler中级别更低的

#处理器handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)

#没有给handler指定日志级别,将使用logger的级别
fileHandler = logging.FileHandler(filename='addDemo.log')
consoleHandler.setLevel(logging.INFO)

#formatter格式
formatter = logging.Formatter("%(asctime)s|%(levelname)8s|%(filename)10s%lineno)s|%(message)s")
#里面的8,10实现了占位对齐

#给处理器设置格式
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)

#记录器要设置处理器
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)

#定义一个过滤器
# flt = logging.Filter("cn.cccb")


#关联过滤器
# logger.addFilter(flt)
fileHandler.addFilter(flt)

#打印日志的代码
#logging.debug()#不能使用这个了!!!会使用WARNING的版本,不会用之前的记录器
logger.debug("姓名 %s, 年龄%d",name,age)
logger.debug("姓名 %s, 年龄%d",% (name,age))
logger.debug("姓名 {}, 年龄{}"format(name,age))
logger.debug(f"姓名{name}, 年龄{age}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值