1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #!/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
|