logger类

日志模块logging的四大组件:

logger: 志类应用程序往往通调用提供api记录志
handler: 志信息处理志发送(保存)同目标域
filter: 志信息进行滤
formatter:志格式化

Logger类:
构造
使用工厂方法返回一个Logger实例。
logging.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的后代。
举例:

import logging
DATEFMT ="[%Y-%m-%d %H:%M:%S]"
FORMAT = "%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt=DATEFMT,filename='class_test.log')

root = logging.getLogger()
print(root.name,type(root),root.parent,id(root))

logger = logging.getLogger(__name__)
print(logger.name, type(logger), id(logger), id((logger.parent)))

logger1 = logging.getLogger(__name__ + ".ok")
print(logger1.name, type(logger1), id(logger1), id((logger1.parent)))

print(logger1.parent,id(logger1.parent))

运行结果:
root <class 'logging.RootLogger'> None 4367575248
__main__ <class 'logging.Logger'> 4367575864 4367575248
__main__.ok <class 'logging.Logger'> 4367575920 4367575864
<logging.Logger object at 0x10453eb38> 4367575864

  

子child的级别设置,不影响父parent的级别:

import logging

FORMAT = "%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.WARNING,format=FORMAT,datefmt="[%Y-%m-%d %H:%M:%S]")

root = logging.getLogger()
print(1,root,id(root)) #RootLogger,根Logger
root.info('my root') #低于定义的WARNING级别,所以不会记录

loga = logging.getLogger(__name__) #Logger继承自RootLogger
print(2,loga,id(loga),id(loga.parent))
print(3,loga.getEffectiveLevel()) #数值形式的有效级别

loga.warning('before')
loga.setLevel(28) #设置级别为28
print(4,loga.getEffectiveLevel())
loga.info('after')#
loga.warning('after1')

运行结果:
[2017-12-17 16:31:20] 4320629568 before
1 <logging.RootLogger object at 0x104534f28> 4367535912
2 <logging.Logger object at 0x1044ef630> 4367250992 4367535912
3 30
4 28
[2017-12-17 16:31:20] 4320629568 after1

  


Handler:

Handler控制日志信息的输出目的地,可以是控制台、文件。

可以单独设置level

可以单独设置格式

可以设置过滤器

 

Handler

  StreamHandler #不指定使用sys.strerr

    FileHandler #文件

    _StderrHandler #标准输出

  NullHandler #什么都不做

 

level的继承:

import logging

FORMAT = "%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt="[%Y-%m-%d %H:%M:%S]")

root = logging.getLogger() #根Logger级别为INFO 20
print('root:',root.getEffectiveLevel())

log1 = logging.getLogger('s')
log1.setLevel(logging.ERROR) #级别为ERROR 40
print('log1:',log1.getEffectiveLevel())
log1.error('log1 error')

log2 = logging.getLogger('s.s1') #继承自log1 40,无法使用warning
log2.setLevel(logging.WARNING) #设置为WARNING 30,才可以使用warning
print('log2:',log2.getEffectiveLevel())
log2.warning('log2 warning')

运行结果:
[2017-12-17 16:52:22] 4320629568 log1 error
root: 20
log1: 40
[2017-12-17 16:52:22] 4320629568 log2 warning
log2: 30

  


logger实例,如果设置了level,就用它和信息的级别比较,否则,继承最近的祖先的level。

handler处理:

import logging

FORMAT = "%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt="[%Y-%m-%d %H:%M:%S]")

root = logging.getLogger()
print(1,root.getEffectiveLevel()) #RootLogger,根Logger

log1 = logging.getLogger('s')
print(2,log1.getEffectiveLevel())

h1 = logging.FileHandler('test.log')
h1.setLevel(logging.WARNING)
log1.addHandler(h1)
print(3,log1.getEffectiveLevel())

log2 = logging.getLogger('s.s2')
print(4,log2.getEffectiveLevel())

h2 = logging.FileHandler('test1.log')
h2.setLevel(logging.WARNING)
log1.addHandler(h2)
print(3,log1.getEffectiveLevel())


log2.warning('log2 info---')


运行结果:
1 20
[2017-12-17 19:02:53] 7956 log2 info---
2 20
3 20
4 20
3 20

  


test.log和test1.log最终都会记录一份"log2 info---"
同样,handler也可以设置使用logging.Formatter()设置格式和Logging.Filter()设置过滤器:

import logging

FORMAT = "%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt="[%Y-%m-%d %H:%M:%S]")

root = logging.getLogger()
print(1,root.getEffectiveLevel()) #RootLogger,根Logger

log1 = logging.getLogger('s')#模块化用__module__,函数化用__name__作为Logger名,Logger同名内存中也只有一个
print(2,log1.getEffectiveLevel())

h1 = logging.FileHandler('test.log')
h1.setLevel(logging.WARNING)
fmt1 = logging.Formatter('[%(asctime)s] %(thread)s %(threadName)s log1-handler1 %(message)s')
h1.setFormatter(fmt1) #重新个性化定义记录的格式化字符串
log1.addHandler(h1)
filter1 = logging.Filter('s') #过滤器 会记录s, s.s2的信息
log1.addFilter(filter1)
print(3,log1.getEffectiveLevel())

log2 = logging.getLogger('s.s2')
print(4,log2.getEffectiveLevel())

h2 = logging.FileHandler('test1.log')
h2.setLevel(logging.WARNING)
log1.addHandler(h2)
filter1 = logging.Filter('s.s2') #过滤器不会记录s.s2的消息,只会记录自己的消息
log1.addFilter(filter1)
print(3,log1.getEffectiveLevel())

log1.warning('log1 warning===')
log2.warning('log2 warning---')

运行结果:
test.log: #handler1记录了到了log1和log2的信息
[2017-12-17 19:43:12,654] 5872 MainThread log1-handler1 log1 warning===
[2017-12-17 19:43:12,654] 5872 MainThread log1-handler1 log2 warning---

  




test1.log: #handler2只记录了它自己的信息
log2 warning---

参考:https://www.cnblogs.com/i-honey/p/8052579.html

转载于:https://www.cnblogs.com/andy9468/p/8378638.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,常用的logger的方法包括: 1. getLogger(String name):获取一个logger对象,参数name指定了logger的名称,通常使用的全限定名称作为名称。 2. setLevel(Level level):设置logger的日志级别,级别分为OFF、SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST、ALL。 3. log(Level level, String msg):输出指定级别的日志信息,msg参数是要输出的日志信息。 4. log(Level level, String msg, Throwable t):输出指定级别的日志信息,并输出异常信息。 5. logp(Level level, String sourceClass, String sourceMethod, String msg):输出指定级别的日志信息,指定日志信息来源的名和方法名。 6. logp(Level level, String sourceClass, String sourceMethod, String msg, Object[] params):输出指定级别的日志信息,并输出方法的参数信息。 7. logp(Level level, String sourceClass, String sourceMethod, String msg, Throwable t):输出指定级别的日志信息,并输出异常信息和方法的调用信息。 8. entering(String sourceClass, String sourceMethod):输出方法的开始信息。 9. entering(String sourceClass, String sourceMethod, Object[] params):输出方法的开始信息,并输出方法的参数信息。 10. exiting(String sourceClass, String sourceMethod):输出方法的结束信息。 11. exiting(String sourceClass, String sourceMethod, Object result):输出方法的结束信息,并输出方法的返回值信息。 以上是logger的一些常用方法,可以根据需要选择使用。在开发过程中,建议根据不同的业务场景和需求,灵活使用logger的各种方法,便于排查问题和调试程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值