带记录颜色配置文件
方法:定制Logger类,只能实现自己实例化Logger类的log输出颜色
import os
导入日志
来自日志导入格式器
来自类型导入单元
# logging.StreamHandler将日志消息发送到std.out、std.err或任何file-like对象。
# logging.FileHandler将日志消息发送到磁盘文件。 默认情况下,文件大小会无限增加
# logging.handlers.rotating filehandler将日志消息发送到磁盘文件,并支持按大小剪切日志文件
# logging.handlers.timedrotatingfilehandler将日志消息发送到磁盘文件,并支持日志文件按时间断开连接
# logging.handlers.HTTPHandler将日志消息作为GET或POST发送到HTTP服务器
# logging.handlers.SMTPHandler将日志消息发送到指定的电子邮件地址
# logging.NullHandler,此Handler实例将忽略错误消息。
#通常用于希望使用logging的library开发人员,以避免“nohandlerscouldbefoundforloggerxxx”信息的出现。
LOGGING_CONFIG={
版本: 1、
' disable _ existing _ loggers ' : false,
“incremental”:假,
' formatters': {
“标准”: {
' class': 'logging.Formatter ',
' format ' : ' % [ asctime ] s [ % [ thread name ] s ] [ % [ name ] s ] [ % [ levelname ] s ] % [ filename ] s [ line 3360 ]
' datefmt ' : ' % y-% m-% d % h : % m : % s '
}
(,
' filters': {},
' handlers': {
' console': {
' class ' : ' logging.stream handler ',
' level': 'DEBUG ',
格式:标准,
(,
' root': {
' level': 'DEBUG ',
' class ' : ' logging.handlers.timedrotatingfilehandler ',
格式:标准,
' filename':OS.path.join '、' logs/'、' root.log '、
' interval': 1,
' when': 'D ',
' backupCount': 999,
' encoding': 'utf-8 ',
(,
' oprsapi': {
' level': 'DEBUG ',
' class ' : ' logging.handlers.timedrotatingfilehandler ',
格式:标准,
' filename':OS.path.join '、' logs/'、' oprsapi.log '、
' interval': 1,
' when': 'D ',
' backupCount': 999,
' encoding': 'utf-8 ',
(,
' db': {
' level': 'DEBUG ',
' class ' : ' logging.handlers.timedrotatingfilehandler ',
格式:标准,
' filename ' : OS.path.join (' logs/',' db.log )、
' interval': 1,
' when': 'D ',
' backupCount': 999,
' encoding': 'utf-8 ',
(,
(,
' loggers': {
' ' : {
' handlers': ['console ',' root'],
' level': 'DEBUG ',
属性:真
>},
'oprsapi': {
'handlers': ['oprsapi'],
'level': 'DEBUG',
'propagate': True
},
'db_client': {
'handlers': ['db'],
'level': 'DEBUG',
'propagate': True
},
'tortoise': {
'handlers': ['db'],
'level': 'DEBUG',
'propagate': True
}
}
}
class ExtLogger:
"""扩展logger类, 添加"""
def __init__(self, full_name):
self.lg = logging.getLogger(full_name)
def debug(self, msg: str, tag: str = ""):
msg = f'[ext_{tag}] {msg}'
self.lg.debug(msg)
def info(self, msg: str, tag: str = ""):
msg = f'[ext_{tag}] {msg}'
self.lg.info(msg)
def warning(self, msg: str, tag: str = ""):
msg = f'[ext_{tag}] {msg}'
self.lg.warning(msg)
def error(self, msg: str, tag: str = ""):
msg = f'[ext_{tag}] {msg}'
self.lg.error(msg)
def critical(self, msg: str, tag: str = ""):
msg = f'[ext_{tag}] {msg}'
self.lg.critical(msg)
def get_extlogger(name, prefix: str = "oprsapi") -> ExtLogger:
logging.config.dictConfig(LOGGING_CONFIG)
full_name = '%s.%s' % (prefix, name)
logger = ExtLogger(full_name)
return logger
方法二: 重写 Formater类, 影响进程下所有logging输出
import os
import logging
from logging import Formatter
# logging.StreamHandler将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。
# logging.FileHandler将日志消息发送到磁盘文件,默认情况下文件大小会无限增长
# logging.handlers.RotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按大小切割
# logging.hanlders.TimedRotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按时间切割
# logging.handlers.HTTPHandler将日志消息以GET或POST的方式发送给一个HTTP服务器
# logging.handlers.SMTPHandler将日志消息发送给一个指定的email地址
# logging.NullHandler该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现。
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'incremental': False,
'formatters': {
'standard': {
# 'class': 'logging.Formatter',
#改用自己的Formater类
'class': 'utils.extlogging.CustomFormatter',
'format': '%(asctime)s [%(threadName)s] [%(name)s] [%(levelname)s] %(filename)s[line:%(lineno)d] %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S'
}
},
'filters': {},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'formatter': 'standard',
},
'root': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'standard',
'filename': os.path.join('logs/', 'root.log'),
'interval': 1,
'when': 'D',
'backupCount': 999,
'encoding': 'utf-8',
},
'oprsapi': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'standard',
'filename': os.path.join('logs/', 'oprsapi.log'),
'interval': 1,
'when': 'D',
'backupCount': 999,
'encoding': 'utf-8',
},
'db': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'standard',
'filename': os.path.join('logs/', 'db.log'),
'interval': 1,
'when': 'D',
'backupCount': 999,
'encoding': 'utf-8',
},
},
'loggers': {
'': {
'handlers': ['console', 'root'],
'level': 'DEBUG',
'propagate': True
},
'oprsapi': {
'handlers': ['oprsapi'],
'level': 'DEBUG',
'propagate': True
},
'db_client': {
'handlers': ['db'],
'level': 'DEBUG',
'propagate': True
},
'tortoise': {
'handlers': ['db'],
'level': 'DEBUG',
'propagate': True
}
}
}
def get_logger(name, prefix: str = 'oprsapi') -> logging.Logger:
logging.config.dictConfig(LOGGING_CONFIG)
full_name = '%s.%s' % (prefix, name)
logger = logging.getLogger(full_name)
return logger
class CustomFormatter(Formatter):
"""
自定义format, 为日志加上颜色输出
"""
def __init__(self, fmt=None, datefmt=None, style='%'):
self.default_color = "{0}"
self.level_color = {
'DEBUG': " 33[0;34;40m{0} 33[0m",
'INFO': " 33[0;32;40m{0} 33[0m",
'WARN': " 33[0;33;40m{0} 33[0m",
'ERROR': " 33[0;31;40m{0} 33[0m",
'CRITICAL': " 33[0;31;43m{0} 33[0m"
}
super().__init__(fmt, datefmt, style)
def format(self, record):
"""
自定义format, 为日志加上颜色输出
"""
record.message = record.getMessage()
if self.usesTime():
record.asctime = self.formatTime(record, self.datefmt)
s = self.formatMessage(record)
if record.exc_info:
# Cache the traceback text to avoid converting it multiple times
# (it's constant anyway)
if not record.exc_text:
record.exc_text = self.formatException(record.exc_info)
if record.exc_text:
if s[-1:] != "n":
s = s + "n"
s = s + record.exc_text
if record.stack_info:
if s[-1:] != "n":
s = s + "n"
s = s + self.formatStack(record.stack_info)
# 加颜色
s = self.level_color.get(record.levelname, self.default_color).format(s)
return s