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

python日志处理模块

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

python日志处理模块

1 日志级别

日志级别level 数值
CRITICAL 50
ERROR 40
WARNING 30 ,默认日志级别
INFO 20
DEBUG 10
NOTSET 0,表示不设置

日志级别是指产生日志的严重程度
设置一个级别后,严重程度低于次级别的日志消息将会被忽略
数字越高,优先级别越高

#!/usr/bin/python3.6
#conding:utf-8
import  threading
import time
import  logging
logging.basicConfig(level=logging.INFO)  #设置日志级别为info
def  add(x,y):
    logging.warning(x+y)  # 此处定义的日志级别是warning,因此能够被打印出来,默认的日志打印格式是 级别:用户:信息
t=threading.Timer(1,add,args=(3,4)) # 此处表示6秒后出结果
t.start()

结果如下
python日志处理模块

默认的日志打印格式是级别:用户:信息

2 格式字符串

1 常见格式

属性名 格式 描述
日志消息内容 %(message)s 当调用formatter.format() 时设置
asctime %(asctime)s 创建logrecord时的可读时间,默认格式是Y-m-d H:M:S, (逗号后面的数字是毫秒部分的时间)
函数名 %(funcName)s 日志调用所在的函数名
日志级别名称 %(levelname)s 消息级别名称,DEBUG,INFO,WARNING,ERROR,CRITICAL
日志级别数值 %(levelno)s 消息的级别数字DEBUG,INFO,WARNING,ERROR,CRITICAL
行号 %(lineno)d 日志调用所在源码行号
模块 %(module)s 模块(filename的名字部分)
进程ID %(process)d 进程ID
线程ID %(thread)d 线程ID
进程名称 %(processName)s 进程名
线程名称 %(threadName)s 线程名字

d 格式化成数字,s格式化成字符串

#!/usr/bin/python3.6
#conding:utf-8
import  threading
import time
FORMAT="%(asctime)-15s\tThread Name: %(threadName)s\t%(message)s"  # 此处定义日志格式
import  logging
logging.basicConfig(level=logging.INFO,format=FORMAT)  #设置日志级别为info,此处format为引用日志格式
def  add(x,y):
    logging.warning(x+y)  # 此处定义的日志级别是warning,因此能够被打印出来

t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()

结果如下
python日志处理模块

2 格式化时间字串

#!/usr/bin/python3.6
#conding:utf-8
import  threading
import time
FORMAT="%(asctime)-15s\tThread Name: %(threadName)s\t%(message)s"  # 此处定义日志格式
import  logging
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt='%y-%m-%d %H:%M:%S %z')  #设置日志级别为info,此处format为引用日志格式,此处通过定义日志格式来
# 确定打印的日志为正常格式,其和%(asctime)互相作用
def  add(x,y):
    logging.warning(x+y)  # 此处定义的日志级别是warning,因此能够被打印出来

t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()

结果如下
python日志处理模块

不同打印风格

#!/usr/bin/python3.6
#conding:utf-8
import  threading
import time
FORMAT="%(asctime)-15s\tThread Name: %(threadName)s\t%(message)s"  # 此处定义日志格式
import  logging
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt='%y-%m-%d %H:%M:%S %z')  #设置日志级别为info,此处format为引用日志格式,此处通过定义日志格式来
# 确定打印的日志为正常格式,其和%(asctime)互相作用
def  add(x,y):
    logging.warning("%d",x+y)  # 此处定义的日志级别是warning,因此能够被打印出来,此处是c风格处理日志
    logging.info("{} 值为 {}".format(threading.enumerate(),x+y)) # 此处是format方式处理

t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()

打印结果如下

python日志处理模块

3 新变量处理

定义一个新的变量来进行存储

#!/usr/bin/python3.6
#conding:utf-8
import  threading
import time
FORMAT="%(asctime)s \t threadName: %(threadName)s \t %(message)s \t %(myname1)s"  # 此处定义日志格式,此处定义变量名为myname
import  logging
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt='%y-%m-%d %H:%M:%S %z')  #设置日志级别为info,此处format为引用日志格式,此处通过定义日志格式来
# 确定打印的日志为正常格式,其和%(asctime)互相作用
d={"myname1":"zhangsan"}  #此处定义变量值为zhangsan,是字典格式
def  add(x,y):
    logging.warning("%d",x+y,extra=d)  # 此处定义的日志级别是warning,因此能够被打印出来,此处是c风格处理日志,通过此处引用extra 字典得到结果
