python日志处理模块
一 日志处理模块概述
1 日志级别
#!/usr/bin/poython3.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() 结果如下
2 格式字符串1 常见格式
#!/usr/bin/poython3.6 #conding:utf-8 import threading import time FORMAT="%(asctime)-15stThread Name: %(threadName)st%(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,4),name=‘a1‘) t.start() 结果如下 2 格式化时间字串#!/usr/bin/poython3.6 #conding:utf-8 import threading import time FORMAT="%(asctime)-15stThread Name: %(threadName)st%(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,name=‘a1‘) t.start() 结果如下
#!/usr/bin/poython3.6 #conding:utf-8 import threading import time FORMAT="%(asctime)-15stThread Name: %(threadName)st%(message)s" # 此处定义日志格式 import logging logging.basicConfig(level=logging.INFO,y): logging.warning("%d",x+y) # 此处定义的日志级别是warning,因此能够被打印出来,此处是c风格处理日志 logging.info("{} 值为 {}".format(threading.enumerate(),x+y)) # 此处是format方式处理 t=threading.Thread(target=add,name=‘a1‘) t.start()
3 新变量处理
#!/usr/bin/poython3.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,此处通过定义日志格式来 # 确定打印的日志为正常格式,其和%(asctime)互相作用 d={"myname1":"zhangsan"} #此处定义变量值为zhangsan,是字典格式 def add(x,x+y,extra=d) # 此处定义的日志级别是warning,因此能够被打印出来,此处是c风格处理日志,通过此处引用extra 字典得到结果 t=threading.Thread(target=add,name=‘a1‘) t.start()
4 输出到文件#!/usr/bin/poython3.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,datefmt=‘%y-%m-%d %H:%M:%S %z‘,filename=‘/root/test.log‘) #设置日志级别为info,此处通过定义日志格式来 # 确定打印的日志为正常格式,其和%(asctime)互相作用,此处指定打印的路径,若不存在,则创建并追加,如此下面便不会再次打印 d={"myname1":"zhangsan"} #此处定义变量值为zhangsan,name=‘a1‘) t.start()
二 logger 类1 概述
2 基本实验1 打印空name的logger#!/usr/bin/poython3.6 #conding:utf-8 import logging log=logging.getLogger() print (log.name) #打印当前实例的名称,其默认名称为root print (type(log))# 打印当前实例的类型
2 打印非空name的logger#!/usr/bin/poython3.6 #conding:utf-8 import logging log=logging.getLogger(‘a‘) # 此处定义其名称, print (log.name) #打印当前实例的名称 print (log,type(log))# 打印当前实例的类型和实例情况
3 打印层次化logger#!/usr/bin/poython3.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))# 此处打印当前根父跟情况
4 继承和重用#!/usr/bin/poython3.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‘) 5 规范化定义name#!/usr/bin/poython3.6 #conding:utf-8 import logging FORMAT="%(asctime)s %(thread)d %(message)s" logging.basicConfig(level=logging.INFO,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不能打印出来
6 获取和修改日志级别
#!/usr/bin/poython3.6 #conding:utf-8 import logging FORMAT="%(asctime)s %(thread)d %(message)s" logging.basicConfig(level=logging.INFO,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()) #此处打印日志级别 结果如下
#!/usr/bin/poython3.6 #conding:utf-8 import logging FORMAT="%(asctime)s %(thread)d %(message)s" logging.basicConfig(level=logging.INFO,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()) #此处打印日志级别 结果如下 7 总结:
2 handler1 概述
2 handler 和 logger的关系#!/usr/bin/poython3.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 结果如下
#!/usr/bin/poython3.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 不针对当前设置 结果如下
#!/usr/bin/poython3.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级别
#!/usr/bin/poython3.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‘)
#!/usr/bin/poython3.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‘)
#!/usr/bin/poython3.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‘)
3 添加格式化处理#!/usr/bin/poython3.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‘)
4 handlers 和 formatterimport 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
import logging root=logging.getLogger() root.setLevel(logging.ERROR) print (‘root‘,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)
5 总结:
6 filter过滤器
import logging FORMAT="%(asctime)s %(thread)d %(message)s" logging.basicConfig(level=logging.ERROR,datefmt="%y-%m-%d %H:%M%S %z") #重新格式化传值,定义日志输出到文件 root=logging.getLogger() print (root,id(root)) loga=logging.getLogger(‘s‘) # 模块和模块下的某个函数或类 print (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‘)
import logging FORMAT="%(asctime)s %(thread)d %(message)s" logging.basicConfig(level=logging.ERROR,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‘)
import logging FORMAT="%(asctime)s %(thread)d %(message)s" logging.basicConfig(level=logging.ERROR,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.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‘)
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |