python logging模块使用
2021/9/21 1:27:27
本文主要是介绍python logging模块使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
python logging模块使用
学习完本篇,你将会
- 理解什么是日志
- 了解Logger各个模块功能
- 掌握Logger配置文件conf的使用
- 能独立编写一个自己的Logger日志,负责打印信息,以及收集信息,方便后续查看
log日志学习
- 什么是日志:为了更方便的定位问题,通过文字或图表的方式给出程序在运行的状态内容,方便后续定位以及系统优化。
1.Python中用logging模块用户记录日志
2.C++使用log4cplus
3.Java中使用log4j
logging简介
- Logging分为4个模块:loggers,handlers,filters,and formatters.
1.Loggers:提供应用程序调用的接口
2.handlers: 把日志发送到指定的位置
3.filters: 过滤日志信息
4.formatters: 格式化输出日志
Formatter: 默认形式为: %Y-%m-%d %H:%M:%S. 格式为: %()s
- Logger:
Logger.setLevel() 设置日志级别 LoaddHand()和removeHandler()增加和删除日志处理器 Logger.addFilter()和Logger.removeFilter增加和删除过滤器 Logger.debug(),Logger.info(),Logger.warning(),Logger.error(),and Logger.critical()创建不同的级别日志 GetLogger()获取日志的根示例
- Handler:
setLevel()设置日志级别 setFormatter()设置输出格式 addFilter()and removeFilter增加和删除过滤器
Logging模块例子
- Logger简单的例子:
#coding:utf-8 import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')
打印输出: WARNING:root:warning message ERROR:root:error message CRITICAL:root:critical message
从上输出的可以的出:
1.输出的内容只有warning、error、critical
2.从上知道日志的级别依次为CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET 。只有大于info的级别日志才在输出中显示
3.默认出输出的内容为:”级别:用户输入内容”
自定义配置
- Logger简单的例子:
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d]%(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='test.log', filemode='w') logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')
**打印输出: Tue, 25 Apr 2021 17:46:33 demo3.py[line:7] DEBUG debug message Tue, 25 Apr 2021 17:46:33 demo3.py[line:8] INFO info message Tue, 25 Apr 2021 17:46:33 demo3.py[line:9] WARNING warning message Tue, 25 Apr 2021 17:46:33 demo3.py[line:10] ERROR error message Tue, 25 Apr 2021 17:46:33 demo3.py[line:11] CRITICAL critical message
从上图输出的可以的出:
1.可以通过配置basicConfig参数来配置模块输出内容以及各式
2.Leve指输出级别至少是多少的时候才能输出
3.filemode文件打开的方式
4.format 指输出各式,整体格式
5.datefmt 日期输出格式
6.stream指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为
7.sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。(该示例没体现)
自定义配置参数format介绍
- format配置参数介绍:
1.%(name)s : Logger的名字
2.%(levelno)s:数字形式的日志级别
3.%(levelname)s:文本形式的日志级别
4.%(pathname)s: 调用日志输出函数的模块的完整路径名,可能没有
5.%(filename)s :调用日志输出函数的模块的文件名
6.%(module)s: 调用日志输出函数的模块名
7.%(funcName)s: 调用日志输出函数的函数名
8.%(lineno)d :调用日志输出函数的语句所在的代码行
9.%(created)f :当前时间,用UNIX标准的表示时间的浮 点数表示
10.%(relativeCreated)d :输出日志信息时的,自Logger创建以 来的毫秒数
11.%(asctime)s :字符串形式的当前时间。默认格式是 “2021-09-06 16:49:45,896”。逗号后面的是毫秒
12.%(thread)d :线程ID。可能没有
13.%(threadName)s :线程名。可能没有
14.%(process)d :进程ID。可能没有
15.%(message)s:用户输出的消息
自定义配置参数datefmt介绍
- datefmt配置参数介绍:
1.%a:星期的英文简写。如 星期三为Web
2.%A :星期的英文全写。如 星期三为Wednesday
3.%b :月份的英文简写。如4月份为Apr
4.%B:月份的英文全写。如4月份为April
5.%c:日期时间的字符串表示。(如: 04/07/10 10:43:39)
6.%d: 日在这个月中的天数(是这个月的第几天)
7.%f: 微秒(范围[0,999999])
8.%H: 小时(24小时制,[0, 23])
9.%I: 小时(12小时制,[0, 11])
10.%j: 日在年中的天数 [001,366](是当年的第几天)
11.%m: 月份([01,12])
12.%M: 分钟([00,59])
13.%p: AM或者PM
14.%S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册_)
15.%U: 周在当年的周数当年的第几周),星期天作为周的第一天
16.%w: 今天在这周的天数,范围为[0, 6],6表示星期天
17.%W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
18.%x: 日期字符串(如:04/07/10)
19.%X: 时间字符串(如:10:43:39)
20.%y: 2个数字表示的年份
21.%Y: 4个数字表示的年份
22.%z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
23.%Z: 时区名称(如果是本地时间,返回空字符串)
24.%%: %% => %
Logger模块
- Logger介绍:
1.Logger是一个树形结构,输出信息之前都要获得一个logger,如果没有显示的获取则自动创建并使用root logger,如第一个例子所示。 logger = logging.getLogger()返回一个默认的Logger也即root Logger,并应用默认的日志级别、Handler和Formatter设置。
当然也可以通过Logger.setLevel(lel)指定最低的日志级别,可用的日志级别有logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL。
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()输出不同级别的日志,只有日志等级大于或等于设置的日志级别的日志才会被输出。
2.logger1.setLevel(logging.DEBUG)将logger1的日志级别设置为了DEBUG,为何显示的时候没有显示出DEBUG级别的日志信息,而是从INFO级别的日志开始显示呢?原来logger1和logger2对应的是同一个Logger实例,只要logging.getLogger(name)中名称参数name相同则返回的Logger实例就是同一个,且仅有一个,也即name与Logger实例一一对应。在logger2实例中通过logger2.setLevel(logging.INFO)设置mylogger的日志级别为logging.INFO,所以最后logger1的输出遵从了后来设置的日志级别。
3.logger1、logger2对应的每个输出分别显示两次,logger3对应的输出显示3次,logger4对应的输出显示4次......通过logger = logging.getLogger()显示的创建了root Logger,而logger1 = logging.getLogger('mylogger')创建了root Logger的孩子(root.)mylogger,logger2同样。
Handler模块
简单例子*
fh = logging.FileHandler('test.log') ch = logging.StreamHandler()
- Handler介绍:
1.Handler作用: Handler对象负责发送相关的信息到指定目的地,有几个常用的Handler方法: Handler.setLevel(lel):指定日志级别,低于lel级别的日志将被忽略 Handler.setFormatter():给这个handler选择一个Formatter Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象
1.通过通过addHandler()方法为Logger添加多个Handler:logger.addHandler(fh);logger.addHandler(ch)
以下是部分Handler简介:
1.logging.StreamHandler 可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息
2.logging.FileHandler 用于向一个文件输出日志信息
3.logging.handlers.RotatingFileHandler 类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出4.logging.handlers.TimedRotatingFileHandler 和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件5.logging.handlers.SocketHandler 使用TCP协议,将日志信息发送到网络。6.logging.handlers.DatagramHandler 使用UDP协议,将日志信息发送到网络。7.logging.handlers.SysLogHandler 日志输出到syslog
8.logging.handlers.NTEventLogHandler 远程输出日志到Windows NT/2000/XP的事件日志
9.logging.handlers.SMTPHandler 远程输出日志到邮件地址logging.handlers.MemoryHandler 日志输出到内存中的制定buffer
10.logging.handlers.HTTPHandler 通过"GET"或"POST"远程输出到HTTP服务器
Formatter模块
- Formatter:对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。
Filter模块
- 限制只有满足过滤规则的日志才会输出。
比如我们定义了filter = logging.Filter('a.b.c'),并将这个Filter添加到了一个Handler上,则使用该Handler的Logger中只有名字带a.b.c前缀的Logger才能输出其日志。
取消下列两行程序的注释
#filter = logging.Filter('mylogger.child1.child2') #fh.addFilter(filter)
Logging文件配置信息
- Logger除了在程序中配置外,还可以通过logger.conf文件方式配置设置 Logger,Handler,Filter,Formatter等信息写入到配置文件,通过加载配置文件实,配置文件具体的实现方式如下:
logger.conf配置文件
[loggers] keys=root,simpleExample [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=
py文件
import logging import logging.config logging.config.fileConfig("logging.conf") # 采用配置文件 # create logger logger = logging.getLogger("simpleExample") # "application" code logger.debug("debug message") logger.info("info message") logger.warn("warn message") logger.error("error message") logger.critical("critical message")
总结
通过本篇,了解了log日志的格式,python如何读取log日志,同时通过不同的方式读取日志
脚本参考
#coding:utf-8 import logging class loger(object): logger = '' def __init__(self, user='root', filename='', fileLevel = logging.DEBUG, fileformatter = '%(asctime)s - %(name)s - %(levelname)s:%(message)s', timeformatter='%Y-%m-%d %H:%M:%S' ): # 输出文件句柄 fh = '' #输出窗口句柄 ch = '' #设置文件的格式 formatter = logging.Formatter(fileformatter) formatter.datefmt = timeformatter # 配置用户 if user=='root': self.logger= logging.getLogger() else: self.logger = logging.getLogger(user) #设置文件输出级别 self.logger.setLevel(fileLevel) #可以控制控制台以及文件日志日志的级别, #配置输出窗口 ch = logging.StreamHandler() ch.setFormatter(formatter) #配置控制台输出日志的级别,方便实时观看 ch.setLevel(logging.INFO) self.logger.addHandler(ch) #配置输出 if filename is not '': fh=logging.FileHandler(filename) fh.setFormatter(formatter) self.logger.addHandler(fh) self.logger.warning('=========================================') def printf_log(self,msg,level='DEBUG',*args,**kwargs): print msg if level == 'CRITICAL': self.logger.critical(msg=msg,*args,**kwargs) elif level == 'ERROR': self.logger.error(msg=msg,*args,**kwargs) elif level == 'WARNING': self.logger.warning(msg=msg,*args,**kwargs) elif level == 'INFO': self.logger.info(msg=msg,*args,**kwargs) elif level == 'DEBUG': self.logger.debug(msg=msg,*args,**kwargs) else: self.logger.error(u'请出入正确的级别') if __name__ == "__main__": # loger1 = loger(filename='tttt.log',user='user1') # loger1.printf_log('test', level='WARNING') loger2=loger(filename='test.log',fileLevel=logging.DEBUG) loger2.printf_log(level='ERROR',msg=u'打印%d%s' %(1,'text')) loger2.printf_log(level='ERROR', msg=u'打印') loger2.printf_log(level='DEBUG', msg=u'打印') loger2.printf_log(level='INFO', msg=u'test') loger2.printf_log(level='INFO', msg=u'test')
2021-09-10 18:13:21,490 - root - WARNING - logger warning message 2021-09-10 18:13:21,490 - root - ERROR - logger error message 2021-09-10 18:13:21,490 - root - CRITICAL - logger critical message
这篇关于python logging模块使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01Python编程基础知识
- 2024-11-01Python编程基础
- 2024-10-31Python基础入门:理解变量与数据类型
- 2024-10-30Python股票自动化交易资料详解与实战指南
- 2024-10-30Python入行:新手必读的Python编程入门指南
- 2024-10-30Python入行:初学者必备的编程指南
- 2024-10-30Python编程入门指南
- 2024-10-30Python量化交易学习:新手入门指南
- 2024-10-30Python股票自动化交易实战入门教程
- 2024-10-29Python股票自动化交易教程:新手入门指南