Go最全Python logging模块_logging(4),大专生三面蚂蚁金服

img
img

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

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


(2)控制台输出


![](https://img-blog.csdn.net/20180505184909763?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NvdXRoV2luZDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)



(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)在控制台输出:


![](https://img-blog.csdn.net/20180505185133142?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NvdXRoV2luZDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)



(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对象


Filter可以被Handler和Logger用来做比level更细粒度的、更复杂的过滤功能。



#### 7.实例


(1)需求


(a)要求将所有级别的日志都写入磁盘文件中


(b)all.log文件中记录所有的日志信息


(c)error.log文件中单独记录error及以上级别的日志信息


(d)要求all.log,每秒一个log文件,超过10个log就删除。


代码:



import logging
import logging.handlers
import time
import threading
def log_test():
#1.创建一个logger,设置Log等级总开关
logger = logging.getLogger(‘mylogger’)
logger.setLevel(logging.DEBUG)

#2.设置输出到all.log的参数
f1 = logging.handlers.TimedRotatingFileHandler('D:/st07/error/tmp1/all.log', when='S', 
interval=1, backupCount=10)
format1=logging.Formatter('%(asctime)s - %(filename)s - %(levelname)s:%(message)s')
f1.setFormatter(format1)
f1.suffix = "%Y-%m-%d_%H-%M-%S.log" 

#3.设置输出到error.log的等级开关和格式
f2 = logging.FileHandler('D:/st07/error/tmp1/error.log')
f2.setLevel(logging.ERROR)
format2 = logging.Formatter("%(asctime)s  %(filename)s[line:%(lineno)d]  %(levelname)s: %(message)s") 
f2.setFormatter(format2)
#4.把logger添加到handler里面 
logger.addHandler(f1)
logger.addHandler(f2)

#日志
logger.debug('logger debug message')  
logger.info('logger info message')  
logger.warning('logger warning message')  
logger.error('logger error message')  
logger.critical('logger critical message')

#为了测试,重复构造定时器
global timer
timer = threading.Timer(1, log_test)
timer.start()

#测试(用定时器来实现)
timer = threading.Timer(1, log_test)
timer.start()


注意:filehanlder.suffix的格式,如果设定是天应该写成“%Y-%m-%d.log”,写成其他格式会导致不能删除旧文件。




![img](https://img-blog.csdnimg.cn/img_convert/2eeaa343a3199ebbe50c256ae8fa52c9.png)
![img](https://img-blog.csdnimg.cn/img_convert/06b4dc73f2a73367cc911576bb625125.png)

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

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**





[外链图片转存中...(img-6C04RxOV-1715817943978)]
[外链图片转存中...(img-FftoVosp-1715817943978)]

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

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值