log_ware.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. #
  4. #
  5. # author: Scott Chen
  6. # date: 2020-01-03
  7. import os
  8. import time
  9. import logging
  10. from logging.handlers import RotatingFileHandler
  11. class LogWare:
  12. def __init__(self):
  13. self.__log_size = 3 * 1024 * 1024
  14. self.__backup_count = 100
  15. self.__log_dir = 'd:/data/logs/'
  16. self.__project_name = 'idcard_reader_web'
  17. self.__log_file_prefix = 'my-log'
  18. self.__formatter = logging.Formatter('[%(asctime)s][%(threadName)s][%(levelname)s][%(filename)s][%(lineno)d] %(message)s', '%Y-%m-%d %H:%M:%S')
  19. self.__log_dir = self.__log_dir + self.__project_name
  20. self.__timestamp = time.strftime("%Y-%m-%d", time.localtime())
  21. self.__log_file_name = '{}_{}.log'.format(self.__log_file_prefix, self.__timestamp)
  22. self.__log_path = os.path.join(self.__log_dir, self.__log_file_name)
  23. if os.path.exists(self.__log_dir) and os.path.isdir(self.__log_dir):
  24. pass
  25. else:
  26. os.makedirs(self.__log_dir)
  27. self.__logger = logging.getLogger("")
  28. # 坑坑! 此处要整体设置 logger level = DEBUG,否则后面在不同的 handler 中设置 level 无效
  29. self.__logger.setLevel(logging.DEBUG)
  30. def get_logger(self):
  31. # 控制台
  32. # 不同 level, 颜色不同
  33. console_handler = logging.StreamHandler()
  34. console_handler.setLevel(logging.DEBUG)
  35. console_handler.setFormatter(self.__formatter)
  36. # 此处通过文件大小截断日志文件,如果想要通过时间截断,可以使用 TimedRotatingFileHandler 这个类
  37. file_handler = logging.handlers.RotatingFileHandler(filename=self.__log_path, mode='a',
  38. maxBytes=self.__log_size,
  39. encoding='utf8', backupCount=self.__backup_count)
  40. file_handler.setFormatter(self.__formatter)
  41. # 日志文件输出
  42. self.__logger.addHandler(file_handler)
  43. self.__logger.addHandler(console_handler)
  44. self.__logger.setLevel(logging.DEBUG)
  45. return self.__logger
  46. # ########## 单元测试 ##########
  47. # 外部使用时,引入
  48. from log_ware import LogWare
  49. logger = LogWare().get_logger()
  50. if __name__ == '__main__':
  51. pass
  52. i = 0
  53. while True:
  54. logger.debug("level debug %s %s %d", 'aaaa', 'bbb', 10)
  55. logger.info("level info")
  56. logger.warning('level warning')
  57. logger.error("level error")
  58. logger.critical('level critical')
  59. i += 1
  60. if i == 10: break