167 lines
5.7 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.
import logging
import colorlog
import os
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import TerminalFormatter
from .utils import filterFileName, addToGlobalNamespace
from .variable import debug_mode, log_length_limit, log_file
if ((not os.path.exists("logs")) and log_file):
try:
os.mkdir("logs")
except:
pass
def highlight_error(error):
# 对堆栈跟踪进行语法高亮
highlighted_traceback = highlight(
error, PythonLexer(), TerminalFormatter())
# 返回语法高亮后的堆栈跟踪字符串
return str(highlighted_traceback)
class LogHelper(logging.Handler):
# 日志转接器
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',
})
if log_file:
file_formatter = logging.Formatter(
'%(asctime)s|[%(name)s/%(levelname)s]|%(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
if filename:
filename = filterFileName(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)
debug_handler = logging.StreamHandler()
debug_handler.setFormatter(formatter)
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):
if (message.startswith('Traceback')):
self._logger.error('\n' + highlight_error(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._logger.setLevel(getattr(logging, loglevel_upper))
def getLogger(self):
return self._logger
def addHandler(self, handler):
self._logger.addHandler(handler)
printlogger = log('print')
def logprint(*args, sep=' ', end='', file=None, flush=None):
printlogger.info(sep.join(str(arg) for arg in args), allow_hidden=False)
addToGlobalNamespace('print', logprint)