t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()

结果如下

python日志处理模块

4 输出到文件

#!/usr/bin/python3.6
#conding:utf-8
import  threading
import time
FORMAT="%(asctime)s \t threadName: %(threadName)s \t %(message)s \t %(myname1)s"  # 此处定义日志格式,此处定义变量名为myname
import  logging
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt='%y-%m-%d %H:%M:%S %z',filename='/root/test.log')  #设置日志级别为info,此处format为引用日志格式,此处通过定义日志格式来
# 确定打印的日志为正常格式,其和%(asctime)互相作用,此处指定打印的路径,若不存在,则创建并追加,如此下面便不会再次打印
d={"myname1":"zhangsan"}  #此处定义变量值为zhangsan,是字典格式
def  add(x,y):
    logging.warning("%d",x+y,extra=d)  # 此处定义的日志级别是warning,因此能够被打印出来,此处是c风格处理日志,通过此处引用extra 字典得到结果
t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()

结果如下

python日志处理模块

其相当于输出重定向到文件

1 概述

使用工厂方法返回一个logger实例。
logger.getLogger([name=None)]
指定name,返回一个名称为name的Logger实例,如果再次使用相同的名字,是实例化一个对象。
未指定name,则返回logger实例,名称是root。及根Logger
Logger 是层次结构的,使用. 点号分割。如'a',或'a.b'或'a.b.c.d',a是a.b的父parent,a.b是a的子child,对于foo来说,名字为foo.bar,foo.bar.baz,foo.bam都是foo的后代。

2 基本实验

1 打印空name的logger

#!/usr/bin/python3.6
#conding:utf-8
import   logging

log=logging.getLogger()
print (log.name) #打印当前实例的名称,其默认名称为root
print (type(log))# 打印当前实例的类型

结果如下

python日志处理模块

2 打印非空name的logger

#!/usr/bin/python3.6
#conding:utf-8
import   logging

log=logging.getLogger('a')  # 此处定义其名称,
print (log.name) #打印当前实例的名称
print (log,type(log))# 打印当前实例的类型和实例情况

结果如下

python日志处理模块

3 打印层次化logger

#!/usr/bin/python3.6
#conding:utf-8
import   logging

#!/usr/bin/poython3.6
#conding:utf-8

import  logging
root=logging.getLogger()
print (root,id(root))  # 此处返回跟和跟地址

log=logging.getLogger('a')  # 此处定义其名称,
print (log.name) #打印当前实例的名称
print (log,type(log),log.parent,id(log),id(log.parent))# 打印当前实例的类型和实例情况及其父类情况,此处打印当前给情况和父根情况
#
log1=logging.getLogger('a.b')
print (log1.name)
print (log1,type(log1),log1.parent,id(log1.parent))# 此处打印当前根父跟情况

结果如下

python日志处理模块

上述表明,其a.b的父类是a,a的父类是root ,其直接存在父子级别

4 继承和重用

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,datefmt='%Y-%m-%d %H:%M:%S',format=FORMAT)
root=logging.getLogger()
root.warning('my root')

log=logging.getLogger('a')  # 此处定义其名称,
log.warning('my log')

log1=logging.getLogger('a.b')
log1.warning('my log1')

python日志处理模块

5 规范化定义name

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,datefmt='%Y-%m-%d %H:%M:%S',format=FORMAT)
root=logging.getLogger()
print (root,id(root))
root.warning('my root')
loga=logging.getLogger(__name__) # 此处使用模块名称进行定义名字
print (loga,id(loga),loga.name)
loga.warning('my loga')# loga.name 也不能在此中打印出来
logb=logging.getLogger("{}.{}".format(__name__,'abcd'))  # 此处使用模块名称下的具体方法定义名称,通过format进行字符串的拼接
print (logb,id(logb),logb.name)
logb.warning('my logb') # logb.name不能打印出来

结果如下

python日志处理模块

6 获取和修改日志级别

获取和设置相关级别

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,datefmt='%Y-%m-%d %H:%M:%S',format=FORMAT)
root=logging.getLogger()
print (root,id(root))
print (root.getEffectiveLevel())#此处打印日志级别
loga=logging.getLogger(__name__) # 此处使用模块名称进行定义名字
loga.warning('my loga')# loga.name 也不能在此中打印出来
print (loga.getEffectiveLevel())#此处打印日志级别
logb=logging.getLogger("{}.{}".format(__name__,'abcd'))  # 此处使用模块名称下的具体方法定义名称,通过format进行字符串的拼接
logb.warning('my logb') # logb.name不能打印出来
logb.debug('my debug') # 此处的debug日志将不能被打印出来
print (logb.getEffectiveLevel())  #此处打印日志级别

