既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
#将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”,写成其他格式会导致不能删除旧文件。
查看生成的log文件个数:
![](https://img-blog.csdn.net/20180505185755647?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NvdXRoV2luZDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
(2)在error\_test1.py写代码:
import logging
创建logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger1 = logging.getLogger(‘mylogger’)
logger1.setLevel(logging.INFO)
logger2 = logging.getLogger(‘mylogger.child1’)
logger2.setLevel(logging.WARNING)
f = logging.FileHandler(‘D:/st07/error/tmp/all.log’,mode=‘w’)
formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s:%(message)s’)
f.setFormatter(formatter)
logger.addHandler(f)
f1 = logging.FileHandler(‘D:/st07/error/tmp/some.log’,mode=‘w’)
f1.setFormatter(formatter)
logger1.addHandler(f1)
logger2.addHandler(f1)
日志
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’)
logger1.debug(‘logger1 debug message’)
logger1.info(‘logger1 info message’)
logger1.warning(‘logger1 warning message’)
logger1.error(‘logger1 error message’)
logger1.critical(‘logger1 critical message’)
logger2.debug(‘logger2 debug message’)
logger2.info(‘logger2 info message’)
logger2.warning(‘logger2 warning message’)
logger2.error(‘logger2 error message’)
logger2.critical(‘logger2 critical message’)
打开all.log和some.log,可以看到:
![img](https://img-blog.csdnimg.cn/img_convert/4c64d1400f1db7a847525fb9afef844d.png)
![img](https://img-blog.csdnimg.cn/img_convert/7082470c8bf9e6847df5292a001b07ea.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-M66Z99JP-1715706012519)]
[外链图片转存中...(img-mCrfDd2k-1715706012519)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**