zoukankan      html  css  js  c++  java
  • 日志回滚:python(日志分割)

    日志回滚:python

    什么是日志回滚?

    答:

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

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

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

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

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

    常用按天分割日志代码:

    在day_log.py中

    import time
    import logging
    import logging.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()
    
    # myapp的初始化工作
    myapp = logging.getLogger('myapp')
    myapp.setLevel(logging.INFO)
    
    # 添加TimedRotatingFileHandler
    # 定义一个1天换一次log文件的handler
    # 保留3个旧log文件
    timefilehandler = logging.handlers.TimedRotatingFileHandler(
        log_dir + os.sep + "sec.log",
        when='D',
        interval=1,
        backupCount=3
    )
    # 设置后缀名称,跟strftime的格式一样
    timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log"
    # timefilehandler.suffix = "%Y-%m-%d.log"
    
    formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
    timefilehandler.setFormatter(formatter)
    myapp.addHandler(timefilehandler)
    
    while True:
        time.sleep(6)
        myapp.info("test")
    

      

    1、按照时间回滚(就是按时间分割日志,并且限制日志文件的个数,删除早期的日志)

    使用TimedRotatingFileHandler

    对log,通常有一种想要的效果:log按天切分,每天一个log文件,保留三天内的log,过期删除。

    import time
    import logging
    import logging.handlers
    
    # logging初始化工作
    logging.basicConfig()
    
    # myapp的初始化工作
    myapp = logging.getLogger('myapp')
    myapp.setLevel(logging.INFO)
    
    # 添加TimedRotatingFileHandler
    # 定义一个1秒换一次log文件的handler
    # 保留3个旧log文件
    timefilehandler = logging.handlers.TimedRotatingFileHandler("log1/myapp.log", when='S', interval=1, backupCount=3)
    # 设置后缀名称,跟strftime的格式一样
    timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log"
    
    formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
    timefilehandler.setFormatter(formatter)
    myapp.addHandler(timefilehandler)
    
    while True:
        time.sleep(0.1)
        myapp.info("test")
    

      


    注意: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基于文件大小切分
    这个配置是可以生效的,符合预期

    import time
    # import logging
    import logging.handlers
    
    # logging初始化工作  
    logging.basicConfig()
    
    # myapp的初始化工作  
    myapp = logging.getLogger('myapp')
    myapp.setLevel(logging.INFO)
    
    # 写入文件,如果文件超过100个Bytes,仅保留5个文件。  
    handler = logging.handlers.RotatingFileHandler(
        'logs/myapp.log', maxBytes=500, backupCount=5)
    
    formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
    handler.setFormatter(formatter)
    # 设置后缀名称,跟strftime的格式一样  
    myapp.addHandler(handler)
    
    while True:
        time.sleep(0.1)
        myapp.info("file test")
    

      

    3、同时按照时间和大小回滚

     参考:https://www.cnblogs.com/yonghuacui/p/6177886.html

  • 相关阅读:
    android button click事件
    springmvc 多方法访问
    hibernate的save和saveOrUpdate方法
    总结的方法
    oracle 存储过程
    ibatis学习笔记(四)>>>>>>>ibatis使用实例
    ibatis学习笔记(二)>>>>>>>sqlMapConfig.xml文件详解
    ibatis学习笔记(三)>>>>>>>java实体跟表映射.xml文件详解
    ibatis学习笔记(一)>>>>>>>sqlMapConfig.xml文件详解
    spring
  • 原文地址:https://www.cnblogs.com/andy9468/p/8378492.html
Copyright © 2011-2022 走看看