python 异步写日志_Python无阻塞异步日志压缩和独立文件旋转

这篇博客探讨了如何使用Python的logging模块创建一个异步、非阻塞的日志记录系统。作者面临的问题是如何每小时自动将日志文件滚动到指定目录,并进行Gzip压缩。他们实现了一个GZipRotator类来处理文件的压缩和移动,并使用TimedRotatingFileHandler进行定时旋转。博客中还展示了如何设置监听器以确保日志处理的非阻塞特性。
摘要由CSDN通过智能技术生成

我是python新手,但对python logger感到非常不安。看起来没有可靠的日志记录实现。我正在努力实现以下目标:每小时记录并旋转文件到单独的目录和文件中,例如2017/12/28/-24小时文件。登录该目录

Gzip文件自动

非阻塞、异步记录器。(延迟非常重要)

我对python还不熟悉,而且我已经设法开发出的一些东西似乎不是一条正确的道路。如果你认为我的解决方案不错的话,你能推荐一个更好的方法或者重构我的解决方案吗。在import logging

import queue

import gzip

import os

from logging.handlers import QueueHandler, QueueListener, TimedRotatingFileHandler

class GZipRotator:

def __call__(self, source, dest):

dir_parts = dest.split('.log.')

date_dir = dir_parts[1].replace('-', '/').replace('_', '/')

new_dir = os.path.join(dir_parts[0], date_dir)

if not os.path.exists(new_dir):

os.makedirs(new_dir)

new_full_file_name = os.path.join(new_dir, dest.split('/')[-1])

os.rename(source, new_full_file_name)

f_in = open(new_full_file_name, 'rb')

f_out = gzip.open("%s.gz" % new_full_file_name, 'wb')

f_out.writelines(f_in)

f_out.close()

f_in.close()

os.remove(new_full_file_name)

def setup_logger(log_name, level=logging.INFO):

formatter = logging.Formatter('%(asctime)s %(message)s')

que = queue.Queue(-1) # no limit on size

queue_handler = QueueHandler(que)

log_file_dir = os.path.join('logs', log_name)

__create_log_dir(log_file_dir)

handler = TimedRotatingFileHandler("%s.log" % log_file_dir, when='h', interval=1, delay=False, utc=True)

handler.setFormatter(formatter)

handler.rotator = GZipRotator()

listener = QueueListener(que, handler)

root = logging.getLogger(log_name)

root.addHandler(queue_handler)

root.setLevel(level)

listener.start()

def __create_log_dir(dir):

if not os.path.exists(dir):

os.makedirs(dir)

setup_logger('orders')

logger = logging.getLogger('orders')

while True:

logger.info('123')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值