1
0

log_ware.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. # 每日志文件大小KB
  14. self.__log_size = 3 * 1024 * 1024
  15. # 日志备份数量
  16. self.__backup_count = 100
  17. # 日志备份目录
  18. self.__log_dir_half = 'd:/data/log/'
  19. # 日志备份使用的项目名称
  20. self.__project_name = 'cnn-captcha'
  21. self.__log_dir = self.get_log_dir()
  22. # 是否存在目录,不存在就创建
  23. mkdir_with_lambda = lambda x: os.makedirs(x) if not os.path.exists(x) else True
  24. mkdir_with_lambda(self.__log_dir)
  25. # 日志文件名前缀部分,全文件名为 名称_四位年+两位月+2位日.log
  26. # 备份日志文件名 为日志名后面加顺序数据
  27. self.__log_file_prefix = 'my-log'
  28. # 日志打印格式
  29. self.__formatter = logging.Formatter(
  30. '[%(asctime)s][%(threadName)s][%(levelname)s][%(filename)s][%(lineno)d] %(message)s', '%Y-%m-%d %H:%M:%S')
  31. self.__timestamp = time.strftime("%Y-%m-%d", time.localtime())
  32. self.__log_file_name = '{}_{}.log'.format(self.__log_file_prefix, self.__timestamp)
  33. self.__log_path = os.path.join(self.__log_dir, self.__log_file_name)
  34. if os.path.exists(self.__log_dir) and os.path.isdir(self.__log_dir):
  35. pass
  36. else:
  37. os.makedirs(self.__log_dir)
  38. self.__logger = logging.getLogger(self.__log_file_name)
  39. # 坑坑! 此处要整体设置 logger level = DEBUG,否则后面在不同的 handler 中设置 level 无效
  40. self.__logger.setLevel(logging.DEBUG)
  41. def get_logger(self):
  42. # 控制台
  43. console_handler = logging.StreamHandler()
  44. # console_handler.setLevel(logging.DEBUG)
  45. console_handler.setFormatter(self.__formatter)
  46. # 此处通过文件大小截断日志文件,如果想要通过时间截断,可以使用 TimedRotatingFileHandler 这个类
  47. file_handler = logging.handlers.RotatingFileHandler(filename=self.__log_path, mode='a',
  48. maxBytes=self.__log_size,
  49. encoding='utf8', backupCount=self.__backup_count)
  50. file_handler.setFormatter(self.__formatter)
  51. # 日志文件输出
  52. self.__logger.addHandler(file_handler)
  53. self.__logger.addHandler(console_handler)
  54. self.__logger.setLevel(logging.DEBUG)
  55. return self.__logger
  56. def get_log_dir(self):
  57. log_dir = os.path.join(self.__log_dir_half, self.__project_name)
  58. return log_dir
  59. # ########## 单元测试 ##########
  60. # 外部使用时,引入
  61. from log_ware import LogWare
  62. logger = LogWare().get_logger()
  63. if __name__ == '__main__':
  64. pass
  65. i = 0
  66. while True:
  67. logger.debug("level debug %s %s %d", 'aaaa', 'bbb', 10)
  68. logger.info("level info")
  69. logger.warning('level warning')
  70. logger.error("level error")
  71. logger.critical('level critical')
  72. i += 1
  73. if i == 10: break