结果如下
python日志处理模块

修改日志级别并进行配置和获取

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,datefmt='%Y-%m-%d %H:%M:%S',format=FORMAT)
root=logging.getLogger()
print (root,id(root))
print (root.getEffectiveLevel())#此处打印日志级别
loga=logging.getLogger(__name__) # 此处使用模块名称进行定义名字
loga.info('my loga')# loga.name 也不能在此中打印出来
print (root.getEffectiveLevel())#此处打印日志级别
print (loga.getEffectiveLevel())#此处打印日志级别
loga.setLevel(28)# 此时日志级别位于INFO 和 WARNING之间,
print  (loga.getEffectiveLevel())  # 获取修改后的日志级别

print ('+'*20,'logb')
logb=logging.getLogger("{}.{}".format(__name__,'abcd'))  # 此处使用模块名称下的具体方法定义名称,通过format进行字符串的拼接
logb.info('my logb') # 此处因为自身没有配置日志级别,因此继承了上面的日志级别,因此,其不能打印
logb.setLevel(10)
logb.info('my logb') # 此处因为自身设置了日志级别,因此其可以打印
logb.warning('my debug')
print (logb.getEffectiveLevel())  #此处打印日志级别

结果如下
python日志处理模块

7 总结:

全局可以设定,但自己模块可以根据自己的情况进行调整和修改
上述用于设置模块和模块对应函数或类的日志级别,通过上述的定义可以确定打印日志的级别和相关的配置情况
向在模块级别的进行配置和修改日志的级别设置
想做个性化比较难
重要的主要是level和format 的情况

2 handler

1 概述

handler 控制日志信息的输出目的地,可以是控制台,文件
可以单独设置level
可以单独设置格式
可以设置过滤器


handler分为
1 StreamHandler # 不指定使用sys.stderr
A FileHandler # 文件输出
B _StderrHandler # 标准输出
2 NullHandler # 什么都不做

Handler父类 ,FileHandle和_StderrHandler和NullHandler是子类,子类可以继承父类的相关属性

2 handler 和 logger的关系

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)

log1=logging.getLogger('s')  #此处实例化出来一个对象
log1.setLevel(logging.WARNING) #设置此对象的相关属性

h1=logging.StreamHandler()  # 实例化一个标准输出的handler
h1.setLevel(logging.INFO)  # 设置handler的级别
log1.addFilter(h1)  # 将h1加入到log1
log1.info('info  log1')  # 打印INFO日志。
log1.warning('warning  log1')  # 打印WARING ,此处只能打印WAENING

结果如下
python日志处理模块

此处表明,虽然handler设置了info级别,但其没不能影响log1的设置,仍然不能打印info级别

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)

log1=logging.getLogger('s')  #此处实例化出来一个对象
log1.setLevel(logging.INFO) #设置此对象的相关属性

h1=logging.StreamHandler()  # 实例化一个标准输出的handler
h1.setLevel(logging.ERROR)  # 设置handler的级别
log1.addFilter(h1)  # 将h1加入到log1
log1.warning('warning  log1')  # 打印WARING ,此处只能打印WAENING
log1.info('info log1')

log2=logging.getLogger('s.s1')  #此处继承了s1的属性
print (log2.getEffectiveLevel())
log2.warning('wangring  log2') #此处设置的warning 和handler中设置的ERROR不冲突,因为ERROR 不针对当前设置

结果如下

python日志处理模块

此处虽然handler设置了ERROR 级别,但info级别还是能够打印出来,其不会影响当前级别的日志,而继承的日志也没受到handler的影响直接打印

日志输出到文件

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)

log1=logging.getLogger('s')  #此处实例化出来一个对象
log1.setLevel(logging.INFO) #设置此对象的相关属性

h1=logging.FileHandler('/root/test1.log')  # 实例化一个文件输出的handler
h1.setLevel(logging.ERROR)  # 设置handler的级别
log1.addHandler(h1)  # 将h1加入到log1
log1.warning('warning  log1')  # 打印WARING ,此处只能打印WAENING
log1.info('info log1')
log1.error('error  log1')  #打印error级别

结果如下

python日志处理模块

文件中结果如下

python日志处理模块

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)

