Python非阻塞异步日志压缩和单独的文件轮换

时间:2017-12-30 02:18:44

标签: python logging

我是python的新手,但对python logger非常不满。看起来没有可靠的日志记录实现。我正在努力实现以下目标:

  1. 按小时将文件记录并旋转到单独的目录和文件,例如2017 / 12/28 / - 该目录中的24小时文件.log
  2. 自动Gzip文件
  3. 非阻塞,异步记录器。 (延迟非常重要)
  4. 我是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')
    

0 个答案:

没有答案