python:logging模块

news/2024/7/5 23:30:10 标签: python, 开发语言, 后端

一、basicConfig日志

1.案例

python">import logging

# basicConf日志
LOG_FORMAT = '%(asctime)s %(name)s %(levelname)s %(pathname)s %(lineno)s %(message)s'
DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
logging.basicConfig(level=logging.WARNING,   #默认是WARNING级别
                    format=LOG_FORMAT,    # 日志输出的格式
                    datefmt=DATE_FORMAT,  # 时间的格式
                    filename=r'test.log', # 有了filename参数后,就不会再将日志输出到控制台,而会写入文件中
                    filemode='w',
                    )
logging.debug('debug...')
logging.info('info...')
logging.warning('warning...')
logging.error('error...')
logging.critical('critical...')

2. 参数介绍

参数名称描述
filename指定日志输出目标文件的文件名(可以写文件名也可以写文件的完整的绝对路径,写文件名日志放执行文件目录下,写完整路径按照完整路径生成日志文件),指定该设置项后日志信心就不会被输出到控制台了
filemode指定日志文件的打开模式,默认为’a'。需要注意的是,该选项要在filename指定时才有效
format指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。logging模块定义的格式字段下面会列出。
datefmt指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效
level指定日志器的日志级别
stream指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发 ValueError异常
stylePython 3.2中新添加的配置项。指定format格式字符串的风格,可取值为'%'、'{‘和’$',默认为'%'
handlersPython 3.3中新添加的配置项。该选项如果被指定,它应该是一个创建了多个Handler的可迭代对象,这些handler将会被添加到root logger。需要说明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时出现2个或3个,否则会引发ValueError异常。

3.format格式字符串参数介绍

字段/属性名称使用格式描述
asctime%(asctime)s将日志的时间构造成可读的形式,默认情况下是‘2016-02-08 12:00:00,123’精确到毫秒
name%(name)s所使用的日志器名称,默认是’root',因为默认使用的是 rootLogger
filename%(filename)s调用日志输出函数的模块的文件名; pathname的文件名部分,包含文件后缀
funcName%(funcName)s由哪个function发出的log, 调用日志输出函数的函数名
levelname%(levelname)s日志的最终等级(被filter修改后的)
message%(message)s日志信息, 日志记录的文本内容
lineno%(lineno)d当前日志的行号, 调用日志输出函数的语句所在的代码行
levelno%(levelno)s该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
pathname%(pathname)s完整路径 ,调用日志输出函数的模块的完整路径名,可能没有
process%(process)s当前进程, 进程ID。可能没有
processName%(processName)s进程名称,Python 3.1新增
thread%(thread)s当前线程, 线程ID。可能没有
threadName%(thread)s线程名称
module%(module)s调用日志输出函数的模块名, filename的名称部分,不包含后缀即不包含文件后缀的文件名
created%(created)f当前时间,用UNIX标准的表示时间的浮点数表示; 日志事件发生的时间–时间戳,就是当时调用time.time()函数返回的值
relativeCreated%(relativeCreated)d输出日志信息时的,自Logger创建以 来的毫秒数; 日志事件发生的时间相对于logging模块加载时间的相对毫秒数
msecs%(msecs)d日志事件发生事件的毫秒部分。logging.basicConfig()中用了参数datefmt,将会去掉asctime中产生的毫秒部分,可以用这个加上

二、logger日志

1.loggin模块的四大组件

日志流处理流程是一个模块级别的函数是logging.getLogger([name])(返回一个logger对象,如果没有指定名字将返回root logger)。

组件名称对应类名功能描述
日志器Logger提供了应用程序可一直使用的接口
处理器Handler将logger创建的日志记录发送到合适的目的输出
过滤器Filter提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
格式器Formatter决定日志记录的最终输出格式

这些组件之间的关系描述:

  • 日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.stdout、网络等;
  • 不同的处理器(handler)可以将日志输出到不同的位置;
  • 日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置;
  • 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志;
  • 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。

