logger.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # -*- encoding: utf-8 -*-
  2. '''
  3. @File : logger.py
  4. @Time : 2022/05/10 10:54:26
  5. @Author : Zhangziheng
  6. '''
  7. import datetime
  8. import inspect
  9. import io
  10. import logging
  11. import os
  12. import platform
  13. # == 判断日志文件夹是否存在 不存在则创建 ==
  14. if not os.path.exists('log'):
  15. os.mkdir('log', 0o775)
  16. def creatLogger(name):
  17. """创建logger
  18. Args:
  19. name (string): 打印者的名称
  20. Returns:
  21. logger
  22. """
  23. datefmt = '%Y-%m-%d %H:%M:%S'
  24. logging.basicConfig(
  25. level=logging.INFO,
  26. datefmt=datefmt,
  27. format='[%(asctime)s] [%(process)d] [%(levelname)s] :: %(message)s')
  28. return logging.getLogger(name)
  29. class Logger(object):
  30. level_relations = {
  31. 'debug': logging.DEBUG,
  32. 'info': logging.INFO,
  33. 'warning': logging.WARNING,
  34. 'error': logging.ERROR,
  35. 'crit': logging.CRITICAL
  36. } # 日志级别关系映射
  37. def __init__(
  38. self,
  39. filename,
  40. level='info',
  41. fmt='%(asctime)s - %(levelname)s: %(message)s'
  42. ):
  43. self.filename = filename
  44. self.level = level
  45. self.fmt = fmt
  46. self.logger = logging.getLogger(filename)
  47. self.logger.setLevel(self.level_relations.get(level)) # 设置日志级别
  48. self._set_handler()
  49. def _set_handler(self):
  50. self.current_date = datetime.datetime.now().strftime('%Y%m%d') # 更新当前的日期
  51. filename_with_date = f"{self.filename}_{self.current_date}.log"
  52. sh = logging.StreamHandler() # 往屏幕上输出
  53. format_str = logging.Formatter(self.fmt) # 设置日志格式
  54. sh.setFormatter(format_str) # 设置屏幕上显示的格式
  55. th = logging.FileHandler(filename_with_date, encoding='utf-8')
  56. th.setFormatter(format_str) # 设置文件里写入的格式
  57. if self.logger.hasHandlers():
  58. self.logger.handlers.clear()
  59. self.logger.addHandler(sh) # 把对象加到logger里
  60. self.logger.addHandler(th)
  61. def get_stream_handler(self):
  62. """返回一个设置了格式和级别的日志处理器,并且这个处理器会将日志输出到一个字符串流中"""
  63. stream = io.StringIO()
  64. sh = logging.StreamHandler(stream) # 往字符串流中输出
  65. format_str = logging.Formatter(self.fmt) # 设置日志格式
  66. sh.setFormatter(format_str) # 设置字符串流中显示的格式
  67. sh.setLevel(self.level_relations.get(self.level)) # 设置日志级别
  68. return sh, stream
  69. def debug(self, message):
  70. self._check_and_set_handler()
  71. self._log('debug', message)
  72. def info(self, message):
  73. self._check_and_set_handler()
  74. self._log('info', message)
  75. def warning(self, message):
  76. self._check_and_set_handler()
  77. self._log('warning', message)
  78. def error(self, message):
  79. self._check_and_set_handler()
  80. self._log('error', message)
  81. def crit(self, message):
  82. self._check_and_set_handler()
  83. self._log('critical', message)
  84. def _log(self, level, message):
  85. caller_frame = inspect.stack()[2]
  86. file_name = caller_frame.filename
  87. line_no = caller_frame.lineno
  88. func_name = caller_frame.function
  89. self.logger.log(
  90. self.level_relations[level], f'{file_name}[line:{line_no}] - {func_name}: {message}')
  91. def _check_and_set_handler(self):
  92. current_date = datetime.datetime.now().strftime('%Y%m%d')
  93. if current_date != self.current_date: # 检查当前的日期是否与FileHandler的日期一致
  94. self._set_handler()
  95. class bbLoger(object):
  96. def __init__(self, name, errorName):
  97. self.logger = creatLogger(name)
  98. # self.errorLogger = Logger(errorName)
  99. self._ggg_Uncaught_exception = Logger(errorName)
  100. def info(self, messgae):
  101. self.logger.info(messgae)
  102. def waring(self, messgae):
  103. self.logger.warning(messgae)
  104. def error(self, messgae):
  105. self.logger.error(messgae)
  106. # self.errorLogger.logger.error(messgae)
  107. self._ggg_Uncaught_exception .error(messgae)
  108. def warning(self, messgae):
  109. self.logger.warning(messgae)
  110. # self.errorLogger.logger.warning(messgae)
  111. def debug(self, message):
  112. self.logger.debug(message)
  113. # # 加入系统判断 以防日志存储位置不正确
  114. # if platform.system().lower() in ["linux", "darwin"]:
  115. # logger = creatLogger("log/zwsj.log")
  116. # _ggg_Uncaught_exception = creatLogger("log/Uncaught_exception.log")
  117. # baseLogger = Logger("log/backTask")
  118. # else:
  119. # logger = creatLogger("log\\zwsj.log")
  120. # _ggg_Uncaught_exception = creatLogger("log\\Uncaught_exception.log")
  121. # baseLogger = Logger("log\\backTask")
  122. if platform.system().lower() in ["linux", "darwin"]:
  123. name = "log/zwsj.log"
  124. errorName = "log/Uncaught_exception.log"
  125. else:
  126. name = "log\\zwsj.log"
  127. errorName = "log\\Uncaught_exception.log"
  128. logger = bbLoger(name, errorName)
  129. _ggg_Uncaught_exception = bbLoger(name, errorName)