Python logging模块_logging

(1)常用参数

参数****名称描述
level指定日志级别。
format指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。
datefmt指定日期、时间格式,默认:datefmt=“%Y-%m-%d %H:%M:%S”。
filename指定日志输出目标文件的文件名,指定该设置项后日志信心就不会被输出到控制台了。
filemode指定日志文件打开模式,默认为’a’。该选项在filename指定时才有效。
stream指定日志输出目标stream,如sys.stdout、sys.stderr。需要注意stream和filename不能同时出现,否则会引发ValueError异常。
style指定format格式字符串的风格,可取值为’%‘、’{‘和’$‘,默认为’%’

(2)format格式化字符串的字段

字段名称使用格式描述
asctime%(asctime)s日志事件发生的时间,默认如:2018-05-04 21:48:05,956。
created%(created)f日志事件发生的时间–时间戳,就是当时调用time.time()函数返回的值。
msecs%(msecs)d日志事件发生事件的毫秒部分
levelname%(levelname)s该日志记录的文字形式的日志级(‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’)。
levelno%(levelno)s该日志记录的数字形式的日志级别。
name%(name)s所使用的日志器名称,默认是’root’,因为默认使用的是rootLogger。
message%(message)s日志记录的文本内容。
pathname%(pathname)s调用日志记录函数的源码文件的全路径。
filename%(filename)spathname的文件名部分,包含文件后缀。
module%(module)sfilename的名称部分,不包含后缀。
lineno%(lineno)d调用日志记录函数的源代码所在的行号。
funcName%(funcName)s调用日志记录函数的函数名。
process%(process)d进程ID。
processName%(processName)s进程名称。
thread%(thread)d线程ID。
threadName%(thread)s线程名称。
4.输出到文件

(1)在error_test1.py中写入代码

import logging  
logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s:%(message)s',  
                    filename='D:/st07/error/tmp/test.log',  
                    filemode='w')  
#日志
logging.debug('this is a debug message')  
logging.info('this is a info message')  
logging.warning('this is a warning message')  
logging.error('this is a error message')  
logging.critical('this is a critical message')  
#测试代码
try:
    print("start")
    n=int(input("Please enter a number:"))
    share=12/n
    print('每一个股东的分红是:{}亿元。'.format(share))
except ValueError as e:
    logging.error(e)
except ZeroDivisionError as e:
    logging.error(e)
finally:
    print("end")

(2)控制台输出

(3)查看test.log日志文件

2018-05-04 22:34:02,591 -error_test1.py[line:7] - DEBUG:this is a debugmessage

2018-05-04 22:34:02,591 -error_test1.py[line:8] - INFO:this is a infomessage

2018-05-04 22:34:02,591 -error_test1.py[line:9] - WARNING:this is awarning message

2018-05-04 22:34:02,591 -error_test1.py[line:10] - ERROR:this is a errormessage

2018-05-04 22:34:02,591 -error_test1.py[line:11] - CRITICAL:this is a critical message

2018-05-04 22:34:06,850 -error_test1.py[line:19] - ERROR:invalid literalfor int() with base 10: ‘3.5’

5.logging输出日志到控制台和文件

(1)在把DEBUG等级日志输出到文件的同时,在控制台只输出ERROR等级日志

在error1.py中写入代码:

import logging

logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s:%(message)s',  
                    filename='D:/st07/error/tmp/test.log',  
                    filemode='w')        

#在控制台输出ERROR等级日志,在logging.basicConfig中的参数配置会成为默认配置
#创建一个logger,定义输出到控制台的log等级开关为ERROR  
logger = logging.getLogger()      
con = logging.StreamHandler()
con.setLevel(logging.ERROR)  
#定义handler的输出格式  
format1 = logging.Formatter("%(asctime)s  %(filename)s[line:%(lineno)d]  %(levelname)s: %(message)s")  
con.setFormatter(format1)   
#将logger添加到handler里面  
logger.addHandler(con) 
                                       
