logHandler.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # -*- coding: utf-8 -*-
  2. """
  3. -------------------------------------------------
  4. File Name: LogHandler.py
  5. Description : 日志操作模块
  6. Author : JHao
  7. date: 2017/3/6
  8. -------------------------------------------------
  9. Change Activity:
  10. 2017/03/06: log handler
  11. 2017/09/21: 屏幕输出/文件输出 可选(默认屏幕和文件均输出)
  12. 2020/07/13: Windows下TimedRotatingFileHandler线程不安全, 不再使用
  13. -------------------------------------------------
  14. """
  15. __author__ = 'JHao'
  16. import os
  17. import logging
  18. import platform
  19. from logging.handlers import TimedRotatingFileHandler
  20. # 日志级别
  21. CRITICAL = 50
  22. FATAL = CRITICAL
  23. ERROR = 40
  24. WARNING = 30
  25. WARN = WARNING
  26. INFO = 20
  27. DEBUG = 10
  28. NOTSET = 0
  29. CURRENT_PATH = os.path.dirname(os.path.abspath(__file__))
  30. ROOT_PATH = os.path.join(CURRENT_PATH, os.pardir)
  31. LOG_PATH = os.path.join(ROOT_PATH, 'log')
  32. if not os.path.exists(LOG_PATH):
  33. try:
  34. os.mkdir(LOG_PATH)
  35. except FileExistsError:
  36. pass
  37. class LogHandler(logging.Logger):
  38. """
  39. LogHandler
  40. """
  41. def __init__(self, name, level=DEBUG, stream=True, file=True):
  42. self.name = name
  43. self.level = level
  44. logging.Logger.__init__(self, self.name, level=level)
  45. if stream:
  46. self.__setStreamHandler__()
  47. if file:
  48. if platform.system() != "Windows":
  49. self.__setFileHandler__()
  50. def __setFileHandler__(self, level=None):
  51. """
  52. set file handler
  53. :param level:
  54. :return:
  55. """
  56. file_name = os.path.join(LOG_PATH, '{name}.log'.format(name=self.name))
  57. # 设置日志回滚, 保存在log目录, 一天保存一个文件, 保留15天
  58. file_handler = TimedRotatingFileHandler(filename=file_name, when='D', interval=1, backupCount=15)
  59. file_handler.suffix = '%Y%m%d.log'
  60. if not level:
  61. file_handler.setLevel(self.level)
  62. else:
  63. file_handler.setLevel(level)
  64. formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
  65. file_handler.setFormatter(formatter)
  66. self.file_handler = file_handler
  67. self.addHandler(file_handler)
  68. def __setStreamHandler__(self, level=None):
  69. """
  70. set stream handler
  71. :param level:
  72. :return:
  73. """
  74. stream_handler = logging.StreamHandler()
  75. formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
  76. stream_handler.setFormatter(formatter)
  77. if not level:
  78. stream_handler.setLevel(self.level)
  79. else:
  80. stream_handler.setLevel(level)
  81. self.addHandler(stream_handler)
  82. if __name__ == '__main__':
  83. log = LogHandler('test')
  84. log.info('this is a test msg')