日志回滚:python

什么是日志回滚?

答:

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

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

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

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

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

常用按天分割日志代码:

在day_log.py中

  1. import time
  2. import logging
  3. import logging.handlers
  4. import os
  5.  
  6. # 如果日志文件夹不存在,则创建
  7. log_dir = "log-day" # 日志存放文件夹名称
  8. log_path = os.getcwd() + os.sep + log_dir
  9. if not os.path.isdir(log_path):
  10. os.makedirs(log_path)
  11.  
  12. # logging初始化工作
  13. logging.basicConfig()
  14.  
  15. # myapp的初始化工作
  16. myapp = logging.getLogger('myapp')
  17. myapp.setLevel(logging.INFO)
  18.  
  19. # 添加TimedRotatingFileHandler
  20. # 定义一个1天换一次log文件的handler
  21. # 保留3个旧log文件
  22. timefilehandler = logging.handlers.TimedRotatingFileHandler(
  23. log_dir + os.sep + "sec.log",
  24. when='D',
  25. interval=1,
  26. backupCount=3
  27. )
  28. # 设置后缀名称,跟strftime的格式一样
  29. timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log"
  30. # timefilehandler.suffix = "%Y-%m-%d.log"
  31.  
  32. formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
  33. timefilehandler.setFormatter(formatter)
  34. myapp.addHandler(timefilehandler)
  35.  
  36. while True:
  37. time.sleep(6)
  38. myapp.info("test")

  

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

使用TimedRotatingFileHandler

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

  1. import time
  2. import logging
  3. import logging.handlers
  4.  
  5. # logging初始化工作
  6. logging.basicConfig()
  7.  
  8. # myapp的初始化工作
  9. myapp = logging.getLogger('myapp')
  10. myapp.setLevel(logging.INFO)
  11.  
  12. # 添加TimedRotatingFileHandler
  13. # 定义一个1秒换一次log文件的handler
  14. # 保留3个旧log文件
  15. timefilehandler = logging.handlers.TimedRotatingFileHandler("log1/myapp.log", when='S', interval=1, backupCount=3)
  16. # 设置后缀名称,跟strftime的格式一样
  17. timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log"
  18.  
  19. formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
  20. timefilehandler.setFormatter(formatter)
  21. myapp.addHandler(timefilehandler)
  22.  
  23. while True:
  24. time.sleep(0.1)
  25. 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基于文件大小切分
这个配置是可以生效的,符合预期

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

  

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

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

日志回滚:python(日志分割)的更多相关文章

  1. Jenkins:参数化构建:分支|模块|回滚|打印日志

    @ 目录 多分支 安装Git Parameter Plug-In 配置参数 选择构建分支 分模块 前提 分模块build 参数配置 分模块shell脚本 mvn 的基本用法 分模块运行 Jenkins ...

  2. 『无为则无心』Python日志 — 64、Python日志模块logging介绍

    目录 1.日志的作用 2.为什么需要写日志 3.Python中的日志处理 (1)logging模块介绍 (2)logging模块的四大组件 (3)logging日志级别 1.日志的作用 从事与软件相关 ...

  3. python logging模块日志回滚TimedRotatingFileHandler

    # coding=utf-8 import logging import time import os import logging.handlers import re def logger(app ...

  4. python logging模块日志回滚RotatingFileHandler

    # coding=utf-8 import logging import time import os import logging.handlers def logger(appname,roots ...

  5. 通过LDF文件实现日志回滚将数据恢复(转)

    该方法数据库恢复(www.db-recovery.com)思路 1. 创建数据TEST 2. 创建表TEMP_01 3. 在表TEMP_01中插入100条数据 4. 备份现有的数据库 5. 再次向表T ...

  6. [原创]CentOS下Mysql的日志回滚

    一.    环境: a)        Centos-6.5-x64位操作系统. b)        安装mysql.命令:yum install mysql* 二.    配置 a)        ...

  7. python logging 实现的进程安全的文件回滚日志类

    python标准库中的logging模块在记录日志时经常会用到,但在实际使用发现它自带的用于本地日志回滚的类 logging.handlers.RotatingFileHandler 在多进程环境下会 ...

  8. Python 日志输出

    昨天的任务是需要记录各操作的性能数据,所以需要用这种格式来输出日志:{"adb_start_time": 1480040663, "tag_name": &qu ...

  9. python日志模块---logging

    1.将日志打印到屏幕 import logging logging.debug('This is debug message---by liu-ke') logging.info('This is i ...

随机推荐

  1. harbor高可用集群配置

    目录 说明 双主复制 主从同步 双主复制说明 多harbor实例共享后端存储 方案说明 环境说明 配置说明 安装redis和mysql 导入registry数据库 配置harbor 挂载nfs目录 修 ...

  2. Angular的依赖注入(依赖反转)原理说明

    依赖注入(依赖反转)意思是由函数决定要引入什么样的依赖: let mod = angular.module('test',[]); mod.controller('test_c',function($ ...

  3. es6 export 和 export default区别

    相信很多人都使用过export.export default.import,然而它们到底有什么区别呢? 在JavaScript ES6中,export与export default均可用于导出常量.函 ...

  4. Java基础-SSM之mybatis的统计函数和分页查询

    Java基础-SSM之mybatis的统计函数和分页查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. Windows平台上谷歌浏览器损害电池

    From:http://www.cnblogs.com/killerlegend/p/3909208.html Author:KillerLegend Date:2014.8.13 事情是这样的,我的 ...

  6. 给定一个整数,求解该整数最少能用多少个Fib数字相加得到

    一,问题描述 给定一个整数N,求解该整数最少能用多少个Fib数字相加得到 Fib数列,就是如: 1,1,2,3,5,8,13.... Fib数列,满足条件:Fib(n)=Fib(n-1)+Fib(n- ...

  7. [机器学习&数据挖掘]SVM---核函数

    1.核函数概述: 核函数通俗的来说是通过一个函数将向量的低维空间映射到一个高维空间,从而将低维空间的非线性问题转换为高维空间的线性问题来求解,从而再利用之前说的一系列线性支持向量机,常用的核函数如下: ...

  8. 【三分钟视频教程】iOS开发中 Xcode 报 apple-o linker 错误的#解决方案#

      [三分钟视频教程]iOS开发中 Xcode 报 apple-o linker 错误的#解决方案#   同样的道理,指向同一库文件的代码语句如果重复书写,即使重复书写所在的文件名字不同,同样会造成这 ...

  9. 记一道有趣的Twitter面试题

    微信上的“程序员的那些事”想必是很多码农们关注的公众账号之一,我也是其粉丝,每天都会看看里面有没有什么趣事,前段时间“程序员的那些事”分享了一篇博文<我的Twitter技术面试失败了>挺有 ...

  10. js 判断日期大小、是否在时间范围内等处理

    var beginval="2015-09-01";//这个时间可以是日期控件选择的,也可以是其他的任何日期时间 var endval="2015-09-01" ...