我是python的新手,但对python logger非常不满。看起来没有可靠的日志记录实现。我正在努力实现以下目标:
我是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')