log1=logging.getLogger('s')  #此处实例化出来一个对象
log1.setLevel(logging.WARNING) #设置此对象的相关属性

h1=logging.FileHandler('/root/test1.log')  # 实例化一个文件输出的handler
h1.setLevel(logging.INFO)  # 设置handler的级别
log1.addHandler(h1)  # 将h1加入到log1
log1.warning('warning  log1')  # 打印WARING ,此处只能打印WAENING
log1.info('info log1')

结果如下

python日志处理模块

文件结果

python日志处理模块

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)

log1=logging.getLogger('s')  #此处实例化出来一个对象
log1.setLevel(logging.WARNING) #设置此对象的相关属性

h1=logging.FileHandler('/root/test1.log')  # 实例化一个文件输出的handler
h1.setLevel(logging.INFO)  # 设置handler的级别
log1.addHandler(h1)  # 将h1加入到log1
log1.warning('warning  log1')  # 打印WARING ,此处只能打印WAENING
log1.info('info log1')

log2=logging.getLogger('s.s1')
print (log2.getEffectiveLevel())
log2.info('log2 info')

python日志处理模块

文件结果

python日志处理模块

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)

log1=logging.getLogger('s')  #此处实例化出来一个对象
log1.setLevel(logging.INFO) #设置此对象的相关属性

h1=logging.FileHandler('/root/test1.log')  # 实例化一个文件输出的handler
h1.setLevel(logging.INFO)  # 设置handler的级别
log1.addHandler(h1)  # 将h1加入到log1
log1.warning('warning  log1')  # 打印WARING ,此处只能打印WAENING
log1.info('info log1')

log2=logging.getLogger('s.s1')
print (log2.getEffectiveLevel())
log2.info('log2 info')

结果

python日志处理模块

文件结果

python日志处理模块

3 添加格式化处理

#!/usr/bin/python3.6
#conding:utf-8
import  logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)

log1=logging.getLogger('s')  #此处实例化出来一个对象
log1.setLevel(logging.INFO) #设置此对象的相关属性

h1=logging.FileHandler('/root/test1.log')  # 实例化一个文件输出的handler
h1.setLevel(logging.INFO)  # 设置handler的级别
fmtr=logging.Formatter("%(asctime)s Threadinfo: %(threadName)s %(message)s  %(thread)s")
h1.setFormatter(fmtr)
log1.addHandler(h1)  # 将h1加入到log1
log1.warning('warning  log1')  # 打印WARING ,此处只能打印WAENING
log1.info('info log1')

log2=logging.getLogger('s.s1')
print (log2.getEffectiveLevel())
log2.info('log2 info')

结果如下

python日志处理模块

文件结果如下

python日志处理模块

4 handlers 和 formatter

import logging

root=logging.getLogger()
root.setLevel(logging.ERROR)
print ('root',root.handlers)  #打印handler列表

h0=logging.StreamHandler()
h0.setLevel(logging.WARNING)
root.addHandler(h0)
print ('root',root.handlers)  # 打印列表

for h  in root.handlers:
    print ("root  handler = {} ,formatter= {}".format(h,h.formatter))  # 打印默认的formatter

结果如下

python日志处理模块

import logging

root=logging.getLogger()
root.setLevel(logging.ERROR)
print ('root',root.handlers)  #打印handler列表

h0=logging.StreamHandler()
h0.setLevel(logging.WARNING)
root.addHandler(h0)
print ('root',root.handlers)  # 打印列表

for h  in root.handlers:
    print ("root  handler = {} ,formatter= {}".format(h,h.formatter))  # 打印默认的formatter

log1=logging.getLogger('s')
log1.setLevel(logging.ERROR)
h1=logging.FileHandler('/root/test2.log')
log1.addHandler(h1)
print ('log1',log1.handlers)

log2=logging.getLogger('s.s1')
log2.setLevel(logging.CRITICAL)
h2=logging.FileHandler('/root/test2.log')
h2.setLevel(logging.WARNING)
print ('log2 formatter',h2.formatter)
# handler 默认无Formatter
f2=logging.Formatter("log2 %(name)s %(asctime)s %(message)s")
h2.setFormatter(f2)
print ('log2.formatter',h2.formatter)
log2.addHandler(h2)
print ('log2',log2.handlers)

结果为

python日志处理模块

文件结果为

python日志处理模块

5 总结:

1 每一个logger实例的level如同入水口,让水流进来,如果这个门槛太高,水流就不能进来,其相关低级别的信息一定不能被打印出来


