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

  • 时间:
  • 8551人关注

这篇文章主要介绍了Python 限制输出日志的大小方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,另外这篇文章主要知识点是关于Python、限制日志输出、日志大小、Python日志的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

教程详情电子资料
  • 教程类别:Python日志
  • 编辑整理:伊彗云
  • 教程字数:3308字节
  • 阅读时间:大概5分钟
  • 下载本教程(DOC版)
  • Python编程入门经典源代码
  • Python自然语言处理实战:核心技术与算法
  • 虫术Python绝技
  • 趣学Python编程
  • Python pygame五子棋游戏
  • 限制输出日志的大小有多种方法,最优雅的莫过于直接使用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')
    

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

    码农之家
    Python中logging日志的四个等级和使用

    6小时12分钟前回答

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

    1. logging日志的介绍

    在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录;飞机飞行过程中,会有个黑盒子(飞行数据记录器)记录着飞机的飞行过程,那在咱们python程序中想要记录程序在运行时所产生的日志信息,怎么做呢?

    可以使用 logging 这个包来完成

    记录程序日志信息的目的是:
    1. 可以很方便的了解程序的运行情况
    2. 可以分析用户的操作行为、喜好等信息
    3. 方便开发人员检查bug

    2. logging日志级别介绍

    日志等级可以分为5个,从低到高分别是:
    1. DEBUG
     2. INFO
     3. WARNING
     4. ERROR
     5. CRITICAL

    日志等级说明:

    • DEBUG:程序调试bug时使用
    • INFO:程序正常运行时使用
    • WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误
    • ERROR:程序出错误时使用,如:IO操作失败
    • CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使 用
    • 默认的是WARNING等级,当在WARNING或WARNING之上等级的才记录日志信息。
    • 日志等级从低到高的顺序是: DEBUG < INFO < WARNING < ERROR < CRITICAL

    3. logging日志的使用

    在 logging 包中记录日志的方式有两种:

    1.输出到控制台
    2.保存到日志文件

    日志信息输出到控制台的示例代码:

    import logging
    
    logging.debug('这是⼀个debug级别的⽇志信息')
    logging.info('这是⼀个info级别的⽇志信息')
    logging.warning('这是⼀个warning级别的⽇志信息')
    logging.error('这是⼀个error级别的⽇志信息')
    logging.critical('这是⼀个critical级别的⽇志信息')
    
    

    运行结果:

    WARNING:root:这是⼀个warning级别的⽇志信息
    ERROR:root:这是⼀个error级别的⽇志信息
    CRITICAL:root:这是⼀个critical级别的⽇志信息

    说明:
    日志信息只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING

    logging日志等级和输出格式的设置:

    import logging
    # 设置⽇志等级和输出⽇志格式
    logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
    logging.debug('这是⼀个debug级别的⽇志信息')
    
    logging.info('这是⼀个info级别的⽇志信息')
    logging.warning('这是⼀个warning级别的⽇志信息')
    logging.error('这是⼀个error级别的⽇志信息')
    logging.critical('这是⼀个critical级别的⽇志信息')
    
    

    运行结果:

    2019-02-13 20:41:33,080 - hello.py[line:6] - DEBUG: 这是⼀个debug级别的⽇志信息
    2019-02-13 20:41:33,080 - hello.py[line:7] - INFO: 这是⼀个info级别的⽇志信息
    2019-02-13 20:41:33,080 - hello.py[line:8] - WARNING: 这是⼀个warning级别的⽇志信息
    2019-02-13 20:41:33,080 - hello.py[line:9] - ERROR: 这是⼀个error级别的⽇志信息
    2019-02-13 20:41:33,080 - hello.py[line:10] - CRITICAL: 这是⼀个critical级别的⽇志信息

    代码说明:

    level 表示设置的日志等级
    format 表示日志的输出格式, 参数说明:

    • %(levelname)s: 打印日志级别名称
    • %(filename)s: 打印当前执行程序名
    • %(lineno)d: 打印日志的当前行号
    • %(asctime)s: 打印日志的时间
    • %(message)s: 打印日志信息

    日志信息保存到日志文件的示例代码:

    import logging
    logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
    filename="log.txt",
    filemode="w")
    logging.debug('这是⼀个debug级别的⽇志信息')
    logging.info('这是⼀个info级别的⽇志信息')
    logging.warning('这是⼀个warning级别的⽇志信息')
    logging.error('这是⼀个error级别的⽇志信息')
    logging.critical('这是⼀个critical级别的⽇志信息')
    

    运行结果:

    4. logging日志在mini-web项目中应用

    web.py 程序使用logging日志示例:

    1. 程序入口模块设置logging日志的设置

    import socket
    import threading
    import sys
    import framework
    import logging
    # logging⽇志的配置
    logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
    filename="log.txt",
    filemode="w")
    

    2. INFO级别的日志输出,示例代码:

    # 判断是否是动态资源请求
    if request_path.endswith(".html"):
    """这⾥是动态资源请求,把请求信息交给框架处理"""
    logging.info("动态资源请求:" + request_path)
    ...
    else:
    """这⾥是静态资源请求"""
    logging.info("静态资源请求:" + request_path)
    

    3. WARNING级别的日志输出,示例代码:

    # 获取命令⾏参数判断⻓度
    if len(sys.argv) != 2:
    print("执⾏命令如下: python3 xxx.py 9000")
    logging.warning("⽤⼾在命令⾏启动程序参数个数不正确!")
    return
    # 判断端⼝号是否是数字
    if not sys.argv[1].isdigit():
    print("执⾏命令如下: python3 xxx.py 9000")
    logging.warning("⽤⼾在命令⾏启动程序参数不是数字字符串!")
    return
    

    framework.py 程序使用logging日志示例:

    1.ERROR级别的日志输出,示例代码:

    # 处理动态资源请求
    def handle_request(env):
    # 获取动态请求资源路径
    request_path = env["request_path"]
    print("接收到的动态资源请求:", request_path)
    # 遍历路由列表,选择执⾏的函数
    for path, func in route_list:
    if request_path == path:
    result = func()
    return result
    else:
    logging.error("没有设置相应的路由:" + request_path)
    # 没有找到动态资源
    result = not_found()
    return result
    

    说明:
    logging日志配置信息在程序入口模块设置一次,整个程序都可以生效。
    logging.basicConfig 表示 logging 日志配置操作

    5. 小结

    记录python程序中日志信息使用 logging 包来完成
    logging日志等级有5个:
    1. DEBUG
    2. INFO
    3. WARNING
    4. ERROR
    5. CRITICAL

    打印(记录)日志的函数有5个:
    1. logging.debug函数, 表示: 打印(记录)DEBUG级别的日志信息
    2. logging.info函数, 表示: 打印(记录)INFO级别的日志信息
    3. logging.warning函数, 表示: 打印(记录)WARNING级别的日志信息
    4. logging.error函数, 表示: 打印(记录)ERROR级别的日志信息
    5. logging.critical函数, 表示: 打印(记录)CRITICAL级别的日志信息

    到此这篇关于Python中logging日志的四个等级和使用的文章就介绍到这了,更多相关Python logging日志内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!

    展开阅读

    上一篇:python实现可视化的MD5、sha256哈希加密小工具

    下一篇:PyQt5无边框后窗口的移动问题解决方案

    相关内容

    学习笔记

    34小时49分钟前回答

    python logging 日志轮转文件不删除问题的解决方法

    前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据。 分析 项目使用了 logging 的 TimedRotatingFileHandler : #!/user/bin/env python# -*- coding: utf-8 -*-import loggingfrom logging.handlers import TimedRotatingFileHandlerlog = logging.getLogger()file_name = "./test.log"logformatter = logging.Formatter('%(asctime)s [%(levelname)s]|%(message)s')loghandle = TimedRotatingFileHandler(file_name, 'midnight', 1, 2)loghandle.setFormatter(logformatter)loghandle.suffix = '%Y%m%d'log.addHandler(loghandle)log.setLevel(logging.DEBUG)log.debug("init successful") 参考 python logging 的官方文档: https://docs.python.org/2/library/logging.html 查看其……

    45小时26分钟前回答

    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/2018 12:37:44] "GET /apple-touch-icon-120x120-precomposed.png HTTP/1.1" 404 -61.148.245.145 - - [05/Feb/2018 12:37:44] "GET /apple-touch-icon-120x120.png HTTP/1.1" 404 -61.148.245.145 - - [05/Feb/2018 12:37:45] "GET /apple-touch-icon-precomposed.png HTTP/1.1" 404 -61.148.245.145 - - [05/Feb/2018 12:37:45] "GET /apple-touch-icon.png HTTP/1.1" 404 -61.148.245.145 - - [05/Feb/2018 12:37:45] "GET /static/favicon.ico HTTP/1.1" 200 -101.226.33.218 - - [05/Feb/2018 13:07:39] "GET / HTT……