简单点说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。

2.Handler类

Handler对象的作用是(基于日志消息的level)将消息分发到handler指定的位置(文件、网络、邮件等)。Logger对象可以通过addHandler()方法为自己添加0个或者更多个handler对象。比如,一个应用程序可能想要实现以下几个日志需求:

  1. 把所有日志都发送到一个日志文件中;
  2. 把所有严重级别大于等于error的日志发送到stdout(标准输出);
  3. 把所有严重级别为critical的日志发送到一个email邮件地址。这种场景就需要3个不同的handlers,每个handler复杂发送一个特定严重级别的日志到一个特定的位置。
Handler.setLevel(lel): # 指定被处理的信息级别,低于lel级别的信息将被忽略
Handler.setFormatter():# 给这个handler选择一个格式
Handler.addFilter(filt):# Handler.removeFilter(filt):新增或删除一个filter对象

需要说明的是,应用程序代码不应该直接实例化和使用Handler实例。因为Handler是一个基类,它只定义了素有handlers都应该有的接口,同时提供了一些子类可以直接使用或覆盖的默认行为。下面是一些常用的Handler:

Handler描述
logging.StreamHandler将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。
logging.FileHandler将日志消息发送到磁盘文件,默认情况下文件大小会无限增长
logging.handlers.RotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按大小切割
logging.hanlders.TimedRotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按时间切割
logging.handlers.HTTPHandler将日志消息以GET或POST的方式发送给一个HTTP服务器
logging.handlers.SMTPHandler将日志消息发送给一个指定的email地址
logging.NullHandler该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免’No handlers could be found for logger XXX’信息的出现。

3.Formater类 

 Formater对象用于配置日志信息的最终顺序、结构和内容。与logging.Handler基类不同的是,应用代码可以直接实例化Formatter类。另外,如果你的应用程序需要一些特殊的处理行为,也可以实现一个Formatter的子类来完成。

python"># Formater类的构造方法定义如下  
logging.Formatter.__init__(fmt=None, datefmt=None, style='%')

# Fromater类的三个可选参数
#fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
#datefmt:指定日期格式字符串,如果不指定该参数则默认使用”%Y-%m-%d %H:%M:%S"
#style:Python 3.2新增的参数,可取值为 ‘%’, ‘{‘和 ‘$',如果不指定该参数则默认使用’%’

# 一般直接使用logging.Formater(fmt,datefmt)

4.Filter类

Filter可以被Handler和Logger用来做比level更细粒度的、更复杂的过滤功能。Filter是一个过滤器基类,它只允许某个logger层级下的日志事件通过过滤 

python"># 该类定义如下: 
class logging.Filter(name='')
      filter(record)

比如,一个filter实例化时传递的name参数值为’A.B’,那么该filter实例将只允许名称为类似如下规则的loggers产生的日志记录通过过滤:‘A.B’,‘A.B,C’,‘A.B.C.D’,‘A.B.D’,而名称为’A.BB', ‘B.A.B’的loggers产生的日志则会被过滤掉。如果name的值为空字符串,则允许所有的日志事件通过过滤。

filter方法用于具体控制传递的record记录是否能通过过滤,如果该方法返回值为0表示不能通过过滤,返回值为非0表示可以通过过滤。

说明:

  1. 如果有需要,也可以在filter(record)方法内部改变该record,比如添加、删除或修改一些属性
  2. 我们还可以通过filter做一些统计工作,比如可以计算下被一个特殊的logger或handler所处理的record数量等。

5.日志流处理简要流程

python">/*
1、创建一个logger
2、设置下logger的日志的等级
3、创建合适的Handler(FileHandler要有路径)
4、设置下每个Handler的日志等级
5、创建下日志的格式
6、向Handler中添加上面创建的格式
7、将上面创建的Handler添加到logger中
8、打印输出logger.debug\logger.info\logger.warning\logger.error\logger.critical
*/
python">import logging