2 如果level没有设置,则使用父类logger的,如果父类没有,则继续寻找父类的,最终找到root,而root的默认设置是WARNING


3 消息传递流程

在某个logger上产生某种级别的消息,首先和logger的level检查,如果消息level低于logger的EffectiveLevel有效级别,则丢弃消息,如果通过(大于等于)检查后,消息交给所有的handler处理,每一个handler需要和自己的level比较来决定是否处理,如果没有一个handler,或者消息已经被处handler处理过了,则需要通过本logger的propagate属性是否是True,True则会把这个消息继续传递给父logger,父logger成为新的logger。新的logger直接把消息交给新的logger的所有handler,handler都处理完了,如果paragate属性是True,新的logger的父成为新的logger,它的所有handler处理消息。


4 logger 实例初始化的paragate属性为True,及允许向父传递logger消息


5 logging.basicConfig


如果root没有handler,就默认创建一个StreamHandler ,如果设置了filename,则就创建了一个FileHandler,如果设置了format参数,它就会生成一个formatter对象,并把这个formatter加入到刚才创建的handler上,然后把这些handler加入到root.handlers列表上,level是设置给root logger的。如果root.handlers列表不是空,则logging.basicConfig的调用什么都不做。

6 filter过滤器

可以为handler增加过滤器,所以过滤器只影响某一个handler,不会影响整个处理流程


import logging
FORMAT="%(asctime)s %(thread)d  %(message)s"
logging.basicConfig(level=logging.ERROR,format=FORMAT,datefmt="%y-%m-%d %H:%M%S %z")  #重新格式化传值,定义日志输出到文件

root=logging.getLogger()
print (root,id(root))

loga=logging.getLogger('s') # 模块和模块下的某个函数或类
print (loga,id(loga),id(loga.parent))
loga.setLevel(logging.INFO)
print (loga.getEffectiveLevel()) #默认对应的是常量20

hadr=logging.FileHandler('/root/loga.txt')  # 定义,不指定则是标准错误输出
hadr.setLevel(logging.INFO)
fmtr=logging.Formatter("%(asctime)s %(thread)d  %(threadName)s   %(message)s")  #此处是一个实例。此处可以自己定义
hadr.setFormatter(fmtr)
fltr=logging.Filter('s') # 此处设置过滤器为s,则为s,s.s1均可通过
hadr.addFilter(fltr)
loga.addHandler(hadr)

logb=logging.getLogger('s.s1')
logb.getEffectiveLevel()
logb.info('logb info')

结果如下

python日志处理模块

文件结果如下

python日志处理模块


import logging
FORMAT="%(asctime)s %(thread)d  %(message)s"
logging.basicConfig(level=logging.ERROR,format=FORMAT,datefmt="%y-%m-%d %H:%M%S %z")  #重新格式化传值,定义日志输出到文件

root=logging.getLogger()
print (root,id(root))

loga=logging.getLogger('s') # 模块和模块下的某个函数或类
print (loga,id(loga),id(loga.parent))
loga.setLevel(logging.INFO)
print (loga.getEffectiveLevel()) #默认对应的是常量20

hadr=logging.FileHandler('/root/loga.txt')  # 定义,不指定则是标准错误输出
hadr.setLevel(logging.INFO)
fmtr=logging.Formatter("%(asctime)s %(thread)d  %(threadName)s   %(message)s")  #此处是一个实例。此处可以自己定义
hadr.setFormatter(fmtr)
fltr=logging.Filter('s') # 此处设置过滤器为s,则为s,s.s1均可通过
hadr.addFilter(fltr)
loga.addHandler(hadr)
loga.info('loga info')

logb=logging.getLogger('s.s1')
logb.getEffectiveLevel()
logb.info('logb info')

logc=logging.getLogger('s.s1')
logc.getEffectiveLevel()
logc.info('logc info')

结果如下

python日志处理模块

文件如下

python日志处理模块


import logging
FORMAT="%(asctime)s %(thread)d  %(message)s"
logging.basicConfig(level=logging.ERROR,format=FORMAT,datefmt="%y-%m-%d %H:%M%S %z")  #重新格式化传值,定义日志输出到文件

root=logging.getLogger()
print (root,id(root))

loga=logging.getLogger('s') # 模块和模块下的某个函数或类
print (loga,id(loga),id(loga.parent))
loga.setLevel(logging.INFO)
print (loga.getEffectiveLevel()) #默认对应的是常量20

