#! /usr/bin/env python
# -*- coding:utf-8 -*-
import os
import logging
from logging.handlers import TimedRotatingFileHandler
# 日志级别
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
CURRENT_PATH = os.path.abspath(".")
LOG_PATH = os.path.join(CURRENT_PATH, 'log')
if not os.path.exists(LOG_PATH):
os.makedirs(LOG_PATH)
class LogHandler(logging.Logger):
"""
LogHandler
"""
def __init__(self, name, level=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:
"""
file_name = os.path.join(LOG_PATH, '{name}.log'.format(name=self.name))
# 设置日志回滚, 保存在log目录, 一天保存一个文件, 保留15天
file_handler = TimedRotatingFileHandler(filename=file_name, when='D', interval=1, backupCount=15)
file_handler.suffix = '%Y-%m-%d.log'
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__()
真正完整版按照时间午夜分割的日志系统
#! /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', encoding="utf-8")
# 做个缓存,提升一下日志的速率
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()
网友评论