# logger模块
def get_logger():
    logger = logging.getLogger()  # 返回一个日志器对象,默认warning级别
    logger.setLevel(logging.DEBUG)    # 给logger对象设置日志级别
    # 创建handler/streamhandler
    sh = logging.StreamHandler()
    sh.setLevel(logging.ERROR)  # 给handler对象设置日志级别
    fh = logging.FileHandler(filename='test02.log', mode='w', encoding='utf-8')
    # 创建一个格式器
    fmt = logging.Formatter(
        fmt="%(asctime)s %(name)s %(filename)s %(message)s",
        # datefmt="%Y/%m/%d %X"
    )

    sh.setFormatter(fmt)
    logger.addHandler(sh)

    fh.setFormatter(fmt)
    logger.addHandler(fh)
    return logger

get_logger().debug('debug...')
get_logger().info('info...')
get_logger().warning('warning日志')
get_logger().error('error...')
get_logger().critical('critical...')

注意:因为logging模块是基于单例模式线程安全的,所以get_logger()如果名字参数相同则返回的是同一个对象,所以

添加handler的时候一定要判断,不要重复添加造成重复打印日志的bug!


http://www.niftyadmin.cn/n/1425334.html

相关文章

python pyqt5获取文本框里输入的值_利用Python制作一个音乐播放器,堪比QQ音乐!...

导语利用Python制作一款简易音乐播放器,让我们愉快地开始吧~源代码python学习资料私信小编“01”即可获取!开发工具Python版本:3.6.4相关模块:pyqt5模块;以及一些Python自带的模块。环境搭建安装Python并添加到环境变量…

python:os模块

os模块是与操作系统交互的一个接口 用法说明os.getcwd()获取当前工作目录,即当前python脚本的工作目录os.chdir()改变当前脚本工作目录;相当于shell下的cdos.curdir返回当前目录os.pardir获取当前目录的父目录字符串名os.makedirs(dir1/dir2)创建多层递…

13.1.8 如何有选择的显示和隐藏组件

<h:panelGroup rendered"#{userBean.loggedIn}"> ... </h:panelGroup> <h:panelGroup rendered"#{!userBean.loggedIn}"> ... </h:panelGroup> 超过两个选项的情况&#xff0c;最好使用组件&#x…

用户dsn保存位置‘_超越DSN,港科大李铎与陈启峰提出DHM

本文首发于(极市平台)paper: https://arxiv.org/abs/2003.10739code: https://github.com/d-li14/DHM❝ 该文是港科大李铎、陈启峰提出的一种优化模型训练、提升模型泛化性能与模型精度的方法&#xff0c;相比之前Deeply-Supervised Networks方式&#xff0c;所提方法可以进一步…

python:sys模块

目录 应用案例&#xff1a; sys.argv传参过多时&#xff0c;如何获取参数&#xff1f; sys是与解释器相关信息的模块 用法说明sys.version获取python解释器的版本信息sys.plateform获取操作系统平台名称sys.path返回模块的搜索路径&#xff0c;初始化时使用PYTHONPATH环境变…

13.1.6 如何一次在一个页面中显示大型数据集

1&#xff09;向表格中添加滚动条 <div style"overflow:auto:width100%;height:200px;"> <h:dataTable.. > <h:column...> ... </h:column> </h:dataTable> …

时间序列分析matlab_SPSS--时间序列分析

一、时间序列分析简介由于反映社会经济现象的大多数数据是按照时间顺序记录的&#xff0c;所以时间序列分析是研究社会经济现象的指标随时间变化的统计规律性的统计方法。为了研究事物在不同时间的发展状况&#xff0c;就要分析其随时间的推移的发展趋势&#xff0c;预测事物在…

13.1.7 如何产生一个弹出窗口

&#xff08;根据选择不同单选框&#xff0c;弹出窗的内容不同&#xff09; 二种方法 方法一&#xff1a;将参数传递给弹出窗口的URL window.open("popup.jsf?country" country[i].value, "popup", "height300,width…