log_utils.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. # -*- coding:utf-8 -*-
  2. import logging
  3. import os
  4. import re
  5. import sys
  6. from logging import handlers
  7. from dw_base import DO_RESET, NORM_CYN, NORM_GRN, NORM_RED
  8. from dw_base import LOG_ROOT_DIR, IS_RUN_BY_RELEASE_USER, IS_RUN_IN_RELEASE_DIR
  9. from dw_base.common.container import ValueContainer
  10. from dw_base.utils.datetime_utils import formatted_now
  11. CURRENT_LOG_FILE = ValueContainer()
  12. class Logging(object):
  13. _logger_pool = {}
  14. _root_logger = logging.getLogger()
  15. _file_logger = logging.getLogger()
  16. _default_format = '%(asctime)s - %(module)s [line:%(lineno)d] - %(levelname)s: %(message)s'
  17. # 设置日志输出格式
  18. _log_format = logging.Formatter(_default_format)
  19. # 设置日志在控制台输出
  20. _stream_handler = logging.StreamHandler()
  21. # 设置控制台中输出日志格式
  22. _stream_handler.setFormatter(_log_format)
  23. @staticmethod
  24. def _new_logger(log_file_path: str):
  25. os.system(f'mkdir -p {os.path.dirname(log_file_path)}')
  26. # 设置日志输出到文件
  27. file_handler = handlers.TimedRotatingFileHandler(filename=log_file_path, when='d', encoding="utf-8")
  28. # 设置日志文件中的输出格式
  29. file_handler.setFormatter(Logging._log_format)
  30. # 设置日志输出文件
  31. logger = logging.getLogger(log_file_path)
  32. # 设置日志级别
  33. logger.setLevel(logging.INFO)
  34. # 将输出对象添加到logger中
  35. logger.addHandler(Logging._stream_handler)
  36. logger.addHandler(file_handler)
  37. return logger
  38. @staticmethod
  39. def logger():
  40. log_file_path = CURRENT_LOG_FILE.get()
  41. if not log_file_path:
  42. return Logging._root_logger
  43. if Logging._file_logger.name != log_file_path and not Logging._logger_pool.__contains__(log_file_path):
  44. Logging._logger_pool[log_file_path] = Logging._new_logger(log_file_path)
  45. Logging._file_logger = Logging._logger_pool[log_file_path]
  46. return Logging._file_logger
  47. def pretty_print(log_content, silent: bool = False):
  48. if IS_RUN_IN_RELEASE_DIR and IS_RUN_BY_RELEASE_USER:
  49. # 以发布用户在发布目录下运行程序才会在文件中记录日志
  50. log_file = CURRENT_LOG_FILE.get()
  51. saved_out = sys.stdout
  52. if log_file:
  53. try:
  54. with open(log_file, 'a') as f:
  55. sys.stdout = f
  56. # 将颜色渲染转义设置去除
  57. message = re.sub("\033\\[.+?m", '', str(log_content))
  58. print(f'{formatted_now()} {message}')
  59. except Exception as e:
  60. print(e)
  61. sys.stdout = saved_out
  62. if not silent:
  63. print(f'{NORM_CYN}{formatted_now()}{DO_RESET} {str(log_content)}{DO_RESET}')
  64. def get_log_file_path(module_name: str, dt: str, file_name: str) -> str:
  65. """
  66. 根据模块名称、日期和文件名生成日志文件绝对路径
  67. Args:
  68. module_name: 模块名称
  69. dt: 日期
  70. file_name: 文件名
  71. Returns:日志文件绝对路径
  72. """
  73. log_file_dir = f'{LOG_ROOT_DIR}/{module_name}/{dt}'
  74. os.system(f'mkdir -p {log_file_dir}')
  75. log_file_path = f'{LOG_ROOT_DIR}/{module_name}/{dt}/{file_name}.log'
  76. return log_file_path
  77. if __name__ == '__main__':
  78. CURRENT_LOG_FILE.set('x.log')
  79. x = f'{NORM_RED}This is an {NORM_GRN}apple{NORM_RED} and I like it{DO_RESET}'
  80. print(x)
  81. y = re.sub("\033\\[.+?m", '', x)
  82. print(y)
  83. # Logging.logger().info(f'{NORM_MGT}This is an {NORM_GRN}apple{NORM_MGT} and I like it{DO_RESET}')
  84. # Logging.logger().warning(f'{NORM_YEL}This is an {NORM_GRN}apple{NORM_YEL} and I like it{DO_RESET}')
  85. # Logging.logger().error(f'{NORM_RED}This is an {NORM_GRN}apple{NORM_RED} and I like it{DO_RESET}')
  86. # pretty_print(f'{NORM_MGT}This is an {NORM_GRN}apple{NORM_MGT} and I like it{DO_RESET}')
  87. # pretty_print(f'{NORM_YEL}This is an {NORM_GRN}apple{NORM_YEL} and I like it{DO_RESET}')
  88. # pretty_print(f'{NORM_RED}This is an {NORM_GRN}apple{NORM_RED} and I like it{DO_RESET}')