Last active
August 27, 2020 16:09
-
-
Save bzqyzzld/b400c3d9bb0fa31c3c6c4d286e5acfdf to your computer and use it in GitHub Desktop.
完整的log代码
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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