我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python的logging模块详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python的logging模块详解

日志级别

>>>import logging
>>>logging.NOTSET
0
>>>logging.DEBUG
10
>>>logging.INFO
20
>>>logging.WARN
30
>>>logging.ERROR
40
>>>logging.CRITICAL
50
>>>logging._levelNames
{0:'NOTSET', 10: 'DEBUG', 'WARN': 30, 20: 'INFO', 'ERROR': 40, 'DEBUG': 10, 30:'WARNING', 'INFO': 20, 'WARNING': 30, 40: 'ERROR', 50: 'CRITICAL', 'CRITICAL':50, 'NOTSET': 0}


从以上可以看出logging模块输出日志默认共有6个级别,级别大小依次是CRITICAL>ERROR> WARN> INFO> DEBUG> NOTSET

 

日志默认输出级别

[root@ju tmp]# cat log.py 
#!/usr/bin/envpython
importlogging
logging.debug('Thisis debug level')
logging.info('Thisis info level')
logging.warning('Thisis warning level')
logging.error('Thisis error level')
logging.critical('Thisis critical level')


输出结果如下:

[root@ju tmp]# python log.py 
WARNING:root:Thisis warning level
ERROR:root:Thisis error level
CRITICAL:root:Thisis critical level

 

从执行结果可以看出,logging模块的日志输出级别默认是warning级别。

 

自定义日志格式并输出到文件

日志的输出格式和方式可以通过logging.basicConfig函数配置。

#!/usr/bin/envpython
#coding=utf-8
importlogging
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='test.log',
    filemode='a')
'''
可见在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:
filename:          指定日志文件名
filemode:          指定日志文件的打开模式,'w'覆盖或'a'追加
format:            定义输出的格式和内容
datefmt:           指定时间格式,同time.strftime()
level:            设置rootlogger的日志级别
stream:            用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
'''
logging.debug('Thisis debug level')
logging.info('Thisis info level')
logging.warning('Thisis warning level')
logging.error('Thisis error level')
logging.critical('Thisis critical level')


[root@ju python_moudle]# python logtest.py 
 
输出结果如下:
[root@ju python_moudle]# cat test.log 
Mon, 15Jun 2015 03:48:01 logtest.py[line:10] DEBUG This is debug level
Mon, 15Jun 2015 03:48:01 logtest.py[line:11] INFO This is info level
Mon, 15Jun 2015 03:48:01 logtest.py[line:12] WARNING This is warning level
Mon, 15Jun 2015 03:48:01 logtest.py[line:13] ERROR This is error level
Mon, 15Jun 2015 03:48:01 logtest.py[line:14] CRITICAL This is critical level


自定义日志格式并输出到控制台

