Python中logging日志模块的解析(代码示例)

本篇文章给大家带来的内容是关于python中logging日志模块的解析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

一、日志记录的级别

debug:优先级10,记录调试的详细信息,只在调试时开启

info:优先级20,记录普通的消息,报告错误和警告等待。

warning:优先级30,记录相关的警告信息。

立即学习“Python免费学习笔记(深入)”;

error:优先级40,记录错误信息、程序崩溃

critical:优先级50,记录错误信息

如果不设置,默认为iwarning

二、logging模块的主要结构

查看logging的源码,可知主要有四个类实现功能:

Loggers:提供应该程序直接使用的接口,如相关的配置设置

Handlers:将Loggers产生的日志传到指定位置,设置日志保存的位置;

Filters:对输出日志进行过滤操作;

Formatters:控制日志的输出格式

Formatters

Formatters对象定义了日志的输出格式,有多种可选参数。

参数 含义

%(name)sLogger的名字%(levellno)s数字形式的日志级别%(levelname)s文本形式的日志级别%(pathname)s调用日志输出函数的模块的完整路径名,可能没有%(filename)s调用日志输出函数的模块的文件名%(module)s调用日志输出函数的模块名%(funcName)s调用日志输出函数的函数名%(lineno)d调用日志输出函数的语句所在的代码行%(created)f当前时间,用unix标表示的时间浮点表示%(relativeCreated)d输出日志信息时,自Logger创建以来的毫秒数%(asctime)s字符串形式的当前时间,默认格式是‘2018-11-22 16:49:45,896’,逗号后面是毫秒%(thread)d线程ID,可能没有%(threadName)s线程名,可能没有%(process)d进程ID,可能没有%(message)s用户输出的信息

实例:

import logging#fmt:定义输出的日志信息的格式#datefmt:定义时间信息的格式,默认为:%Y-%m-%d %H:%M:%S#style:定义格式化输出的占位符,默认是%(name)格式,可选{}或$格式formatter=logging.Formatter(fmt='%(asctime)s    %(levelname)s:  %(message)s'                            ,datefmt='%Y-%m-%d %H:%M:%S',style='%')

登录后复制

Handlers日志处理器

日志处理器用来处理日志的具体流向,是输出到文件中还是标准输出等,它通过设置Formatter控制输出格式,添加filters过滤日志。

常用的处理器有两种

StreamHandler:用于向控制台打印日志

FileHandler:用于向日志文件打印日志

其它的处理器

名称 详细位置 说明

RotatingHandlerlogging.handlers.RotatingHandler日志回滚方式,支持日志文件最大数量和日志文件回滚TimeRotatingHandlerlogging.handlers.TimeRotatingHandler日志回滚方式,在一定时间区域内回滚日志文件SocketHandlerlogging.handlers.SocketHandler远程输出日志到TCP/IP socketsDatagramHandlerlogging.handlers.DatagramHandler远程输出日志到UDP socketsSMTPHandlerlogging.handlers.SMTPHandler远程输出日志到邮件地址SysLogHandlerlogging.handlers.SysLogHandler日志输出到syslogNTEventLogHandlerlogging.handlers.NTEventLogHandler远程输出日志到Windows NT/2000/xp的事件日志MemoryHandlerlogging.handlers.MemoryHandler日志输出到内存中的指定bufferHTTPHandlerlogging.handlers.HTTPHandler通过“GET”或者“POST”远程输出到HTTP服务器

from logging import Handler#所有日志处理器的父类handler=Handler()print('处理日志的等级:',handler.level)print('处理日志的名字:',handler.name)print('处理器的日志过滤器::',handler.filters)print('日志的格式::',handler.filters)#一些常用方法:handler.get_name()handler.set_name('')handler.createLock()#创建线程锁handler.acquire()#获取线程锁handler.release()#释放线程锁handler.setLevel('info') #设置日志处理器的记录级别handler.setFormatter(fmt='')#设置日志的输出格式handler.addFilter('')#往处理器中添加过滤器handler.removeFilter('')#往处理器中移除过滤器handler.emit('')#日志记录的处理逻辑,由子类实现

登录后复制

Logger日志对象

Logger管理着所有记录日志的方法。

