#!/usr/bin/python # -*- coding: UTF-8 -*- # # # author: Scott Chen # date: 2020-01-03 import os import time import logging from logging.handlers import RotatingFileHandler class LogWare: def __init__(self): # 每日志文件大小KB self.__log_size = 3 * 1024 * 1024 # 日志备份数量 self.__backup_count = 100 # 日志备份目录 self.__log_dir_half = 'd:/data/log/' # 日志备份使用的项目名称 self.__project_name = 'cnn-captcha' self.__log_dir = self.get_log_dir() # 是否存在目录,不存在就创建 mkdir_with_lambda = lambda x: os.makedirs(x) if not os.path.exists(x) else True mkdir_with_lambda(self.__log_dir) # 日志文件名前缀部分,全文件名为 名称_四位年+两位月+2位日.log # 备份日志文件名 为日志名后面加顺序数据 self.__log_file_prefix = 'my-log' # 日志打印格式 self.__formatter = logging.Formatter( '[%(asctime)s][%(threadName)s][%(levelname)s][%(filename)s][%(lineno)d] %(message)s', '%Y-%m-%d %H:%M:%S') self.__timestamp = time.strftime("%Y-%m-%d", time.localtime()) self.__log_file_name = '{}_{}.log'.format(self.__log_file_prefix, self.__timestamp) self.__log_path = os.path.join(self.__log_dir, self.__log_file_name) if os.path.exists(self.__log_dir) and os.path.isdir(self.__log_dir): pass else: os.makedirs(self.__log_dir) self.__logger = logging.getLogger(self.__log_file_name) # 坑坑! 此处要整体设置 logger level = DEBUG,否则后面在不同的 handler 中设置 level 无效 self.__logger.setLevel(logging.DEBUG) def get_logger(self): # 控制台 console_handler = logging.StreamHandler() # console_handler.setLevel(logging.DEBUG) console_handler.setFormatter(self.__formatter) # 此处通过文件大小截断日志文件,如果想要通过时间截断,可以使用 TimedRotatingFileHandler 这个类 file_handler = logging.handlers.RotatingFileHandler(filename=self.__log_path, mode='a', maxBytes=self.__log_size, encoding='utf8', backupCount=self.__backup_count) file_handler.setFormatter(self.__formatter) # 日志文件输出 self.__logger.addHandler(file_handler) self.__logger.addHandler(console_handler) self.__logger.setLevel(logging.DEBUG) return self.__logger def get_log_dir(self): log_dir = os.path.join(self.__log_dir_half, self.__project_name) return log_dir # ########## 单元测试 ########## # 外部使用时,引入 from log_ware import LogWare logger = LogWare().get_logger() if __name__ == '__main__': pass i = 0 while True: logger.debug("level debug %s %s %d", 'aaaa', 'bbb', 10) logger.info("level info") logger.warning('level warning') logger.error("level error") logger.critical('level critical') i += 1 if i == 10: break