log.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: jürgen.pannosch, tanja.zolotareva
  4. """
  5. import sys
  6. import os
  7. import logging
  8. from datetime import datetime
  9. import warnings
  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(".", "logs", str(datetime.today().date()) + ".log")
  31. assert(isinstance(log_file, str)),\
  32. "Parameter 'log_path' must be of string type"
  33. os.makedirs(os.path.dirname(log_file), exist_ok=True)
  34. formatter = logging.Formatter(
  35. '\n %(name)s %(asctime)s %(levelname)s %(message)s')
  36. file_handler = logging.FileHandler(log_file)
  37. file_handler.setFormatter(formatter)
  38. file_handler.setLevel(log_level)
  39. self._logger.addHandler(file_handler)
  40. if print_to_stdout:
  41. stream_handler = logging.StreamHandler(sys.stdout)
  42. stream_handler.setFormatter(formatter)
  43. stream_handler.setLevel(stdout_log_level)
  44. self._logger.addHandler(stream_handler)
  45. # self._logger.setLevel(log_level)
  46. @property
  47. def magenta(self):
  48. return '\033[95m'
  49. @property
  50. def blue(self):
  51. return '\033[94m'
  52. @property
  53. def cyan(self):
  54. return '\u001b[36m'
  55. @property
  56. def green(self):
  57. return '\033[92m'
  58. @property
  59. def yellow(self):
  60. return '\033[93m'
  61. @property
  62. def fail(self):
  63. return '\033[91m'
  64. @property
  65. def reset(self):
  66. return '\033[0m'
  67. @property
  68. def bold(self):
  69. return '\033[1m'
  70. @property
  71. def underline(self):
  72. return '\033[4m'
  73. def info(self, message: str):
  74. self._logger.info(message)
  75. def warning(self, message: str):
  76. self._logger.warning(message)
  77. def error(self, message: str):
  78. self._logger.error(message)
  79. def log_and_raise_error(self, message):
  80. '''
  81. '''
  82. self._logger.error(message, exc_info=True)
  83. raise Exception(message)
  84. def log_and_raise_error_stack_info(self, message):
  85. '''
  86. '''
  87. self._logger.error(message, exc_info=True, stack_info=True)
  88. raise Exception(message)
  89. def log_and_throw_warning(self, message):
  90. '''
  91. '''
  92. self._logger.warning(message)
  93. warnings.warn(message)
  94. def log_and_raise_warning(self, message):
  95. '''
  96. '''
  97. warnings.warn(("This method has been depricated. "
  98. "User log_and_throw_warning instead"),
  99. DeprecationWarning)
  100. self._logger.warning(message)
  101. warnings.warn(message)