#!/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): self.__log_size = 3 * 1024 * 1024 self.__backup_count = 100 self.__log_dir = 'd:/data/logs/' self.__project_name = 'idcard_reader_web' 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.__log_dir = self.__log_dir + self.__project_name 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("") # 坑坑! 此处要整体设置 logger level = DEBUG,否则后面在不同的 handler 中设置 level 无效 self.__logger.setLevel(logging.DEBUG) def get_logger(self): # 控制台 # 不同 level, 颜色不同 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 # ########## 单元测试 ########## # 外部使用时,引入 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