logger.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #!/usr/bin/python
  2. # -*- coding:utf-8 -*-
  3. # 1、日志默认的输出等级为:warning级别及以上的
  4. # 2、想修改日志的默认输出等级?通过logging.basicConfig(level="INFO")----info需要用大写
  5. # 3、想知道日志是什么时候打印出来的,以及其他参数?通过logging.basicConfig(format=console_fmt)
  6. # 4、如果要同时添加这2个参数,需要写在一行代码中,logging.basicConfig(level="INFO",format=console_fmt)
  7. # %(name)s:名字
  8. # %(levelname)s:日志级别
  9. # %(asctime)s:打印时间,年月日时分秒
  10. # %(message)s:日志中的信息
  11. # %(lineno)d:报错日志在代码中第几行
  12. # %(filename)s:文件名
  13. # %(thread)d:进程id
  14. # %(levelname)s:错误等级名称
  15. # '%(asctime)s - %(filename)s[line:%(lineno)d] %(thread)d- %(levelname)s: %(message)s'
  16. import logging
  17. import colorlog
  18. import os
  19. from logging.handlers import RotatingFileHandler
  20. from datetime import datetime
  21. log_colors_config = {
  22. # 终端输出日志颜色配置
  23. 'DEBUG': 'white',
  24. 'INFO': 'green',
  25. 'WARNING': 'yellow',
  26. 'ERROR': 'red',
  27. 'CRITICAL': 'bold_red',
  28. }
  29. default_formats = {
  30. # 终端输出格式
  31. 'console_format': '%(log_color)s%(asctime)s-id%(thread)d-%(filename)s[line:%(lineno)d]-%(levelname)s-[日志信息]: %(message)s',
  32. # 日志输出格式
  33. 'log_format': '%(asctime)s-id %(thread)d-%(filename)s[line:%(lineno)d]-%(levelname)s-[日志信息]: %(message)s'
  34. }
  35. class HandleLog:
  36. """
  37. 先创建日志记录器(logging.getLogger),然后再设置日志级别(logger.setLevel),
  38. 接着再创建日志文件,也就是日志保存的地方(logging.FileHandler),然后再设置日志格式(logging.Formatter),
  39. 最后再将日志处理程序记录到记录器(addHandler)
  40. """
  41. @staticmethod
  42. def __init_logfile_handler(log_path):
  43. """
  44. 创建日志记录器handler,用于收集日志
  45. :param log_path: 日志文件路径
  46. :return: 日志记录器
  47. """
  48. # 写入文件,如果文件超过 10M 大小时,切割日志文件,仅保留3个文件
  49. logfile_handler = RotatingFileHandler(filename=log_path, maxBytes=10 * 1024 * 1024, backupCount=3,
  50. encoding='utf-8')
  51. return logfile_handler
  52. @staticmethod
  53. def __init_console_handle():
  54. """创建终端日志记录器handler,用于输出到控制台"""
  55. console_handle = logging.StreamHandler()
  56. return console_handle
  57. @staticmethod
  58. def __set_handle(__logger, handle, level=logging.INFO):
  59. """
  60. 设置handler级别并添加到终端logger收集器
  61. :param handle: 终端日志记录器
  62. :param level: 日志记录器级别
  63. """
  64. handle.setLevel(level=level)
  65. __logger.addHandler(handle)
  66. @staticmethod
  67. def __set_logfile_formatter(file_handler):
  68. """
  69. 设置日志输出格式-日志文件
  70. :param file_handler: 日志记录器
  71. """
  72. formatter = logging.Formatter(default_formats["log_format"])
  73. file_handler.setFormatter(formatter)
  74. @staticmethod
  75. def __set_console_formatter(console_handle):
  76. """
  77. 设置输出格式-控制台
  78. :param console_handle: 终端日志记录器
  79. :return:
  80. """
  81. formatter = colorlog.ColoredFormatter(fmt=default_formats["console_format"], log_colors=log_colors_config)
  82. console_handle.setFormatter(formatter)
  83. @staticmethod
  84. def __close_handler(file_handler):
  85. """
  86. 关闭handler
  87. :param file_handler: 日志记录器
  88. """
  89. file_handler.close()
  90. @staticmethod
  91. def get_logger(log_path='.\\log', is_save=True):
  92. '''
  93. log_path: 日志文件夹路径
  94. is_save: 是否保存日志文件,默认保存
  95. '''
  96. __logger = logging.getLogger() # 创建日志记录器
  97. __logger.setLevel(logging.DEBUG) # 设置默认日志记录器记录级别
  98. # 创建终端日志记录器handler,用于输出到控制台
  99. console_handle = HandleLog.__init_console_handle()
  100. # 设置显示格式
  101. HandleLog.__set_console_formatter(console_handle)
  102. # 设置handler级别并添加到终端logger收集器
  103. HandleLog.__set_handle(__logger, console_handle)
  104. if is_save:
  105. # 保存日志文件
  106. cur_path = os.path.dirname(os.path.realpath(__file__)) # 当前项目路径
  107. log_path = os.path.join(os.path.dirname(cur_path), log_path) # log_path为存放日志的路径
  108. if not os.path.exists(log_path): os.mkdir(log_path) # 若不存在logs文件夹,则自动创建
  109. _all_log_path = os.path.join(log_path, datetime.now().strftime('%Y-%m-%d') + "-all" + ".log") # 收集所有日志信息文件
  110. _error_log_path = os.path.join(log_path, datetime.now().strftime('%Y-%m-%d') + "-error" + ".log") # 收集错误日志信息文件
  111. #创建日志记录器handler,用于收集日志
  112. all_logfile_handle = HandleLog.__init_logfile_handler(_all_log_path)
  113. error_logfile_handle = HandleLog.__init_logfile_handler(_error_log_path)
  114. # 设置显示格式
  115. HandleLog.__set_logfile_formatter(all_logfile_handle)
  116. HandleLog.__set_logfile_formatter(error_logfile_handle)
  117. # 设置handler级别并添加到终端logger收集器
  118. HandleLog.__set_handle(__logger, all_logfile_handle)
  119. HandleLog.__set_handle(__logger, error_logfile_handle,level=logging.ERROR)
  120. return __logger
  121. # if __name__ == '__main__':
  122. # log = HandleLog.get_logger()
  123. # log.info("这是日志信息")
  124. # log.debug("这是debug信息")
  125. # log.warning("这是警告信息")
  126. # log.error("这是错误日志信息")
  127. # log.critical("这是严重级别信息")