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
logger类的更多相关文章
- 关于Java Logger类的使用问题 - 内存不释放
原文地址:http://www.ihuxu.com/p/236.html 说明:这是一个利用Java Logger类的示例,完成简单的日志记录功能.代码中有部分类库没有说明,但不影响阅读. 本人技 ...
- [Python 模块] logging模块、Logger类
logging模块: 标准库里面的logging模块,在前面学习线程安全时曾用来解决print被打断的问题,这里会介绍logging模块的功能. logging模块是线程安全的,不需要客户做任何特殊的 ...
- Java程序日志:java.util.logging.Logger类
一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...
- java Logger 类
package org.rx.common; import org.slf4j.LoggerFactory; import java.util.Collections; import java.uti ...
- 爆料喽!!!开源日志库Logger的剖析分析
导读 Logger类提供了多种方法来处理日志活动.上一篇介绍了开源日志库Logger的使用,今天我主要来分析Logger实现的原理. 库的整体架构图 详细剖析 我们从使用的角度来对Logger库抽茧剥 ...
- java.util.logging.Logger 使用详解
概述: 第1部分 创建Logger对象 第2部分 日志级别 第3部分 Handler 第4部分 Formatter 第5部分 自定义 第6部分 Logger的层次关系 参考 第1部分 创建Logger ...
- Log4j使用教程 log4:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
1.Logger类 通过Logger类的静态方法Logger.getRootLogger得到RootLogger.所有其他的loggers是通过静态方法Logger.getLogger来实例化并获取的 ...
- Log4j源码解析--核心类解析
原文出处:http://www.blogjava.net/DLevin/archive/2012/06/28/381667.html.感谢上善若水的无私分享. 在简单的介绍了Log4J各个模块类的作用 ...
- Logger之简单入门
Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...
随机推荐
- 拼凑sql语句另外一个方法
经常拼凑sql语句,经常是手工拼写 也可以利用字典另外一个模式拼凑 这里采用的是Dictionary中的Aggregate方法. 代码如下: static void Main(string[] arg ...
- TFS 强制删除锁定文件(数据库)
TFS:TFS2010 VS:VS2012 OS:Windows2008 DB:Sqlserver2008 R2 我们在团队开发当中,版本控制是一个不可忽略的工具.我们团队使用的是TFS2010这个版 ...
- JavaScript------去掉Array中重复值
转载: http://blog.csdn.net/teresa502/article/details/7926796 代码: // 删除数组中重复数据 function removeDuplElem( ...
- swift学习笔记之—自定义函数的规则说明
原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/detail_517.html 1,无返回值的函数 func test( ...
- Access数据操作-01
1.未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 在菜单 “项目”的最下面 工程属性 菜单,选择“生成”选项卡,将目标平台由“Amy CPU”或者“*64”改成“* ...
- java中被遗忘的native关键字
我是无意间看见JNI( java调用动态链接库dll )这块的东西. 所有记下来:本地声明方法 装载完成dll文件后,将使用的方法用native关键字声明. public native static ...
- Nginx(二)-- 配置文件之虚拟主机配置
1.配置文件与解释 #user nobody; worker_processes 1; # 设置工作子进程,默认是1个工作子进程,可以修改,一般设置为CPU的总核数 #error_log logs/e ...
- VS2015编译GDAL2.2.1源码
下载完GDAL2.2.1,你会发现这货没有CMakeLists.txt,对于我这样的只会用CMake GUI的货来说,着实很难过. 需要用VS带的nmake来生成.sln 管理员身份启动VS2015命 ...
- U3D关于message的使用
Message相关有3条指令: SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的Script BroadcastM ...
- linux系统socket通信编程1
Linux下的Socket编程大体上包括Tcp Socket.Udp Socket即Raw Socket这三种,其中TCP和UDP方式的Socket编程用于编写应用层的socket程序,是我们用得比较 ...