[root@ju python_moudle]# cat logtest.py 
#!/usr/bin/envpython
#coding=utf-8
importlogging
#定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象#
console= logging.StreamHandler()  #StreamHandler输出到控制台,FileHandler输出到文件.
console.setLevel(logging.WARN)
formatter= logging.Formatter('%(name)-8s: %(levelname)-12s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
 
logging.debug('Thisis debug level')
logging.info('Thisis info level')
logging.warning('Thisis warning level')
logging.error('Thisis error level')
logging.critical('Thisis critical level')


输出结果如下:

[root@ju python_moudle]# python logtest.py 
root    : WARNING      This is warning level
root    : ERROR         Thisis error level
root    : CRITICAL      Thisis critical level


Handlers

handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。StreamHandler可以把信息输出到控制台,FileHandler可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler。

Handler.setLevel(levelname):指定被处理的信息级别,低于levelname级别的信息将被忽略

Handler.setFormatter():给这个handler指定一个格式

Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象

 

Logging模块中有多中可用的Handler:

logging.StreamHandler                 可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息

logging.FileHandler                用于向一个文件输出日志信息

logging.handlers.RotatingFileHandler  类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出

logging.handlers.TimedRotatingFileHandler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件

logging.handlers.SocketHandler      使用TCP协议,将日志信息发送到网络。

logging.handlers.DatagramHandler    使用UDP协议,将日志信息发送到网络。

logging.handlers.SysLogHandler      日志输出到syslog

logging.handlers.NTEventLogHandler  远程输出日志到Windows NT/2000/XP的事件日志

logging.handlers.SMTPHandler       远程输出日志到邮件地址

logging.handlers.MemoryHandler     日志输出到内存中的制定buffer

logging.handlers.HTTPHandler       通过"GET"或"POST"远程输出到HTTP服务器

各个Handler的具体用法可查看参考书册:

https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers

 

 

Formatters

Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d%H:%M:%S,下面是Formatter常用的一些信息。

%(name)s                  Logger的名字

%(levelno)s:           打印日志级别的数值

%(levelname)s:        打印日志级别名称

%(pathname)s:        打印当前执行程序的路径,其实就是sys.argv[0]

%(filename)s:         打印当前执行程序名

%(module)s               调用日志输出函数的模块名

%(funcName)s:      打印日志的当前函数

%(lineno)d:           打印日志的当前行号

%(created)f                当前时间,用UNIX标准的表示时间的浮点数表示

%(relativeCreated)d    输出日志信息时的,自Logger创建以来的毫秒数

%(asctime)s:          打印日志的时间

%(thread)d:           打印线程ID

%(threadName)s:      打印线程名称

%(process)d:          打印进程ID

%(message)s:         打印日志信息

 

getLogger模块详解

logging.getLogger()时参数的格式类似于“arg1.arg2.arg3”,上代码:

[root@ju python_moudle]# cat logtest.py 
#!/usr/bin/envpython
#coding=utf-8
importlogging
#创建一个logger     
logroot= logging.getLogger()
 
log1 =logging.getLogger('L1')
log1.setLevel(logging.DEBUG)
 
log2 =logging.getLogger('L1.L2')
log2.setLevel(logging.INFO)
 
log3 = logging.getLogger('L1.L2.L3')
log3.setLevel(logging.WARNING)
#创建一个handler,用于输出到控制台
ch =logging.StreamHandler()   
#定义handler的输出格式formatter     
formatter= logging.Formatter('%(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
#给logger添加handler 
logroot.addHandler(ch)
log1.addHandler(ch)
log2.addHandler(ch)
log3.addHandler(ch)
#打印日志     
logroot.debug('logrootdebug message')   
logroot.info('logrootinfo message')   
logroot.warning('logrootwarning message')   
logroot.error('logrooterror message')   
logroot.critical('logrootcritical message')   
   
log1.debug('log1debug message')   
log1.info('log1info message')   
log1.warning('log1warning message')   
log1.error('log1error message')   
log1.critical('log1critical message')   
   
log2.debug('log2debug message')   
log2.info('log2info message')   
log2.warning('log2warning message')   
log2.error('log2error message')   
log2.critical('log2critical message')   
   
log3.debug('log3debug message')   
log3.info('log3info message')   
log3.warning('log3warning message')   
log3.error('log3error message')   
log3.critical('log3critical message')


输出结果如下:

[root@jupython_moudle]# python logtest.py 
root -WARNING - logroot warning message
root -ERROR - logroot error message
root -CRITICAL - logroot critical message
L1 -DEBUG - log1 debug message
L1 -DEBUG - log1 debug message
L1 -INFO - log1 info message
L1 -INFO - log1 info message
L1 -WARNING - log1 warning message
L1 -WARNING - log1 warning message
L1 -ERROR - log1 error message
L1 -ERROR - log1 error message
L1 -CRITICAL - log1 critical message
L1 -CRITICAL - log1 critical message
L1.L2 -INFO - log2 info message
L1.L2 -INFO - log2 info message
L1.L2 -INFO - log2 info message
L1.L2 -WARNING - log2 warning message
L1.L2 -WARNING - log2 warning message
L1.L2 -WARNING - log2 warning message
L1.L2 -ERROR - log2 error message
L1.L2 -ERROR - log2 error message
L1.L2 -ERROR - log2 error message
L1.L2 -CRITICAL - log2 critical message
L1.L2 -CRITICAL - log2 critical message
L1.L2 -CRITICAL - log2 critical message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message

 

由以上输出结果可以看出rootlog的每个输出分别打印1次,log1对应的输出分别打印了2次,log2对应的输出打印了3次,log3打印4次。logger = logging.getLogger()显示的创建了root Logger,这是因为logger实例之间的“父子关系”,rootlogger处于最顶层,log1是第二层,log2是第三层,以此类推。所以在把消息分发给它们的handler进行处理时也会传递给所有的祖先Logger处理。

 

现在把以下两行注释,再输出

logroot.addHandler(ch)   
log1.addHandler(ch)

 

输出结果如下:

[root@ju python_moudle]# python logtest.py 
Nohandlers could be found for logger "root"
L1.L2 -INFO - log2 info message
L1.L2 -WARNING - log2 warning message
L1.L2 -ERROR - log2 error message
L1.L2 -CRITICAL - log2 critical message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message

这时候可以看到log2就变成最顶层的节点,log3在handler时还是要传递给log2处理一遍,所以输出两遍。

 

使用filter设置过滤器

限制只有满足过滤规则的日志才会输出。比如我们定义了filter = logging.Filter('L1.L2.L3'),并将这个Filter添加到了一个Handler上,则使用该Handler的Logger中只有名字带a.b.c前缀的Logger才能输出其日志。看代码:

[root@jupython_moudle]# cat logtest.py 
#!/usr/bin/envpython
#coding=utf-8
importlogging
 
#创建一个logger     
logroot= logging.getLogger()   
log1 =logging.getLogger('L1')   
log1.setLevel(logging.DEBUG)   
log2 =logging.getLogger('L1.L2')   
log2.setLevel(logging.INFO)   
log3 =logging.getLogger('L1.L2.L3')   
log3.setLevel(logging.WARNING)   
#再创建一个handler,用于输出到控制台     
ch =logging.StreamHandler()   
#定义handler的输出格式formatter     
formatter= logging.Formatter('%(name)s - %(levelname)s - %(message)s')   
ch.setFormatter(formatter)
#定义filter
f =logging.Filter('L1.L2.L3')
ch.addFilter(f)
#给logger添加handler     
logroot.addHandler(ch)   
log1.addHandler(ch)   
log2.addHandler(ch)   
log3.addHandler(ch)   
#打印日志     
logroot.debug('logrootdebug message')   
logroot.info('logrootinfo message')   
logroot.warning('logrootwarning message')   
logroot.error('logrooterror message')   
logroot.critical('logrootcritical message')   
   
log1.debug('log1debug message')   
log1.info('log1info message')   
log1.warning('log1warning message')   
log1.error('log1error message')   
log1.critical('log1critical message')   
   
log2.debug('log2debug message')   
log2.info('log2info message')   
log2.warning('log2warning message')   
log2.error('log2error message')   
log2.critical('log2critical message')   
   
log3.debug('log3debug message')   
log3.info('log3info message')   
log3.warning('log3warning message')   
log3.error('log3error message')   
log3.critical('log3critical message')


输出结果如下:

[root@ju python_moudle]# python logtest.py 
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message


由输出结果可以看到,正如前面所说,只输出以L1.L2.L3开头的logger了。但是为Handler加Filter后只要使用了该Handler的Logger都会受影响。而为Logger单独添加Filter只会影响到自身。看代码:

#定义filter
f =logging.Filter('L1.L2')
#ch.addFilter(f)                   #把此行注释
#给logger添加filter和handler    
logroot.addHandler(ch)
log1.addFilter(f)                  #给log1加上filter
log1.addHandler(ch)
log2.addFilter(f)                  #给log2加上filter
log2.addHandler(ch)
log3.addHandler(ch)


输出结果如下:

[root@ju python_moudle]# python logtest.py 
root -WARNING - logroot warning message
root -ERROR - logroot error message
root -CRITICAL - logroot critical message
L1.L2 -INFO - log2 info message
L1.L2 -INFO - log2 info message
L1.L2 -INFO - log2 info message
L1.L2 -WARNING - log2 warning message
L1.L2 -WARNING - log2 warning message
L1.L2 -WARNING - log2 warning message
L1.L2 -ERROR - log2 error message
L1.L2 -ERROR - log2 error message
L1.L2 -ERROR - log2 error message
L1.L2 -CRITICAL - log2 critical message
L1.L2 -CRITICAL - log2 critical message
L1.L2 -CRITICAL - log2 critical message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- WARNING - log3 warning message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- ERROR - log3 error message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message
L1.L2.L3- CRITICAL - log3 critical message


由以上输出可以看到rootlog并未受影响,log1由于未匹配到所以没有输出,log2匹配到说以输出,log3未定义filter也可能输出。

 

通过logging.config模块配置日志

[root@jupython_moudle]# cat log.conf 
[loggers]
keys=root,TestLogger
 
[handlers]
keys=consoleHandler
 
[formatters]
keys=TestFormatter
 
[logger_root]
level=DEBUG
handlers=consoleHandler
 
[logger_TestLogger]
level=DEBUG
handlers=consoleHandler
qualname=TestLogger
propagate=0
 
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=TestFormatter
args=(sys.stdout,)
 
[formatter_TestFormatter]
format=%(asctime)-12s%(name)-12s %(levelname)-12s %(message)s
datefmt='%a,%d %b %Y %H:%M:%S'


[root@jupython_moudle]# cat logtest.py 
#!/usr/bin/envpython
#coding=utf-8
importlogging
importlogging.config
 
logging.config.fileConfig('log.conf')  #使用log.conf配置文件
 
#创建日志
LOG =logging.getLogger("TestLogger")
 
LOG.debug('Thisis debug level')
LOG.info('Thisis info level')
LOG.warning('Thisis warning level')
LOG.error('Thisis error level')
LOG.critical('Thisis critical level')


结果输出如下:

[root@ju python_moudle]# python logtest.py 
'Mon, 15Jun 2015 08:04:49' TestLogger  DEBUG        This is debug level
'Mon, 15Jun 2015 08:04:49' TestLogger   INFO         This is info level
'Mon, 15Jun 2015 08:04:49' TestLogger  WARNING      This is warning level
'Mon, 15Jun 2015 08:04:49' TestLogger  ERROR        This is error level
'Mon, 15Jun 2015 08:04:49' TestLogger  CRITICAL     This is criticallevel


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python的logging模块详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python的logging模块详解

日志级别>>>import logging>>>logging.NOTSET0>>>logging.DEBUG10>>>logging.INFO20>>>logging.WARN30>>>logging.ERROR40>>>logging.
2023-01-31

python logging日志模块的详解

python logging日志模块的详解 日志级别日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL。 DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 W
2022-06-04

Python - logging模块

logging模块两种配置日志输出格式:1、输出如下:2、第二种方式如下:注意logger = logging.getLogger() 不带参数默认是root用户。logger1 = logging.getLogger('mylog')
2023-01-31

python模块--logging

logging模块                                                                                                              
2023-01-31

Python Logging 模块完全解

Python 中的 logging 模块可以让你跟踪代码运行时的事件,当程序崩溃时可以查看日志并且发现是什么引发了错误。Log 信息有内置的层级——调试(debugging)、信息(informational)、警告(warnings)、错
2023-01-31

Python logging模块

logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。logging模块提供了两种记录日志的方式:    1)使用logging提供的模块级别的函数(logging.basicConfig,lo
2023-01-31

python logging 模块

python logging模块 import sys  import logging    #首先获得一个类  logger = logging.getLogger('example') #example为名字 logger.setLev
2023-01-31

一文详解Python中logging模块的用法

logging是Python标准库中记录常用的记录日志库,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等。本文主要来和大家聊聊它的具体用法,希望对大家有所帮助
2023-02-28

Python 日志模块logging

logging模块:logging是一个日志记录模块,可以记录我们日常的操作。logging日志文件写入默认是gbk编码格式的,所以在查看时需要使用gbk的解码方式打开。logging日志等级:CRITICAL(50) > ERROR(40
2023-01-30

Python中内置的日志模块logging用法详解

logging模块简介 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可
2022-06-04

Django日志模块logging的配置详解

前言 Django对于日志输出的信息是很完善的,request的信息,setting配置,trackback的信息,一应俱全,足够我们调试了。但是在线上环境,如果让用户看到这些信息,是很不安全的(暴露代码)。所以在线上我们要关闭Debug,
2022-06-04

python之logging模块使用

#!/usr/bin/env python# encoding: utf-8import logging#定义handler的输出格式formatter=logging.Formatter('%(asctime)s--%(name)s--%
2023-01-31

python标准库--logging模块

logging模块的几个级别,默认情况下Logging模块有6个级别,代码如下#!/usr/bin/envpython#coding:utf-8__author__=www.py3study.comimportloggingprint(lo
2023-01-30

python logging模块打印lo

可能我们经常会使用print来输出信息到窗口,但当我们有很多个py文件需要运行,项目比较庞大的到时候,print简直就是太low了点了。那么我们可以使用强大的logging模块,把输出到指定的本地pc某个路径的文件中。一、 loggi
2023-01-31

Python中logging日志模块代码调试过程详解

这篇文章主要介绍了Python中logging日志模块代码调试,今天来看看如何在代码中定义日志,并探讨日志的权限,需要的朋友可以参考下
2023-05-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录