网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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对象
Filter可以被Handler和Logger用来做比level更细粒度的、更复杂的过滤功能。
7.实例
(1)需求
(a)要求将所有级别的日志都写入磁盘文件中
(b)all.log文件中记录所有的日志信息
©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文件个数:
(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')



**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618658159)**
图片转存中...(img-yAKOV1Wc-1715742919112)]
[外链图片转存中...(img-DSRtEXvi-1715742919112)]
[外链图片转存中...(img-k6HTvA8e-1715742919112)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618658159)**