PythonLog终端输出个性化颜⾊⽇志信息⼀、⽇志颜⾊配置
⾸先要引⼊colorlog模块,其默认的颜⾊配置如下:
default_log_colors = {
'DEBUG': 'white',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}
根据这个配置,可以在⾃⼰的⽇志模块中配置⾃⼰的个性化颜⾊搭配,⽐如:
log_colors_config = {
# 终端输出⽇志颜⾊配置
'DEBUG': 'white',
'INFO': 'cyan',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}
然后在设置输出格式-控制台,如下:
formatter = colorlog.ColoredFormatter(default_formats["color_format"], log_colors=color_config)
最终实现效果,如下:
⼆、⽇志代码
import logging
import os
import colorlog
from logging.handlers import RotatingFileHandler
from datetime import datetime
cur_path = os.path.dirname(alpath(__file__)) # 当前项⽬路径
log_path = os.path.join(os.path.dirname(cur_path), 'logs') # log_path为存放⽇志的路径
if not ists(log_path): os.mkdir(log_path) # 若不存在logs⽂件夹,则⾃动创建
log_colors_config = {
# 终端输出⽇志颜⾊配置
'DEBUG': 'white',
'INFO': 'cyan',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}
default_formats = {
# 终端输出格式
'color_format': '%(log_color)s%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]-%(levelname)s-[⽇志信息]: %(message)s',
# ⽇志输出格式
'log_format': '%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]-%(levelname)s-[⽇志信息]: %(message)s'
}python格式化输出format
class HandleLog:
"""
先创建⽇志记录器(Logger),然后再设置⽇志级别(logger.setLevel),
接着再创建⽇志⽂件,也就是⽇志保存的地⽅(logging.FileHandler),然后再设置⽇志格式(logging.Formatter),
最后再将⽇志处理程序记录到记录器(addHandler)
"""
def __init__(self):
self.__now_time = w().strftime('%Y-%m-%d') # 当前⽇期格式化
self.__all_log_path = os.path.join(log_path, self.__now_time + "-all" + ".log") # 收集所有⽇志信息⽂件
self.__error_log_path = os.path.join(log_path, self.__now_time + "-error" + ".log") # 收集错误⽇志信息⽂件
self.__logger = Logger() # 创建⽇志记录器
self.__logger.setLevel(logging.DEBUG) # 设置默认⽇志记录器记录级别
@staticmethod
def __init_logger_handler(log_path):
"""
创建⽇志记录器handler,⽤于收集⽇志
:param log_path: ⽇志⽂件路径
:return: ⽇志记录器
"""
# 写⼊⽂件,如果⽂件超过1M⼤⼩时,切割⽇志⽂件,仅保留3个⽂件
logger_handler = RotatingFileHandler(filename=log_path, maxBytes=1 * 1024 * 1024, backupCount=3, encoding='utf-8')
return logger_handler
@staticmethod
def __init_console_handle():
"""创建终端⽇志记录器handler,⽤于输出到控制台"""
console_handle = colorlog.StreamHandler()
return console_handle
def __set_log_handler(self, logger_handler, level=logging.DEBUG):
"""
设置handler级别并添加到logger收集器
:param logger_handler: ⽇志记录器
:param level: ⽇志记录器级别
"""
logger_handler.setLevel(level=level)
self.__logger.addHandler(logger_handler)
def __set_color_handle(self, console_handle):
"""
设置handler级别并添加到终端logger收集器
:param console_handle: 终端⽇志记录器
:param level: ⽇志记录器级别
"""
console_handle.setLevel(logging.DEBUG)
self.__logger.addHandler(console_handle)
@staticmethod
def __set_color_formatter(console_handle, color_config):
"""
设置输出格式-控制台
:param console_handle: 终端⽇志记录器
:param color_config: 控制台打印颜⾊配置信息
:return:
"""
formatter = colorlog.ColoredFormatter(default_formats["color_format"], log_colors=color_config)
console_handle.setFormatter(formatter)
@staticmethod
def __set_log_formatter(file_handler):
"""
设置⽇志输出格式-⽇志⽂件
:param file_handler: ⽇志记录器
"""
formatter = logging.Formatter(default_formats["log_format"], datefmt='%a, %d %b %Y %H:%M:%S') file_handler.setFormatter(formatter)
@staticmethod
def __close_handler(file_handler):
"""
关闭handler
:param file_handler: ⽇志记录器
"""
file_handler.close()
def __console(self, level, message):
"""构造⽇志收集器"""
all_logger_handler = self.__init_logger_handler(self.__all_log_path) # 创建⽇志⽂件
error_logger_handler = self.__init_logger_handler(self.__error_log_path)
console_handle = self.__init_console_handle()
self.__set_log_formatter(all_logger_handler) # 设置⽇志格式
self.__set_log_formatter(error_logger_handler)
self.__set_color_formatter(console_handle, log_colors_config)
self.__set_log_handler(all_logger_handler) # 设置handler级别并添加到logger收集器
self.__set_log_handler(error_logger_handler, level=logging.ERROR)
self.__set_color_handle(console_handle)
if level == 'info':
self.__logger.info(message)
elif level == 'debug':
self.__logger.debug(message)
elif level == 'warning':
self.__logger.warning(message)
elif level == 'error':
self.__(message)
elif level == 'critical':
self.__itical(message)
self.__veHandler(all_logger_handler) # 避免⽇志输出重复问题
self.__veHandler(error_logger_handler)
self.__veHandler(console_handle)
self.__close_handler(all_logger_handler) # 关闭handler
self.__close_handler(error_logger_handler)
def debug(self, message):
self.__console('debug', message)
def info(self, message):
self.__console('info', message)
def warning(self, message):
self.__console('warning', message)
def error(self, message):
self.__console('error', message)
def critical(self, message):
self.__console('critical', message)
log = HandleLog()
if __name__ == '__main__':
log.info("这是⽇志信息")
log.debug("这是debug信息")
log.warning("这是警告信息")
<("这是错误⽇志信息") itical("这是严重级别信息")
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论