上一篇文章: Python模块分析:第3节-typing模块
若是不设置,默认为iwarning
查看logging的源码,可知主要有四个类实现功能:json
Formatters对象定义了日志的输出格式,有多种可选参数。segmentfault
参数 | 含义 |
---|---|
%(name)s | Logger的名字 |
%(levellno)s | 数字形式的日志级别 |
%(levelname)s | 文本形式的日志级别 |
%(pathname)s | 调用日志输出函数的模块的完整路径名,可能没有 |
%(filename)s | 调用日志输出函数的模块的文件名 |
%(module)s | 调用日志输出函数的模块名 |
%(funcName)s | 调用日志输出函数的函数名 |
%(lineno)d | 调用日志输出函数的语句所在的代码行 |
%(created)f | 当前时间,用unix标表示的时间浮点表示 |
%(relativeCreated)d | 输出日志信息时,自Logger建立以来的毫秒数 |
%(asctime)s | 字符串形式的当前时间,默认格式是‘2018-11-22 16:49:45,896’,逗号后面是毫秒 |
%(thread)d | 线程ID,可能没有 |
%(threadName)s | 线程名,可能没有 |
%(process)d | 进程ID,可能没有 |
%(message)s | 用户输出的信息 |
实例:服务器
import logging #fmt:定义输出的日志信息的格式 #datefmt:定义时间信息的格式,默认为:%Y-%m-%d %H:%M:%S #style:定义格式化输出的占位符,默认是%(name)格式,可选{}或$格式 formatter=logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s' ,datefmt='%Y-%m-%d %H:%M:%S',style='%')
日志处理器用来处理日志的具体流向,是输出到文件中仍是标准输出等,它经过设置Formatter控制输出格式,添加filters过滤日志。app
名称 | 详细位置 | 说明 |
---|---|---|
RotatingHandler | logging.handlers.RotatingHandler | 日志回滚方式,支持日志文件最大数量和日志文件回滚 |
TimeRotatingHandler | logging.handlers.TimeRotatingHandler | 日志回滚方式,在必定时间区域内回滚日志文件 |
SocketHandler | logging.handlers.SocketHandler | 远程输出日志到TCP/IP sockets |
DatagramHandler | logging.handlers.DatagramHandler | 远程输出日志到UDP sockets |
SMTPHandler | logging.handlers.SMTPHandler | 远程输出日志到邮件地址 |
SysLogHandler | logging.handlers.SysLogHandler | 日志输出到syslog |
NTEventLogHandler | logging.handlers.NTEventLogHandler | 远程输出日志到Windows NT/2000/xp的事件日志 |
MemoryHandler | logging.handlers.MemoryHandler | 日志输出到内存中的指定buffer |
HTTPHandler | logging.handlers.HTTPHandler | 经过“GET”或者“POST”远程输出到HTTP服务器 |
from logging import Handler #全部日志处理器的父类 handler=Handler() print('处理日志的等级:',handler.level) print('处理日志的名字:',handler.name) print('处理器的日志过滤器::',handler.filters) print('日志的格式::',handler.filters) #一些经常使用方法: handler.get_name() handler.set_name('') handler.createLock()#建立线程锁 handler.acquire()#获取线程锁 handler.release()#释放线程锁 handler.setLevel('info') #设置日志处理器的记录级别 handler.setFormatter(fmt='')#设置日志的输出格式 handler.addFilter('')#往处理器中添加过滤器 handler.removeFilter('')#往处理器中移除过滤器 handler.emit('')#日志记录的处理逻辑,由子类实现
Logger管理着全部记录日志的方法。socket
from logging import error, debug, warning, info, fatal, critical, getLogger #返回一个Logger实例 #以'root'为名字的日志对象在Logger对象中只有一个实例 logger=getLogger('root') print('获取根日志对象',logger.root) print('获取manager',logger.manager) print('获取根日志对象的名字',logger.name) print('获取根日志对象记录水平',logger.level) print('获取根日志对象过滤器列表',logger.filters) print('获取根日志对象处理器列表',logger.handlers) print('获取根日志对象',logger.disabled) #设置日志记录水平 logger.setLevel('info') #输出日志信息,格式化输出 logger.info('this is %s','info',exc_info=1) #记录warning信息 logger.warning('') #记录error信息 logger.error('') #等价于logger.error('',exc_info=1) logger.exception('') #记录debug信息 logger.debug('') #记录critical信息 logger.critical('') #直接指定级别 logger.log('info','') #添加处理器 logger.addHandler() #移除处理器 logger.removeHandler() #判是否有处理器 logger.hasHandlers()
实例:函数
import logging import sys def my_get_logger(appname): #获取logger实例,若是参数为空则返回root logger logger=logging.getLogger(appname) #建立日志输出格式 formatter=logging.Formatter('%(asctime)s %(levelname)s %(mark)s: %(message)s') #指定输出的文件路径 file_handler=logging.FileHandler('test.log') # 设置文件处理器,加载处理器格式 file_handler.setFormatter(formatter) #控制台日志 console_handler=logging.StreamHandler(sys.stdout) console_handler.formatter=formatter #为logger添加的日志处理器 logger.addHandler(file_handler) logger.addHandler(console_handler) #指定日志的最低输出级别,默认为warn级别 logger.setLevel(logging.INFO) return logger if __name__ == '__main__': logger=my_get_logger('test') # extra: 这是一个字典(dict)参数,它能够用来自定义消息格式中所包含的字段,可是它的key不能与logging模块定义的字段冲突。 logger.debug('this is debug info',extra={'mark':'mark'}) logger.info('this is information',extra={'mark':'mark'}) logger.warning('this is warning message',extra={'mark':'mark'}) logger.error('this is error message',extra={'mark':'mark'}) logger.fatal('this is fatal message,it is same ad logger.critical',extra={'mark':'mark'}) logger.critical('this is critical message',extra={'mark':'mark'})
结果:ui
2018-11-27 09:54:43,318 INFO mark: this is information 2018-11-27 09:54:43,318 WARNING mark: this is warning message 2018-11-27 09:54:43,318 ERROR mark: this is error message 2018-11-27 09:54:43,319 CRITICAL mark: this is fatal message,it is same ad logger.critical 2018-11-27 09:54:43,319 CRITICAL mark: this is critical message
#logging.cong [loggers] #定义日志的对象名称是什么,注意必须定义root,不然报错 keys=root,main [handlers] #定义处理器的名字是什么,能够有多个,用逗号隔开 keys=consoleHandler [formatters] #定义输出格式对象的名字,能够有多个,用逗号隔开 keys=simpleFormatter [logger_root] #配置root对象的日志记录级别和使用的处理器 level=INFO handlers=consoleHandler [logger_main] #配置main对象的日志记录级别和使用的处理器,qualname值得就是日志对象的名字 level=INFO handlers=consoleHandler qualname=main #logger对象把日志传递给全部相关的handler的时候,会逐级向上寻找这个logger和它全部的父logger的所有handler, #propagate=1表示会继续向上搜寻; #propagate=0表示中止搜寻,这个参数涉及重复打印的坑。 propagate=0 [handler_consoleHandler] #配置处理器consoleHandler class=StreamHandler level=WARNING formatter=simpleFormatter args=(sys,) [formatter_simpleFormatter] #配置输出格式过滤器simpleFormatter format=%(asctime)-%(name)s-%(levelname)s-%(message)s
注意:能够看到logger和Handler均可以设置日志级别,日志输出是取最高级别。
字典形式配置功能更强大,也更加灵活。经过dictConfig函数,咱们能够将其余格式的配置文件转化成字典,如json,YAML等。this
实例:spa
import yaml from logging.config import dictConfig import os filename=os.path.dirname(os.path.abspath(__file__)) with open(filename+'/logging.yaml','r') as f: log=yaml.load(f.read()) dictConfig(log)
#logging.yaml #注意:yaml格式严格,:后面必定要带空格 version: 1 formatters: simple: format: '%(asctime)s-%(name)s-%(levelname)s-%(message)s' handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout console_err: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stderr loggers: simpleExample: level: DEBUG handlers: [console] propagate: no root: level: DEBUG handlers: [console_err]]
logging.config.listen(port)函数可让英语程序在一个socket上监听新的配置信息,达到在运行时改变配置,而不用重启应用程序的目的。
import logging.config import logging logging.config.fileConfig("logging.conf") logger=logging.getLogger('test.listen') #监听端口号9999 t=logging.config.listen(9999) t.setDaemon(True) t.start()
上一篇文章: Python模块分析:第3节-typing模块