自定义logging, 按天进行分隔, 并自动删除旧日志.

业务背景:

        我现在在做一个flask项目, 里面有一个后台常驻进程, 在后台进程中通过进程池执行任务, 并将任务执行信息通过日志的情况,进行记录. 并将日志按天进行分隔, 并自动删除旧日志.

心路历程:

        1. 刚开始使用的是第一版, 就是直接使用FileHandler创建, 然后就在后台进程调用loger使用,本来只想记录后台进程中的日志, 好家伙, 买一赠一啊, 把Flask项目中启动信息,接口请求信息一起记录了, 惊喜不惊喜, 意外不意外!!!!!!!

        2. 我刚开始也挺惊喜的, 这不,Flask项目的日志不用我写了()

            原因: 在logging.getLogger()是没有定义日志名., 使用的是默认的日志记录器, 而在默认情况下,Flask 会使用 app.logger 配置的日志记录器,也就是 Flask 默认的日志记录器。                        

        3. 但是当我需要对后台进程的日志进行分隔的时候,出问题了.一直配置失败,经常提示"permiss异常, 显示有其他的程序正在操作xxx.log"

        4. 这不就是Flask主进程和后台进程(进程池)同时操作了xxx.log文件么!!!!!!!!

        5. 根据4中的问题,这出来了第二, 在后台进程中因为使用了进程池, 所以在后台进程中启动了一个子进程专门记录日志, 而进程之间使用multiprocessing.Queue()进程通信(也就是传递日志信息)

import os
import re
import logging
from pathlib import Path
from logging.handlers import TimedRotatingFileHandler
import sys

# 定义日志输出路径
PATH = os.path.join(Path(__file__).resolve().parent, "logs/")
FMT = '%(asctime)s - %(levelname)s - %(message)s'

if not os.path.exists(PATH):
    os.mkdir(PATH)

class MyLog():
    def __int__(self):
        self.loger = logging.getLogger()
        self.loger.addHandler(self.get_file_handler())
        
        self.loger.addHandler(self.get_console_handler())
        self.loger.setLevel(logging.INFO)
        
    def get_file_handler(self):
        file_hander = logging.FileHandler("app.log", encoding="utf-8")
       

        file_handler.setFormatter(self.format)
        
        return file_handler
    
    def get_console_handler(self):
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setFormatter(self.format)
        return console_handler
loger = Mylog().loger

第二版

import os
import re
import logging
from pathlib import Path
from logging.handlers import TimedRotatingFileHandler
import sys
​
# 定义日志输出路径
PATH = os.path.join(Path(__file__).resolve().parent, "logs/")
FMT = '%(asctime)s - %(levelname)s - %(message)s'
​
if not os.path.exists(PATH):
    os.mkdir(PATH)
​
class MyLog():
    def __int__(self,
                log_name: str,
                filename: str,
                c_mode: bool = True,
                level: str = "INFO",
                **kwargs
                ):
        fmt = kwargs.get("fmt". FMT)
        path = kwargs.get("path", PATH)
        
        self.when = kwargs.get("when", "D")
        self.backupCount = kwargs.get("backupCount", 10)
        
        self.filename = os.path.join(PATH, filename)
        self.format = logging.Formatter(fmt)
        
        self.loger = logging.getLogger(log_name)
        self.loger.addHandler(self.get_file_handler())
        if c_mode:
            self.loger.addHandler(self.get_console_handler())
        self.loger.setLevel(getattr(logging, level, 20))  # 20 : 表示 logging.INFO
        
    def get_file_handler(self):
        # 第一版
        # file_hander = logging.FileHandler("app.log", encoding="utf-8")
        # 第二版
        file_handler = TimedRotatingFileHandler(
            filename=self.filename,
            when=self.when,  # 表示以天为更新点,每天生成一个文件
            interval=1,
            backupCount=self.backupCount,
            encoding="utf-8"
        )
        # suffix he extMatch 可以参考源码
        file_handler.suffix += ".log"  # suffix设置,会生成文件名为{filename}.2020-02-25.log
        # file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$")
​
        file_handler.setFormatter(self.format)
        
        return file_handler
    
    def get_console_handler(self):
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setFormatter(self.format)
        return console_handler


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值