当前位置 : 主页 > 编程语言 > python >

Python日志处理(logging模块)和发送邮件

来源:互联网 收集:自由互联 发布时间:2022-06-15
一、Python日志处理(logging模块) Python之向日志输出中添加上下文信息:​​ 将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统

一、Python日志处理(logging模块)

  Python之向日志输出中添加上下文信息:​​

  将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统的性能。因此,有必要对日志文件按某种条件进行切分,要切分日志文件。

  分割日志的触发条件:大小、日期,或者大小加上日期。

  说是切分,实际上是,当一个日志文件达到触发条件后,对日志文件进行重命名,之后再新建原来名称的日志文件(此时就是空文件了),新产生的日志就写入新的日志文件。

  为啥叫回滚呢?当分割的日志文件达到指定数目的上限个数时,最老的日志文件就会被删除。

   logging库提供了两个可以用于日志滚动的class,一个是RotatingFileHandler,它主要是根据日志文件的大小进行滚动,另一个是TimeRotatingFileHandler,它主要是根据时间进行滚动。在实际应用中,我们通常根据时间进行滚动。

  1、按照时间回滚

  按时间切割日志,并且限制日志文件的个数,删除早期的日志

  使用TimedRotatingFileHandler

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "wzs"
#2021/6/20

import logging
from logging import handlers
import os

log_dir = "log-day" # 日志存放文件夹名称
log_path = os.getcwd() + os.sep + log_dir
if not os.path.isdir(log_path):
os.makedirs(log_path)
# logging初始化工作
logging.basicConfig()

logger = logging.getLogger('mylogger')
logger.setLevel(logging.INFO)
# 定义一个1天换一次log文件的handler
# 保留7个旧log文件
rf_handler = logging.handlers.TimedRotatingFileHandler(
log_dir + os.sep + "info.log",
when='D',
interval=1,
backupCount=7,
)
# when指定单位是s(秒), interval是时间间隔的频率, 单位是when所指定的哟(所以,你可以理解频率是5s);backupCount表示备份的文件个数,我这里是指定的3个文件。
rf_handler.suffix = "%Y-%m-%d.log"
rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))

f_handler = logging.handlers.TimedRotatingFileHandler(
log_dir + os.sep + "error.log",
when='D',
interval=1,
backupCount=7
)
f_handler.suffix = "%Y-%m-%d.log"
f_handler.setLevel(logging.ERROR)
f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))

logger.addHandler(rf_handler)
logger.addHandler(f_handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')


注意:filehanlder.suffix的格式必须这么写,才能自动删除旧文件,如果设定是天,就必须写成“%Y-%m-%d.log”,写成其他格式会导致删除旧文件不生效。这个配置在源码里能看出来,但是在官方文档并没有说明这一点!!!!!!!!!!

TimedRotatingFileHandler的构造函数定义如下:
TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
filename 是输出日志文件名的前缀,比如log/myapp.log
when 是一个字符串的定义如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建
取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以
有些情况suffix要定义的不能因为when而重复。
backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设3,则在文件的创建过程中
库会判断是否有超过这个3,若超过,则会从最先创建的开始删除。


  2、按照大小切割

  RotatingFileHandler基于文件大小切分

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "wzs"
#2021/6/20

import logging
from logging import handlers
import os

log_dir = "log-day" # 日志存放文件夹名称
log_path = os.getcwd() + os.sep + log_dir
if not os.path.isdir(log_path):
os.makedirs(log_path)
# logging初始化工作
logging.basicConfig()

logger = logging.getLogger('mylogger')
logger.setLevel(logging.INFO)
# 定义一个1天换一次log文件的handler
# 保留7个旧log文件
rf_handler = logging.handlers.RotatingFileHandler(
log_dir + os.sep + "info.log",
maxBytes=1024*1024,
backupCount=5
)
# when指定单位是s(秒), interval是时间间隔的频率, 单位是when所指定的哟(所以,你可以理解频率是5s);backupCount表示备份的文件个数,我这里是指定的3个文件。
rf_handler.suffix = "%Y-%m-%d.log"
rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))

f_handler = logging.handlers.RotatingFileHandler(
log_dir + os.sep + "error.log",
maxBytes=1024*1024,
backupCount=5
)
f_handler.suffix = "%Y-%m-%d.log"
f_handler.setLevel(logging.ERROR)
f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))

logger.addHandler(rf_handler)
logger.addHandler(f_handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')


二、Python发送邮件

 



上一篇:Python套接字
下一篇:没有了
网友评论