日志管理logging的使用

程序开发过程中,很多程序都有记录日志的需求,并且日志包含的信息有正常的程序访问日志,还可能有错误、警告等信息输出,Python 的 logging 模块提供了标准的日志接口,可以通过它存储各种格式的日志,日志记录提供了一组便利功能,用于简单的日志记录用法。
下面介绍一下logging的简单用法,能够满足日常的使用。

日志模块解析

logging.basicConfig()
用默认日志格式(Formatter)为日志系统建立一个默认的流处理器(StreamHandler),设置基础配置(如日志级别等)并加到root logger(根Logger)中;
logging.getLogger()
返回一个logger对象,如果没有指定名字将返回root logger;
另外,创建的logger都是root logger的“孩子”;这里mylogger属于root logger的子孙,继承root logger的属性(日志级别、Handler、Filter设置),除非设置了mylogger的属性。
可以通过Logger.setLevel(lel)、Logger.addHandler(hdlr)、Logger.removeHandler(hdlr)、Logger.addFilter(filt)、Logger.removeFilter(filt) 来设置mylogger的日志级别、Handler、Filter。
logging组件

  • Logger: 记录器,暴露了应用程序代码能直接使用的接口。
  • Handler: 处理器,将(记录器产生的)日志记录发送至合适的目的地。
  • Filter: 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
  • Formatter: 格式化器,指明了最终输出中日志记录的格式。

1. 日志等级

日志记录函数以它们用来跟踪的事件的级别或严重性命名。
下面描述了标准级别及其适用性(从高到低的顺序):
logger

日志级别等级排序:critical > error > warning > info > debug

  • debug : 详细信息,一般只在调试问题时使用,打印全部的日志( notset 等同于 debug )。
  • info : 证明事情按预期工作,打印 info, warning, error, critical 级别的日志。
  • warning : 某些没有预料到警告信息,或者在将来可能会出现的问题提示。例如:磁盘空间不足,但是软件还是会照常运作,打印 warning, error, critical 级别的日志。
  • error : 由于更严重的问题,软件已不能执行一些功能了,打印 error, critical 级别的日志。
  • critical : 严重错误,表明软件已不能继续运行了,打印 critical 级别。

默认等级是WARNING,默认输出到控制台。
级别越高打印的日志越少,反之亦然。

2. 日志级别设置

logging.getLogger()
模块级别的函数logging.getLogger(‘name’),返回一个logger对象,如果没有指定名字将返回root logger;
Logger是一个树形层级结构,输出信息之前都要获得一个Logger(如果没有显示的获取则自动创建并使用root Logger)。可以通过Logger.setLevel(level)或logging.basicConfig()指定最低的日志级别。

import logging
logger = logging.getLogger()  #获得logger对象
logger.setLevel(logging.INFO)  #设置日志级别

3. 日志处理器

Handler处理器类型有很多种,比较常用的有三个,StreamHandler,FileHandler,NullHandler。
创建handler:
logging.FileHandler('/tmp/test.log',mode='a', encoding=None, delay=False):文件处理器
logging.StreamHandler() :控制台处理器
NullHandler类位于核心logging包,不做任何的格式化或者输出。本质上它是个“什么都不做”的handler,由库开发者使用。
创建StreamHandler之后,可以通过使用以下方法设置日志级别,设置格式化器Formatter,增加或删除过滤器Filter:

  • ch.setLevel(logging.WARN)       # 指定日志级别,低于WARN级别的日志将被忽略
  • ch.setFormatter(formatter_name)    # 设置一个格式化器formatter
  • ch.addFilter(filter_name)        # 增加一个过滤器,可以增加多个
  • ch.removeFilter(filter_name)      # 删除一个过滤器

4. formatter

使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。
创建方法:
  formatter = logging.Formatter(fmt=None, datefmt=None)
其中,fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用’%(message)s’。如果不指明datefmt,将使用ISO8601日期格式。

5. Filter

日志过滤,只有满足过滤规则的日志才会输出。
创建方法:
filter = logging.Filter(name='')
例如:
filter = logging.Filter(‘mylogger’) # 使用该filter的handler将只记录mylogger开头的日志;
fh.addFilter(filter)
ch.addFilter(filter)

6. logging.basicConfig()

配置日志基本配置;参数可以是如下:

  • filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。

  • filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”,一般默认。

  • format:指定handler使用的日志显示格式。

  • datefmt:指定日期时间格式。

  • level:设置rootlogger(后边会讲解具体概念)的日志级别;默认是warnning

  • stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,‘w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

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

6. 日志记录模板

模板1

import logging
logger = logging.getLogger()  #创建logger对象
logger.setLevel(logging.INFO)   #设置日志权限
log_file = '/temp/test/log.txt'  #日志文件路径
fh = logging.FileHandler(log_file)  #生成文件处理器对象
sh = logging.StreamHandler()    #生成控制台处理器对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')   #设置日志模式
fh.setFormatter(formatter)  #添加模式
ch.setFormatter(formatter)  #添加模式
logger.addHandler(fh)   #添加文件处理器
logger.addHandler(sh)   #添加控制台处理器
logger.info('输出日志记录')
#同时在控制台和文件输出

模板2

import loggering
#通过basicConfig设置权限,格式,日志存储路径
logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                    datefmt='%a, %d %b %Y %H:%M:%S',  
                    filename='/tmp/test/log.txt',  
                    filemode='w')
#打印日志,输出为文件 
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')

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

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340