Skip to content

Instantly share code, notes, and snippets.

@bzqyzzld
Last active August 27, 2020 16:09
Show Gist options
  • Save bzqyzzld/b400c3d9bb0fa31c3c6c4d286e5acfdf to your computer and use it in GitHub Desktop.
Save bzqyzzld/b400c3d9bb0fa31c3c6c4d286e5acfdf to your computer and use it in GitHub Desktop.
完整的log代码
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import os
from datetime import datetime
import time
import logging
from logging.handlers import BaseRotatingHandler
# 选择log需要存的地址
base_dir = "/root/log"
class LogHandler(logging.Logger):
"""
LogHandler
"""
def __init__(self, name, level=logging.DEBUG, stream=True, file=True):
self.name = name
self.level = level
logging.Logger.__init__(self, self.name, level=level)
if stream:
self.__setStreamHandler__()
if file:
self.__setFileHandler__()
def __setFileHandler__(self, level=None):
"""
set file handler
:param level:
:return:
"""
log_dir = os.path.join(base_dir, self.name)
if not os.path.exists(log_dir):
os.makedirs(log_dir)
file_handler = DailyRotatingFileHandler(log_dir)
if not level:
file_handler.setLevel(self.level)
else:
file_handler.setLevel(level)
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s: %(message)s')
file_handler.setFormatter(formatter)
self.file_handler = file_handler
self.addHandler(file_handler)
def __setStreamHandler__(self, level=None):
"""
set stream handler
:param level:
:return:
"""
stream_handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s: %(message)s')
stream_handler.setFormatter(formatter)
if not level:
stream_handler.setLevel(self.level)
else:
stream_handler.setLevel(level)
self.addHandler(stream_handler)
def resetName(self, name):
"""
reset name
:param name:
:return:
"""
self.name = name
self.removeHandler(self.file_handler)
self.__setFileHandler__()
class DailyRotatingFileHandler(BaseRotatingHandler):
def __init__(self, path):
self.log_dir = path
filename = self.current_log_file()
super().__init__(filename, 'a')
# 做个缓存,提升一下日志的速率
self.last_check = None
def current_log_file(self, create_dir=False):
date = datetime.now().strftime('%Y-%m-%d')
import os
log_name = date + ".log"
log_path = os.path.join(self.log_dir, log_name)
return log_path
def shouldRollover(self, record):
now = time.monotonic()
# 60s 内只检查一次
if self.last_check is None or now - self.last_check > 60:
self.last_check = now
log_file = self.current_log_file()
if os.path.isfile(log_file):
return False
else:
return True
return False
def doRollover(self):
if self.stream:
self.stream.close()
self.stream = None
filename = self.current_log_file(create_dir=True)
self.baseFilename = filename
if not self.delay:
self.stream = self._open()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment