Python 如何限制输出日志的大小

限制输出日志的大小有多种方法,最优雅的莫过于直接使用rotate机制,这种机制广泛存在于各种编程语言,Python也不例外。其次,还可以使用mount挂载一个文件,作为日志存储的位置,因为文件大小是有限的,所以日志的大小也被限制。还有可以用ulimit。

RotatingFileHandler

RotatingFileHandler是logging.handler的一种,在python docs中,这个类的构造函数示例用法如下

class logging.handlers.RotatingFileHandler(filename, mode=‘a', maxBytes=0, backupCount=0, encoding=None, delay=False)

参数

filename 输出的文件名,如果使用Python 3.6或者更新版本的Python,filename可以是一个Path对象,Path对象可以让你更优雅地操作文件路径,它是Python新增的特性。

mode 有"w"和"a",如果是w,那么每次输出日志,都会覆盖之前已经存在的日志,从第一行开始输出,如果是a,会保留之前的日志,在之前的日志后输出。

maxBytes 日志最大的大小,单位是字节

backupCount 如果日志大小达到maxBytes,会将旧日志加上.1或.2这样的后缀,与filename区分,并在新的filename文件第一行开始输出。如果为1,则有最多有一个旧日志的备份。

encoding 字符编码,常用的有utf-8

import logging
from logging.handlers import RotatingFileHandler
log = logging.getLogger()
handler = RotatingFileHandler("test", "a", 4096, 2, "utf-8")
log.addHandler(handler)
#更高级的logging特性
log.setLevel(logging.INFO) #设置过滤的日志等级
formatter = logging.Formatter("%(asctime)s %(levelname)s: %(message)")
log.setFormatter(formatter) #设置日志输出的格式

Mount

先创建文件,并格式化成ext4文件系统

dd if=/dev/zero of=./logfs bs=1M count=4
mkfs.ext4 ./logfs
mkdir log
sudo mount -t ext4 ./logfs ./log
python test.py 2>./log/test.log

需要注意的是,这种方法可能有权限问题,如果python程序权限不够,需要更改挂载后log目录的权限,使用sudo chmod 777 -R log

补充:

python控制日志级别输出,可进行全局限流,可控制控制台输出,可用于线上配置,进行日志的简单记录

# coding=utf-8
import logging
import datetime
import os
CONSOLE = True
LEVEL = "DEBUG"
# log/2020-09/2020-09-27_APPLICATION_NAME.log
APPLICATION_NAME = "APPLICATION_NAME"
# 只生成GBK的日志文件
class RecordLog:
 def __init__(self):
  """
  1、控制日志是否在控制台中打印
  2、控制日志输出的级别
  """
  # 设置是否控制台打印
  self._console = CONSOLE
  # 等级字典
  self._level_dict = {'DEBUG':1,'INFO':2,'WARNING':3,'ERROR':4,'CRITICAL':5}
  # 设置当前支持的日志等级
  self._current_level_num = self._level_dict[LEVEL]
 def get_log_file_name(self,):
  """
  创建日志文件夹,创建或调用日志文件,日志存储
  :return: log/log_folder(月份)/log_file(每天的log)
  """
  now = str(datetime.datetime.now())
  log_folder = now[:7]
  log_file = now[:10] + "_" + APPLICATION_NAME + ".log"
  if os.path.exists("log/" + log_folder):
   pass
  else:
   os.makedirs("log/" + log_folder)
  return "log/" + log_folder + "/" + log_file
 def log_content(self, content='开始记录',level="DEBUG"):
  """
  记录日志
  :param content: 记录的内容
  :param level: DEBUG, INFO, WARNING, ERROR, CRITICAL
  :return:
  """
  LOG_FILE_NAME = self.get_log_file_name()
  now1 = datetime.datetime.now()
  now_date = now1.strftime("%Y-%m-%d-%H:%M:%S")
  text = " %s %s -- %s" % (level, now_date, content)
  if level in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']:
   level_num = self._level_dict[level]
   # 控制台输出
   if self._console:
    print(text)
   logger = logging.getLogger()
   fh = logging.FileHandler(filename=LOG_FILE_NAME, encoding="utf-8", mode="a")
   # formatter = logging.Formatter("%(asctime)s - %(name)s-%(levelname)s %(message)s")
   # fh.setFormatter(formatter)
   logger.addHandler(fh)
   # 设置日志等级
   if "DEBUG" == level and level_num >= self._current_level_num:
    logger.setLevel(logging.DEBUG)
   elif "INFO" == level and level_num >= self._current_level_num:
    logger.setLevel(logging.INFO)
   elif "WARNING" == level and level_num >= self._current_level_num:
    logger.setLevel(logging.WARNING)
   elif "ERROR" == level and level_num >= self._current_level_num:
    logger.setLevel(logging.ERROR)
   else:
    logger.setLevel(logging.CRITICAL)
   logger.info(text)
  else:
   raise Exception('日志等级传参错误: %s ; 正确格式为:DEBUG, INFO, WARNING, ERROR, CRITICAL'%level)
if __name__ == '__main__':
 #
 log = RecordLog()
 log.log_content(level='DEBUG')

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

(0)

相关推荐

  • python标准日志模块logging的使用方法

    最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下.python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件,只要这样使用: 复制代码 代码如下: import logging# 创建一个loggerlogger = logging.getLogger('mylogger')logger.setLevel(logging.DEBUG)# 创建一个ha

  • Python的log日志功能及设置方法

    引入:Python中有个logging模块可以完成相关信息的记录,在debug时用它往往事半功倍 一.日志级别(从低到高): DEBUG :详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如.磁盘空间低").这个软件还能按预期工作. ERROR:更严重的问题,软件没能执行一些功能 CRITICAL :一个严重的错误,这表明程序本身可能无法继续运行 注:这5个等级,也分别对应5种打日志的方法:

  • Python中logging日志的四个等级和使用

    1. logging日志的介绍 在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录:飞机飞行过程中,会有个黑盒子(飞行数据记录器)记录着飞机的飞行过程,那在咱们python程序中想要记录程序在运行时所产生的日志信息,怎么做呢? 可以使用 logging 这个包来完成 记录程序日志信息的目的是: 1. 可以很方便的了解程序的运行情况 2. 可以分析用户的操作行为.喜好等信息 3. 方便开发人员检查bug 2. logging日志级别介绍 日志等级可以分为5个,从低到高分别是: 1. DE

  • 详解python日志输出使用配置文件格式

    python脚本日志输出使用配置文件的形式,不需要在每个脚本里面配置日志. 需求简述: 如我要写2个脚本(a.py和b.py),a.py日志输出到/var/log/a.log,b.py日志输出到/var/log/b.log,并且日志按日期切割.如果每个脚本都去配置一遍日志的话,浪费时间也不利于后期维护. 现在我要使用配置文件的格式去统一管理python脚本的代码日志输出,后续所有python脚本日志都在这个配置文件里面配置,脚本读取.方便后续维护和增加脚本的可读性. 需求实现: 我配置文件路径及

  • Python 如何限制输出日志的大小

    限制输出日志的大小有多种方法,最优雅的莫过于直接使用rotate机制,这种机制广泛存在于各种编程语言,Python也不例外.其次,还可以使用mount挂载一个文件,作为日志存储的位置,因为文件大小是有限的,所以日志的大小也被限制.还有可以用ulimit. RotatingFileHandler RotatingFileHandler是logging.handler的一种,在python docs中,这个类的构造函数示例用法如下 class logging.handlers.RotatingFil

  • python 实现logging动态变更输出日志文件名

    python作为一门非常容易上手的脚本语言,日志输出更是简单,logging模块,简单的设置配置和属性,就能实现到控制台输出日志,在basicConfig()设置文件名,就能够将日志信息写入文件,简直是简单到不能再简单. 最近在项目中就遇到一个日志问题,使用python编写的服务程序一直运行,连续处理一些任务,每个任务的关键信息都需要输出到文件中,便于维护人员查看,可是对于简单实用logging来说,日志写入文件非常简单,由于服务程序连续运行,一直向一个文件记录日志信息有些不妥,有常识的开发人员

  • Python同时向控制台和文件输出日志logging的方法

    本文实例讲述了Python同时向控制台和文件输出日志logging的方法.分享给大家供大家参考.具体如下: python提供了非常方便的日志模块,可实现同时向控制台和文件输出日志的功能. #-*- coding:utf-8 -*- import logging # 配置日志信息 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt

  • python将print输出的信息保留到日志文件中

    具体代码如下所示: import sys import os import sys import io import datetime def create_detail_day(): ''' :return: ''' # 年-月-日 # daytime = datetime.datetime.now().strftime('day'+'%Y-%m-%d') # 年_月_日 daytime = datetime.datetime.now().strftime('day'+'%Y_%m_%d')

  • Python常用模块logging——日志输出功能(示例代码)

    用途 logging模块是Python的内置模块,主要用于输出运行日志,可以灵活配置输出日志的各项信息. 基本使用方法 logging.basicConfig(level=logging.DEBUG, format='levelname:%(levelname)s filename: %(filename)s ' 'outputNumber: [%(lineno)d] thread: %(threadName)s output msg: %(message)s' ' - %(asctime)s'

  • 解决Python logging模块无法正常输出日志的问题

    废话少说,先上代码 File:logger.conf [formatters] keys=default [formatter_default] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s class=logging.Formatter [handlers] keys=console, error_file [handler_console] class=logging.StreamHandler formatter=d

  • 基于Python实现文件大小输出

    在数据库中存储时,使用 Bytes 更精确,可扩展性和灵活性都很高. 输出时,需要做一些适配. 1. 注意事项与测试代码 1.需要考虑 sizeInBytes 为 None 的场景. 2.除以 1024.0 而非 1024,避免丢失精度. 实现的函数为 getSizeInMb(sizeInBytes),通用的测试代码为 def getSizeInMb(sizeInBytes): return 0 def test(sizeInBytes): print '%s -> %s' % (sizeInB

  • Linux shell脚本输出日志笔记整理(必看篇)

    1.日志方法简介: #日志名称 log="./upgrade.log" #操作日志存放路径 fsize=2000000 #如果日志大小超过上限,则保存旧日志,重新生成日志文件 exec 2>>$log #如果执行过程中有错误信息均输出到日志文件中 #日志函数 #参数 #参数一,级别,INFO ,WARN,ERROR #参数二,内容 #返回值 function zc_log() { #判断格式 if [ 2 -gt $# ] then echo "parameter

  • Python实现的摇骰子猜大小功能小游戏示例

    本文实例讲述了Python实现的摇骰子猜大小功能小游戏.分享给大家供大家参考,具体如下: 最近学习Python的随机数,逻辑判断,循环的用法,就想找一些练习题,比如小游戏猜大小,程序思路如下: 开发环境:python2.7 , 附上源代码如下: 摇骰子的函数,这个函数其实并不需要传任何参数,调用后会返回三个点数结果的列表. import random def roll_dice(numbers=3,points=None): print ('<<<<< ROLL THE DI

  • Python实现从log日志中提取ip的方法【正则提取】

    本文实例讲述了Python实现从log日志中提取ip的方法.分享给大家供大家参考,具体如下: log日志内容如下(myjob.log): 124.90.53.68 - - [05/Feb/2018 11:37:07] "GET /favicon.ico HTTP/1.1" 404 - 61.148.245.145 - - [05/Feb/2018 12:37:44] "GET / HTTP/1.1" 200 - 61.148.245.145 - - [05/Feb/

随机推荐