from logging import error, debug, warning, info, fatal, critical, getLogger#返回一个Logger实例#以'root'为名字的日志对象在Logger对象中只有一个实例logger=getLogger('root')print('获取根日志对象',logger.root)print('获取manager',logger.manager)print('获取根日志对象的名字',logger.name)print('获取根日志对象记录水平',logger.level)print('获取根日志对象过滤器列表',logger.filters)print('获取根日志对象处理器列表',logger.handlers)print('获取根日志对象',logger.disabled)#设置日志记录水平logger.setLevel('info')#输出日志信息,格式化输出logger.info('this is %s','info',exc_info=1)#记录warning信息logger.warning('')#记录error信息logger.error('')#等价于logger.error('',exc_info=1)logger.exception('')#记录debug信息logger.debug('')#记录critical信息logger.critical('')#直接指定级别logger.log('info','')#添加处理器logger.addHandler()#移除处理器logger.removeHandler()#判是否有处理器logger.hasHandlers()

登录后复制

三、logger的基本使用

实例:

import loggingimport sysdef my_get_logger(appname):    #获取logger实例,如果参数为空则返回root logger    logger=logging.getLogger(appname)    #创建日志输出格式    formatter=logging.Formatter('%(asctime)s    %(levelname)s:  %(message)s')    #指定输出的文件路径    file_handler=logging.FileHandler('test.log')    # 设置文件处理器,加载处理器格式    file_handler.setFormatter(formatter)    #控制台日志    console_handler=logging.StreamHandler(sys.stdout)    console_handler.formatter=formatter    #为logger添加的日志处理器    logger.addHandler(file_handler)    logger.addHandler(console_handler)    #指定日志的最低输出级别,默认为warn级别    logger.setLevel(logging.INFO)    return loggerif __name__ == '__main__':    logger=my_get_logger('test')    logger.debug('this is debug info')    logger.info('this is information')    logger.warning('this is warning message')    logger.error('this is error message')    logger.fatal('this is fatal message,it is same ad logger.critical')    logger.critical('this is critical message')

登录后复制

结果:

2018-11-22 16:31:34,023 INFO: this is information2018-11-22 16:31:34,023 WARNING: this is warning message2018-11-22 16:31:34,023 ERROR: this is error message2018-11-22 16:31:34,024 CRITICAL: this is fatal message,it is same ad logger.critical2018-11-22 16:31:34,024 CRITICAL: this is critical message

登录后复制

四、logger日志记录的逻辑调用过程

记录日志通过调用logger.debug等方法;

首先判断本条记录的日志级别是否大于设置的级别,如果不是,直接pass,不再执行;

将日志信息当做参数创建一个LogRecord日志记录对象

将LogRecord对象经过logger过滤器过滤,如果被过滤则pass

日志记录对象被Handler处理器的过滤器过滤

判断本条记录的日志级别是否大于Handler处理器设置的级别,如果不是,直接pass,不再执行;

最后调用处理器的emit方法处理日志记录;

五、配置logger

通过代码进行完整配置,主要是通过getLogger方法实现,但不好修改

通过basicConfig方法实现,这种方式快速但不够层次分明

通过logging.config.fileConfig(filepath),文件配置

通过dictConfig的字典方式配置,这是py3.2版本引入的新的配置方法

使用文件方式配置

#logging.cong[loggers]#定义日志的对象名称是什么,注意必须定义root,否则报错keys=root,main[handlers]#定义处理器的名字是什么,可以有多个,用逗号隔开keys=consoleHandler[formatters]#定义输出格式对象的名字,可以有多个,用逗号隔开keys=simpleFormatter[logger_root]#配置root对象的日志记录级别和使用的处理器level=INFOhandlers=consoleHandler[logger_main]#配置main对象的日志记录级别和使用的处理器,qualname值得就是日志对象的名字level=INFOhandlers=consoleHandlerqualname=main#logger对象把日志传递给所有相关的handler的时候,会逐级向上寻找这个logger和它所有的父logger的全部handler,#propagate=1表示会继续向上搜寻;#propagate=0表示停止搜寻,这个参数涉及重复打印的坑。propagate=0[handler_consoleHandler]#配置处理器consoleHandlerclass=StreamHandlerlevel=WARNINGformatter=simpleFormatterargs=(sys,)[formatter_simpleFormatter]#配置输出格式过滤器simpleFormatterformat=%(asctime)-%(name)s-%(levelname)s-%(message)s

登录后复制注意:可以看到logger和Handler都可以设置日志级别,日志输出是取最高级别。

使用字典形式配置

字典形式配置功能更强大,也更加灵活。通过dictConfig函数,我们可以将其他格式的配置文件转化成字典,如json,YAML等。

实例:

