• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python (logging) 日志按日期、大小回滚的操作

    描述: 日志按日期、大小回滚

    代码:

    # -*- coding: utf-8 -*-
    import os
    import logging.handlers 
    log_dir = os.path.dirname(os.path.abspath(__file__)) + os.sep + 'logs' 
    if not os.path.isdir(log_dir):
     os.makedirs(log_dir) 
    # CONSTANT VARIABLES 
    MODULE_NAME = 'my_module'
    LOG_LEVEL = 'INFO' 
    def get_logger(module_name=MODULE_NAME, log_level=LOG_LEVEL): 
     logging.basicConfig() 
     logger = logging.getLogger(module_name) 
     logger.setLevel(log_level)
     
     # # 按时间回滚 1天换1次, 保留180天
     # time_file_handler = logging.handlers.TimedRotatingFileHandler(
     # log_dir + os.sep + module_name + '_day.log',
     # when='midnight',
     # interval=1,
     # backupCount=180
     # )
     #
     # time_file_handler.suffix = '%Y-%m-%d.log' # 按 天 
     time_file_handler = logging.handlers.TimedRotatingFileHandler(
     log_dir + os.sep + module_name + '_sec.log',
     when='S',
     interval=1,
     backupCount=180
     ) 
     time_file_handler.suffix = '%Y-%m-%d_%H-%M-%S.log' # 按 秒
     formatter = logging.Formatter('[%(asctime)s]-[%(filename)s]-[%(funcName)s]-[%(lineno)d]-12s: [%(levelname)s]-8s>> %(message)s')
     time_file_handler.setFormatter(formatter) 
     logger.addHandler(time_file_handler)
     
     # # 按大小回滚
     # file_size_handler = logging.handlers.RotatingFileHandler(
     # log_dir + os.sep + module_name + 'size.log',
     # maxBytes=1024,
     # backupCount=1000,
     # )
     # file_size_handler.setFormatter(formatter)
     # logger.addHandler(file_size_handler) 
     return logger 
    if __name__ == '__main__':
     logger = get_logger()
     logger.info('hello')

    输出:

    (1) 日志:

    [2019-12-21 14:12:44,682]-[paper4_logging.py]-[module>]-[59]-12s: [INFO]-8s>> hello

    (2) 目录:

    2019/12/21 周六 14:12 86 my_module_sec.log

    2019/12/21 周六 14:12 86 my_module_sec.log.2019-12-21_14-12-15.log

    2019/12/21 周六 14:12 86 my_module_sec.log.2019-12-21_14-12-35.log

    2019/12/21 周六 14:12 86 my_module_sec.log.2019-12-21_14-12-38.log

    补充:python中用logging实现日志滚动和过期日志删除

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

    在实际应用中,我们通常根据时间进行滚动,因此,本文中主要介绍TimeRotaingFileHandler的使用方法(RotatingFileHandler一样)。

    代码示例如下:

    #!/usr/bin/env python
    #_*_coding:utf-8_*_
    # vim : set expandtab ts=4 sw=4 sts=4 tw=100 :
    import logging
    import time
    import re
    from logging.handlers import TimedRotatingFileHandler
    from logging.handlers import RotatingFileHandler
    def main():
     #日志打印格式
     log_fmt = '%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s'
     formatter = logging.Formatter(log_fmt)
     #创建TimedRotatingFileHandler对象
     log_file_handler = TimedRotatingFileHandler(filename="ds_update", when="M", interval=2, backupCount=2)
     #log_file_handler.suffix = "%Y-%m-%d_%H-%M.log"
     #log_file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}.log$")
     log_file_handler.setFormatter(formatter) 
     logging.basicConfig(level=logging.INFO)
     log = logging.getLogger()
     log.addHandler(log_file_handler)
     #循环打印日志
     log_content = "test log"
     count = 0
     while count  30:
     log.error(log_content)
     time.sleep(20)
     count = count + 1
     log.removeHandler(log_file_handler)
    if __name__ == "__main__":
     main()
    

    filename:日志文件名的prefix;

    when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下:

    “S”: Seconds
    “M”: Minutes
    “H”: Hours
    “D”: Days
    “W”: Week day (0=Monday)
    “midnight”: Roll over at midnight

    interval:滚动周期,单位有when指定,比如:when='D',interval=1,表示每天产生一个日志文件;

    backupCount:表示日志文件的保留个数;

    除了上述参数之外,TimedRotatingFileHandler还有两个比较重要的成员变量,它们分别是suffix和extMatch。

    suffix是指日志文件名的后缀,suffix中通常带有格式化的时间字符串,filename和suffix由“.”连接构成文件名(例如:filename=“runtime”, suffix=“%Y-%m-%d.log”,生成的文件名为runtime.2015-07-06.log)。

    extMatch是一个编译好的正则表达式,用于匹配日志文件名的后缀,它必须和suffix是匹配的,如果suffix和extMatch匹配不上的话,过期的日志是不会被删除的。

    比如,suffix=“%Y-%m-%d.log”, extMatch的只应该是re.compile(r”^\d{4}-\d{2}-\d{2}.log$”)。

    默认情况下,在TimedRotatingFileHandler对象初始化时,suffxi和extMatch会根据when的值进行初始化:

    ‘S': suffix=”%Y-%m-%d_%H-%M-%S”, extMatch=r”\^d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}”;
    ‘M':suffix=”%Y-%m-%d_%H-%M”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}”;
    ‘H':suffix=”%Y-%m-%d_%H”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}”;
    ‘D':suffxi=”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;
    ‘MIDNIGHT':”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;
    ‘W':”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;

    如果对日志文件名没有特殊要求的话,可以不用设置suffix和extMatch,如果需要,一定要让它们匹配上。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • 解决python logging遇到的坑 日志重复打印问题
    • python 实现logging动态变更输出日志文件名
    • Python日志打印里logging.getLogger源码分析详解
    • python 如何对logging日志封装
    • Python logging自定义字段输出及打印颜色
    • Python中logging日志的四个等级和使用
    • Python+logging输出到屏幕将log日志写入文件
    • Python logging模块handlers用法详解
    • 如何理解python接口自动化之logging日志模块
    上一篇:PyQt5设置登录界面及界面美化的实现
    下一篇:python 实现logging动态变更输出日志文件名
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python (logging) 日志按日期、大小回滚的操作 python,logging,日志,按,日期,