hadr=logging.FileHandler('/root/loga.txt')  # 定义,不指定则是标准错误输出
hadr.setLevel(logging.INFO)
fmtr=logging.Formatter("%(asctime)s %(thread)d  %(threadName)s   %(message)s")  #此处是一个实例。此处可以自己定义
hadr.setFormatter(fmtr)
fltr=logging.Filter('a') # 此处设置过滤器为s,则为s,s.s1均可通过
hadr.addFilter(fltr)
loga.addHandler(hadr)
loga.info('loga info')

logb=logging.getLogger('s.s1')
logb.getEffectiveLevel()
logb.info('logb info')

logc=logging.getLogger('s.s1')
logc.getEffectiveLevel()
logc.info('logc info')

文件如下

python日志处理模块

消息loga,它的名字是's',因此过滤器名字设置为s,则s.s1,s.x和s都能通过,但其他的则不能通过,不设置过滤器名字,所有消息都能通过,设置为a,则和s,s.s1和s.s2无任何关系,因此其不能使用,实例对象只有一个,一旦同名,也是只有一个,线程的不安全不会影响logging,只会影响print。

免责声明:

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

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

python日志处理模块

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

下载Word文档

猜你喜欢

python日志处理模块

1 日志级别日志级别level数值CRITICAL50ERROR40WARNING30 ,默认日志级别INFO20DEBUG10NOTSET0,表示不设置日志级别是指产生日志的严重程度设置一个级别后,严重程度低于次级别的日志消息将会被忽略数
2023-01-31

Node.js 日志处理模块log4js

log4js 是 Node.js 日志处理中的数一数二的模块。比起 console 或者 TJ 的 debug 有其优势,尤其针对投入生产的 Node.js 项目来说下面这些是不可少的:日志分级日志分类日志落盘本文将会给你一个 log4js
2022-06-04

Python 日志模块logging

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

python 日志模块工具类

#!/usr/bin/env python# -*- coding: utf-8 -*-import logging# logName 日志中的某个格式化的字段名,logFile生成的日志文件名def getlogger(logName,
2023-01-30

python 日志模块logging学习

在日常项目中,总是需要记录下一些细小信息或者错误码、错误信息的,这个时候就需要进行日志的操作。python中用于日志创建、设置和记录等功能的模块,就是logging了,下面是对其基本使用方法的介绍:一、最最简单的使用方法:import lo
2023-01-31

Python3 日志模块

Python3 日志模块python3 日志模块官网说明python中日志等级从高到低依次为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET 默认的日志等级为:WARNING,即在显示日
2023-01-31

loggin(日志模块)

这是一个提供日志功能的模块,它可以让你更敏捷的为你程序提供日志功能 一、常用日志记录场景及最佳解决方案:日志记录方式 最佳记录日志方案普通情况下,在控制台显示输出 print()报告正
2023-01-30

python logging日志模块的详解

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

python logging日志模块怎么用

这篇文章主要讲解了“python logging日志模块怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python logging日志模块怎么用”吧!1.日志简介说到日志,无论是写框架
2023-06-29

java底层JDK Logging日志模块怎么处理

这篇文章主要介绍“java底层JDK Logging日志模块怎么处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java底层JDK Logging日志模块怎么处理”文章能帮助大家解决问题。从例子开
2023-06-29

python之强大的日志模块

作者:txw1958 | 出处:博客园 | 2011/10/21 19:41:55 | 阅读43次1.简单的将日志打印到屏幕 import logginglogging.debug('This is debug message')loggi
2023-01-31

Python中日志模块是什么

这篇文章主要介绍了Python中日志模块是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。日志的作用说到日志,我们完全可以想象为现实生活中的日记。日记是我们平时记录我们生活
2023-06-29

Python日志管理模块Loguru的用法小结

这篇文章主要介绍了Python日志管理模块Loguru的用法小结,本篇文章只记录loguru模块的使用,包括简单的用法,以及在多模块和多线程下的使用,需要的朋友可以参考下
2023-02-15

python的logging日志模块是什么

这篇文章给大家介绍python的logging日志模块是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.简单的将日志打印到屏幕import logginglogging.debug(This is debug m
2023-06-04

Python日志模块logging如何使用

这篇文章主要讲解了“Python日志模块logging如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python日志模块logging如何使用”吧!关于开发日志对于开发日志,很多程序
2023-06-30

Python日志模块logging怎么使用

这篇“Python日志模块logging怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python日志模块loggi
2023-06-30

编程热搜

  • 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动态编译

目录