logs.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import os
  2. import re
  3. import datetime
  4. import logging
  5. import sys
  6. from config import LOGS_NUM
  7. try:
  8. import codecs
  9. except ImportError:
  10. codecs = None
  11. class MultiprocessHandler(logging.FileHandler):
  12. """
  13. Say something about the ExampleCalass...
  14. Args:
  15. args_0 (`type`):
  16. ...
  17. """
  18. def __init__(self, filename, when='D', backupCount=0, encoding=None, delay=False):
  19. self.prefix = filename
  20. self.backupCount = backupCount
  21. self.when = when.upper()
  22. self.extMath = r"^\d{4}-\d{2}-\d{2}"
  23. self.when_dict = {
  24. 'S': "%Y-%m-%d-%H-%M-%S",
  25. 'M': "%Y-%m-%d-%H-%M",
  26. 'H': "%Y-%m-%d-%H",
  27. 'D': "%Y-%m-%d"
  28. }
  29. self.suffix = self.when_dict.get(when)
  30. if not self.suffix:
  31. print('The specified date interval unit is invalid: ', self.when)
  32. sys.exit(1)
  33. self.filefmt = os.path.join('.', "logs", f"{self.prefix}-{self.suffix}.log")
  34. self.filePath = datetime.datetime.now().strftime(self.filefmt)
  35. _dir = os.path.dirname(self.filefmt)
  36. try:
  37. if not os.path.exists(_dir):
  38. os.makedirs(_dir)
  39. except Exception as e:
  40. print('Failed to create log file: ', e)
  41. print("log_path:" + self.filePath)
  42. sys.exit(1)
  43. if codecs is None:
  44. encoding = None
  45. logging.FileHandler.__init__(self, self.filePath, 'a+', encoding, delay)
  46. def shouldChangeFileToWrite(self):
  47. _filePath = datetime.datetime.now().strftime(self.filefmt)
  48. if _filePath != self.filePath:
  49. self.filePath = _filePath
  50. return True
  51. return False
  52. def doChangeFile(self):
  53. self.baseFilename = os.path.abspath(self.filePath)
  54. if self.stream:
  55. self.stream.close()
  56. self.stream = None
  57. if not self.delay:
  58. self.stream = self._open()
  59. if self.backupCount > 0:
  60. for s in self.getFilesToDelete():
  61. os.remove(s)
  62. def getFilesToDelete(self):
  63. dir_name, _ = os.path.split(self.baseFilename)
  64. file_names = os.listdir(dir_name)
  65. result = []
  66. prefix = self.prefix + '-'
  67. for file_name in file_names:
  68. if file_name[:len(prefix)] == prefix:
  69. suffix = file_name[len(prefix):-4]
  70. if re.compile(self.extMath).match(suffix):
  71. result.append(os.path.join(dir_name, file_name))
  72. result.sort()
  73. if len(result) < self.backupCount:
  74. result = []
  75. else:
  76. result = result[:len(result) - self.backupCount]
  77. return result
  78. def emit(self, record):
  79. try:
  80. if self.shouldChangeFileToWrite():
  81. self.doChangeFile()
  82. logging.FileHandler.emit(self, record)
  83. except (KeyboardInterrupt, SystemExit):
  84. raise
  85. except:
  86. self.handleError(record)
  87. def write_log():
  88. logger = logging.getLogger()
  89. logger.setLevel(logging.DEBUG)
  90. # formatter = '%(asctime)s | %(levelname)s | %(filename)s | %(funcName)s | %(module)s | %(lineno)s | %(message)s'
  91. fmt = logging.Formatter(
  92. '%(asctime)s | %(levelname)s | %(filename)s | %(funcName)s | %(lineno)s | %(message)s')
  93. stream_handler = logging.StreamHandler(sys.stdout)
  94. stream_handler.setLevel(logging.INFO)
  95. stream_handler.setFormatter(fmt)
  96. log_name = "milvus"
  97. file_handler = MultiprocessHandler(log_name, when='D', backupCount=LOGS_NUM)
  98. file_handler.setLevel(logging.DEBUG)
  99. file_handler.setFormatter(fmt)
  100. file_handler.doChangeFile()
  101. logger.addHandler(stream_handler)
  102. logger.addHandler(file_handler)
  103. return logger
  104. LOGGER = write_log()
  105. # if __name__ == "__main__":
  106. # message = 'test writing logs'
  107. # logger = write_log()
  108. # logger.info(message)
  109. # logger.debug(message)
  110. # logger.error(message)