#日志              
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')  

#测试代码
try:
    print("start")
    n=int(input("Please enter a number:"))
    share=12/n
    print('每一个股东的分红是:{}亿元。'.format(share))
except ValueError as e:
    logging.error(e)
except ZeroDivisionError as e:
    logging.error(e)
finally:
    print("end")

(2)在控制台输出:

(3)查看test.log日志文件:

2018-05-04 23:05:16,612 -error1.py[line:20] - DEBUG:debug message

2018-05-04 23:05:16,612 -error1.py[line:21] - INFO:info message

2018-05-04 23:05:16,612 -error1.py[line:22] - WARNING:warning message

2018-05-04 23:05:16,612 -error1.py[line:23] - ERROR:error message

2018-05-04 23:05:16,612 -error1.py[line:24] - CRITICAL:critical message

2018-05-04 23:05:46,735 -error1.py[line:33] - ERROR:invalid literal for int() with base 10: ‘2.5’

6.logging模块组件

(1)logging模块的四大组件

组件名称对应类名描述
日志器Logger提供了应用程序可一直使用的接口。
处理器Handler将logger创建的日志记录发送到合适的目的输出。
过滤器Filter提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录。
格式器Formatter决定日志记录的最终输出格式。

(2)Logger对象常用方法

方法描述
Logger.setLevel()设置日志器将会处理的日志消息的最低严重级别。
Logger.addHandler()为该logger对象添加handler对象。
Logger.removeHandler()为该logger对象移除handler对象。
Logger.addFilter()为该logger对象添加filter对象。
Logger.removeFilter()为该logger对象移除个filter对象。

怎样得到一个Logger对象呢?

通常用: logger = logging.getLogger()

logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则其值为’root’。

name相同:只要logging.getLogger(name)中name相同,则返回的Logger实例就是同一个,最后logger的输出遵从后来设置的日志级别。

(3)Handler对象常用方法

方法描述
Handler.setLevel()设置handler将会处理的日志消息的最低严重级别。
Handler.setFormatter()为handler设置一个格式器对象。
Handler.addFilter()为handler添加一个过滤器对象。
Handler.removeFilter()为handler删除一个过滤器对象。

一些常用的Handler子类

Handler描述
logging.StreamHandler将日志消息发送到Stream。
logging.FileHandler将日志消息发送到磁盘文件,默认情况下文件大小会无限增长。
logging.handlers.RotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按大小切割。
logging.hanlders.TimedRotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按时间切割。
logging.handlers.HTTPHandler将日志消息以GET或POST的方式发送给一个HTTP服务器。
logging.handlers.SMTPHandler将日志消息发送给一个指定的email地址。

例如:

con = logging.StreamHandler()

con.setLevel(logging.ERROR)

经常需要将日志消息发送到磁盘文件,并支持日志文件按时间切割:logging.hanlders.TimedRotatingFileHandler的构造函数定义如下:
     TimedRotatingFileHandler(filename[,when [,interval [,backupCount]]])
filename是输出日志文件名,when是一个字符串:

“S”:Seconds

“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight

interval是指等待多少个单位when的时间后,Logger会自动重建文件(这个文件的创建取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件)。

backupCount是保留日志个数,默认的0不会自动删除日志。若设10,则在文件的创建过程中库会判断是否有超过10个,若超过则会从最先创建的开始删除。

(4)Formater对象

Formater对象用于配置日志信息的最终顺序、结构和内容。

例如:

#定义handler的输出格式

format1 =logging.Formatter(“%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s: %(message)s”)

con.setFormatter(format1)

(5)Filter对象

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
er的输出格式

format1 =logging.Formatter(“%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s: %(message)s”)

con.setFormatter(format1)

(5)Filter对象

[外链图片转存中…(img-YmhdaPKP-1726081752005)]
[外链图片转存中…(img-Z16RicIH-1726081752006)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值