2023-11-11 21:12:13 +08:00

152 lines
5.5 KiB
Python

# ----------------------------------------
# - mode: python -
# - author: helloplhm-qwq -
# - name: log.py -
# - project: lx-music-api-server -
# - license: MIT -
# ----------------------------------------
# This file is part of the "lx-music-api-server" project.
# Do not edit except you know what you are doing.
import logging
import colorlog
import os
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import TerminalFormatter
from .utils import sanitize_filename
from .variable import debug_mode, log_length_limit
try:
os.mkdir("logs")
except:
pass
def highlight_error(error):
# 对堆栈跟踪进行语法高亮
highlighted_traceback = highlight(error, PythonLexer(), TerminalFormatter())
# 返回语法高亮后的堆栈跟踪字符串
return str(highlighted_traceback)
class flaskLogHelper(logging.Handler):
# werkzeug日志转接器
def __init__(self, custom_logger):
super().__init__()
self.custom_logger = custom_logger
def emit(self, record):
#print(record)
log_message = self.format(record)
self.custom_logger.info(log_message)
class log:
# 主类
def __init__(self, module_name = 'Not named logger', output_level = 'INFO', filename = ''):
self._logger = logging.getLogger(module_name)
if not output_level.upper() in dir(logging):
raise NameError('Unknown loglevel: '+output_level)
if not debug_mode:
self._logger.setLevel(getattr(logging, output_level.upper()))
else:
self._logger.setLevel(logging.DEBUG)
formatter = colorlog.ColoredFormatter(
'%(log_color)s%(asctime)s|[%(name)s/%(levelname)s]|%(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
log_colors={
'DEBUG': 'cyan',
'INFO': 'white',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red,bg_white',
})
file_formatter = logging.Formatter(
'%(asctime)s|[%(name)s/%(levelname)s]|%(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
if filename:
filename = sanitize_filename(filename)
else:
filename = './logs/' + module_name + '.log'
file_handler = logging.FileHandler(filename, encoding = "utf-8")
file_handler.setFormatter(file_formatter)
file_handler_ = logging.FileHandler("./logs/console_full.log", encoding = "utf-8")
file_handler_.setFormatter(file_formatter)
self._logger.addHandler(file_handler_)
self._logger.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
self.module_name = module_name
self._logger.addHandler(console_handler)
self.debug_ = logging.getLogger(module_name + '_levelChangedMessage')
debug_handler = logging.StreamHandler()
debug_handler.setFormatter(formatter)
self.debug_.addHandler(debug_handler)
self.debug_.setLevel(logging.DEBUG)
def debug(self, message, allow_hidden = True):
if self.module_name == "flask" and "\n" in message:
if message.startswith("Error"):
return self._logger.error(message)
for m in message.split("\n"):
if "WARNING" in m:
self._logger.warning(m)
else:
self._logger.info(m)
return
if len(str(message)) > log_length_limit and allow_hidden:
message = str(message)[:log_length_limit] + "..."
self._logger.debug(message)
def log(self, message, allow_hidden = True):
if self.module_name == "flask" and "\n" in message:
if message.startswith("Error"):
return self._logger.error(message)
for m in message.split("\n"):
if "WARNING" in m:
self._logger.warning(m)
else:
self._logger.info(m)
return
if len(str(message)) > log_length_limit and allow_hidden:
message = str(message)[:log_length_limit] + "..."
self._logger.info(message)
def info(self, message, allow_hidden = True):
if self.module_name == "flask" and "\n" in message:
if message.startswith("Error"):
return self._logger.error(message)
for m in message.split("\n"):
if "WARNING" in m:
self._logger.warning(m)
else:
self._logger.info(m)
return
if len(str(message)) > log_length_limit and allow_hidden:
message = str(message)[:log_length_limit] + "..."
self._logger.info(message)
def warning(self, message):
self._logger.warning(message)
def error(self, message):
if (message.startswith('Traceback')):
self._logger.error('\n' + highlight_error(message))
else:
self._logger.error(message)
def critical(self, message):
self._logger.critical(message)
def set_level(self, loglevel):
loglevel_upper = loglevel.upper()
if not loglevel_upper in dir(logging):
raise NameError('Unknown loglevel: '+loglevel)
self.debug_.debug('loglevel changed to: '+ loglevel_upper)
self._logger.setLevel(getattr(logging, loglevel_upper))
def getLogger(self):
return self._logger
def addHandler(self, handler):
self._logger.addHandler(handler)