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

我是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')


版权声明:本文为weixin_39814369原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。