python logging按时间切割日志


今天发现一个问题,之前的一个程序运行时间久了,日志文件越来越大.感觉这里可以优化一下,故上网搜索了一番.

先搬运相关知识点:

logging 中常用的日志处理方法和类

1. StreamHandler:logging.StreamHandler,日志输出到流,可以是sys.stderr,sys.stdout或者文件,这个方法通常用来将日志信息输出到控制台

2. FileHandler:logging.FileHandler,日志输出到文件,指定文件,将日志信息写入到文件中

3. BaseRotatingHandler:logging.handlers.BaseRotatingHandler,基本的日志轮转方式,这个类是日志轮转的基类,后面日志按时间轮转,按大小轮转的类都继承于此。轮转的意思就是保留一定数量的日志量,如设置保持7天日志,则会自动删除旧的日志,只保留最近7天

4. RotatingHandler:logging.handlers.RotatingHandler,继承BaseRotatingHandler,支持日志文件按大小轮转

5. TimeRotatingHandler:logging.handlers.TimeRotatingHandler,继承BaseRotatingHandler,支持日志文件按时间轮转

6. SocketHandler:logging.handlers.SocketHandler,远程输出日志到TCP/IP sockets

7. DatagramHandler:logging.handlers.DatagramHandler,远程输出日志到UDP sockets

8. SMTPHandler:logging.handlers.SMTPHandler,远程输出日志到邮件地址

9. MemoryHandler:logging.handlers.MemoryHandler,日志输出到内存中的指定buffer

10. HTTPHandler:logging.handlers.HTTPHandler,通过"GET"或者"POST"远程输出到HTTP服务器

TimedRotatingFileHandler 的主要参数:

1. filename: 指定日志文件的名字,会在指定的位置创建一个 filename 文件,然后会按照轮转数量创建对应数量的日志文件,每个轮转文件的文件名为 filename 拼接时间,默认YY-mm-DD_HH-MM-SS,可以自定义。

2. when: 指定日志文件轮转的时间单位

S - Seconds
M - Minutes
H - Hours
D - Days
midnight - roll over at midnight
W{0-6} - roll over on a certain day; 0 - Monday

3. interval: 指定日志文件切割时间,如 when='S', interval=60,表示每60秒日志切割一次,when='D', interval=1,表示每天切割一次。

4. backupCount: 指定日志文件保留的数量,指定一个整数,则日志文件只保留这么多个,自动删除旧的文件。

最后附上我的源码:

def set_log(filename):
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    file_format = logging.Formatter('%(asctime)s Line%(lineno)d [%(levelname)s] %(message)s')

    time_handler = TimedRotatingFileHandler(filename=filename, when='D', interval=1, backupCount=7)
    time_handler.setLevel(logging.INFO)
    time_handler.setFormatter(file_format)

    logger.addHandler(time_handler)

 参考: https://www.cnblogs.com/xianyulouie/p/11041777.html

 参考: https://blog.csdn.net/weixin_43790276/article/details/101944628