import yamlfrom logging.config import dictConfigimport osfilename=os.path.dirname(os.path.abspath(__file__))with  open(filename+'/logging.yaml','r') as f:    log=yaml.load(f.read())    dictConfig(log)

登录后复制

#logging.yaml#注意:yaml格式严格,:后面一定要带空格version: 1formatters:    simple:          format: '%(asctime)s-%(name)s-%(levelname)s-%(message)s'handlers:    console:          class: logging.StreamHandler          level: DEBUG          formatter: simple          stream: ext://sys.stdout    console_err:          class: logging.StreamHandler          level: DEBUG          formatter: simple          stream: ext://sys.stderrloggers:    simpleExample:          level: DEBUG          handlers: [console]          propagate: noroot:    level: DEBUG    handlers: [console_err]]

登录后复制

六、监听logger配置更改

logging.config.listen(port)函数可以让英语程序在一个socket上监听新的配置信息,达到在运行时改变配置,而不用重启应用程序的目的。

import logging.configimport logginglogging.config.fileConfig("logging.conf")logger=logging.getLogger('test.listen')#监听端口号9999t=logging.config.listen(9999)t.setDaemon(True)t.start()

登录后复制

以上就是Python中logging日志模块的解析(代码示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2534525.html

(0)
上一篇 2025年3月5日 21:32:37
下一篇 2025年3月5日 21:32:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎么找到黑客的联系方式?

    如果你想要找到黑客的联系方式,那么你可能面临以下难题:黑客往往会隐藏他们的身份,并且他们的联系方式很难被发现。php小编草莓在这里为你提供了一份指南,旨在帮助你找到黑客的联系方式。在本指南中,我们将介绍一些常见的黑客使用的联系方式,并提供一…

    2025年3月5日
    200
  • Python同时对数据做转换和换算的方法介绍与分析(附实例)

    本篇文章给大家带来的内容是关于Python同时对数据做转换和换算的方法介绍与分析(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们需要调用一个换算函数(例如sum()、min()、max()),但首先…

    编程技术 2025年3月5日
    200
  • Python将多个映射合并为单个映射的方法与分析(代码实例)

    本篇文章给大家带来的内容是关于python将多个映射合并为单个映射的方法与分析(代码实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们有多个字典或映射,想在逻辑上将它们合并为一个单独的映射结构,以此执行一…

    编程技术 2025年3月5日
    200
  • python类的相关知识介绍(附示例)

    本篇文章给大家带来的内容是关于python类的相关知识介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Python-类属性,实例属性,类方法,静态方法,实例方法 类属性和实例属性 #coding:utf-8c…

    编程技术 2025年3月5日
    200
  • Python数据可视化的四种方法介绍(附示例)

    本篇文章给大家带来的内容是关于Python数据可视化的四种方法介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 摘要:本文讲述了热图、二维密度图、蜘蛛图、树形图这四种Python数据可视化方法。 数据可视化是任…

    2025年3月5日 编程技术
    200
  • Python针对任意多的分隔符拆分字符串(附代码)

    本篇文章给大家带来的内容是关于python针对任意多的分隔符拆分字符串(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们需要将字符串拆分为不同的字段,但是分隔符(以及分隔符之间的空格)在整个字符串中并…

    编程技术 2025年3月5日
    200
  • 一篇文章带你学习Python列表

    本篇文章给大家带来的内容是关于一篇文章带你学习python列表,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 千里之行,始于足下。要练成一双洞悉一切的眼睛,还是得先把基本功扎扎实实地学好。今天,本喵带大家仔细温习一下Pyt…

    编程技术 2025年3月5日
    200
  • Django中怎么更改默认数据库为mysql(详细过程)

    本篇文章给大家带来的内容是关于django中怎么更改默认数据库为mysql(详细过程),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Django中默认使用sqlite3数据库,今天研究了下如何将它换成常见的mysql数据…

    编程技术 2025年3月5日
    200
  • Python中dateutil模块的理解(附示例)

    本篇文章给大家带来的内容是关于Python中dateutil模块的理解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 最近刚接触项目组内的python项目,发现所有的时间格式都是用的iso8601,同事美其名曰说…

    编程技术 2025年3月5日
    200
  • Python中元类与枚举类的介绍(代码示例)

    本篇文章给大家带来的内容是关于python中元类与枚举类的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一、元类 1、type()函数可以返回对象的类型,也可以创建出新的类型。它可以改变类创建时的行为,实…

    编程技术 2025年3月5日
    200

发表回复

登录后才能评论