log.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: jürgen.pannosch, tanja.zolotareva
  4. """
  5. import sys
  6. import os
  7. import logging
  8. import warnings
  9. from datetime import datetime
  10. sys.path.append(os.getcwd())
  11. class Log():
  12. '''
  13. '''
  14. pass
  15. def __init__(self, name: str = None,
  16. log_file: str = None,
  17. log_level: str = "ERROR",
  18. stdout_log_level: str = "INFO",
  19. print_to_stdout: bool = True):
  20. """Sets the log level and the path where the log file is stored
  21. :param log_file: Path to the log file.
  22. :param log_level: Log level."""
  23. if name is None:
  24. name = ''
  25. self._logger = logging.getLogger(name)
  26. self._logger.setLevel("DEBUG")
  27. if (self._logger.hasHandlers()):
  28. self._logger.handlers.clear()
  29. if log_file is None:
  30. log_file = os.path.join(".",
  31. "logs",
  32. str(datetime.today().date()) + ".log")
  33. assert(isinstance(log_file, str)),\
  34. "Parameter 'log_path' must be of string type"
  35. os.makedirs(os.path.dirname(log_file), exist_ok=True)
  36. formatter = logging.Formatter(
  37. '\n %(name)s %(asctime)s %(levelname)s %(message)s')
  38. file_handler = logging.FileHandler(log_file)
  39. file_handler.setFormatter(formatter)
  40. file_handler.setLevel(log_level)
  41. self._logger.addHandler(file_handler)
  42. if print_to_stdout:
  43. stream_handler = logging.StreamHandler(sys.stdout)
  44. stream_handler.setFormatter(formatter)
  45. stream_handler.setLevel(stdout_log_level)
  46. self._logger.addHandler(stream_handler)
  47. # self._logger.setLevel(log_level)
  48. @property
  49. def magenta(self):
  50. return '\033[95m'
  51. @property
  52. def blue(self):
  53. return '\033[94m'
  54. @property
  55. def cyan(self):
  56. return '\u001b[36m'
  57. @property
  58. def green(self):
  59. return '\033[92m'
  60. @property
  61. def yellow(self):
  62. return '\033[93m'
  63. @property
  64. def fail(self):
  65. return '\033[91m'
  66. @property
  67. def reset(self):
  68. return '\033[0m'
  69. @property
  70. def bold(self):
  71. return '\033[1m'
  72. @property
  73. def underline(self):
  74. return '\033[4m'
  75. def info(self, message: str):
  76. self._logger.info(message)
  77. def warning(self, message: str):
  78. self._logger.warning(message)
  79. def error(self, message: str):
  80. self._logger.error(message)
  81. def log_and_raise_error(self, message, ErrorType=Exception):
  82. '''
  83. '''
  84. self._logger.error(message, exc_info=True)
  85. raise ErrorType(message)
  86. def log_and_raise_error_stack_info(self, message, ErrorType=Exception):
  87. '''
  88. '''
  89. self._logger.error(message, exc_info=True, stack_info=True)
  90. raise ErrorType(message)
  91. def log_and_throw_warning(self, message):
  92. '''
  93. '''
  94. self._logger.warning(message, exc_info=True)
  95. warnings.warn(message)