logHandler.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. os.mkdir(LOG_PATH)
  34. class LogHandler(logging.Logger):
  35. """
  36. LogHandler
  37. """
  38. def __init__(self, name, level=DEBUG, stream=True, file=True):
  39. self.name = name
  40. self.level = level
  41. logging.Logger.__init__(self, self.name, level=level)
  42. if stream:
  43. self.__setStreamHandler__()
  44. if file:
  45. if platform.system() != "Windows":
  46. self.__setFileHandler__()
  47. def __setFileHandler__(self, level=None):
  48. """
  49. set file handler
  50. :param level:
  51. :return:
  52. """
  53. file_name = os.path.join(LOG_PATH, '{name}.log'.format(name=self.name))
  54. # 设置日志回滚, 保存在log目录, 一天保存一个文件, 保留15天
  55. file_handler = TimedRotatingFileHandler(filename=file_name, when='D', interval=1, backupCount=15)
  56. file_handler.suffix = '%Y%m%d.log'
  57. if not level:
  58. file_handler.setLevel(self.level)
  59. else:
  60. file_handler.setLevel(level)
  61. formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
  62. file_handler.setFormatter(formatter)
  63. self.file_handler = file_handler
  64. self.addHandler(file_handler)
  65. def __setStreamHandler__(self, level=None):
  66. """
  67. set stream handler
  68. :param level:
  69. :return:
  70. """
  71. stream_handler = logging.StreamHandler()
  72. formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
  73. stream_handler.setFormatter(formatter)
  74. if not level:
  75. stream_handler.setLevel(self.level)
  76. else:
  77. stream_handler.setLevel(level)
  78. self.addHandler(stream_handler)
  79. if __name__ == '__main__':
  80. log = LogHandler('test')
  81. log.info('this is a test msg')