100 lines
4.2 KiB
Python
100 lines
4.2 KiB
Python
|
from Log4p.plugins_for_core import *
|
|||
|
|
|||
|
class LogManager:
|
|||
|
def __init__(self) -> None:
|
|||
|
self.public_formatter = logging.Formatter(
|
|||
|
fmt='[%(asctime)s][%(name)s/%(levelname)s][%(funcName)s]:%(message)s',
|
|||
|
datefmt='%H:%M:%S'
|
|||
|
)
|
|||
|
|
|||
|
def GetLogger(self, log_name: str = "default",
|
|||
|
out_to_console: bool = True,
|
|||
|
web_log_mode: bool = False,
|
|||
|
WSpost_url: str = "",
|
|||
|
HTTPpost_url: str = "",
|
|||
|
http_mode: bool = False,
|
|||
|
custom_formatter: logging.Formatter = None):
|
|||
|
# 确保日志名称有效
|
|||
|
log_name = log_name if log_name else "default"
|
|||
|
if out_to_console:
|
|||
|
log_folder = f'./logs/{log_name}'
|
|||
|
if not os.path.exists(log_folder):
|
|||
|
os.makedirs(log_folder, exist_ok=True)
|
|||
|
|
|||
|
logger = logging.getLogger(log_name)
|
|||
|
if logger.hasHandlers():
|
|||
|
# Logger已经配置过处理器,避免重复配置
|
|||
|
return logger
|
|||
|
|
|||
|
# 颜色配置
|
|||
|
log_color_config = {
|
|||
|
'DEBUG': 'bold_blue', 'INFO': 'bold_cyan',
|
|||
|
'WARNING': 'bold_yellow', 'ERROR': 'red',
|
|||
|
'CRITICAL': 'bold_red', 'RESET': 'reset',
|
|||
|
'asctime': 'green'
|
|||
|
}
|
|||
|
if out_to_console:
|
|||
|
console_handler = logging.StreamHandler()
|
|||
|
console_handler.setLevel(logging.DEBUG)
|
|||
|
console_formatter = colorlog.ColoredFormatter(
|
|||
|
fmt='%(log_color)s [%(asctime)s][%(name)s/%(levelname)s][%(funcName)s]:%(message)s %(reset)s',
|
|||
|
datefmt='%H:%M:%S',
|
|||
|
log_colors=log_color_config
|
|||
|
)
|
|||
|
if custom_formatter:
|
|||
|
console_formatter = custom_formatter
|
|||
|
|
|||
|
if isinstance(console_handler, logging.StreamHandler):
|
|||
|
console_formatter = colorlog.ColoredFormatter(fmt=f"%(log_color)s {console_formatter._fmt} %(reset)s",datefmt=console_formatter.datefmt, log_colors=log_color_config)
|
|||
|
console_handler.setFormatter(console_formatter)
|
|||
|
|
|||
|
logger.setLevel(logging.DEBUG)
|
|||
|
logger.addHandler(console_handler)
|
|||
|
|
|||
|
|
|||
|
file_handler = logging.FileHandler(
|
|||
|
filename=f'logs/{log_name}/{log_name}.log', mode='a', encoding='utf-8')
|
|||
|
file_handler.setLevel(logging.INFO)
|
|||
|
file_handler.setFormatter(self.public_formatter)
|
|||
|
|
|||
|
if custom_formatter:
|
|||
|
file_handler.setFormatter(custom_formatter)
|
|||
|
|
|||
|
# 检查代码是否在异步环境中运行
|
|||
|
if asyncio.iscoroutinefunction(logging.Handler.emit):
|
|||
|
queue = asyncio.Queue()
|
|||
|
queue_handler = QueueHandler(queue)
|
|||
|
queue_listener = QueueListener(queue, file_handler)
|
|||
|
logger.addHandler(queue_handler)
|
|||
|
asyncio.ensure_future(queue_listener.start())
|
|||
|
else:
|
|||
|
logger.addHandler(file_handler)
|
|||
|
|
|||
|
if web_log_mode and WSpost_url:
|
|||
|
websocket_handler = WebsocketHandler(WSpost_url)
|
|||
|
websocket_handler.setLevel(logging.INFO)
|
|||
|
formatter = self.public_formatter
|
|||
|
if custom_formatter:
|
|||
|
formatter = custom_formatter
|
|||
|
websocket_handler.setFormatter(formatter)
|
|||
|
logger.addHandler(websocket_handler)
|
|||
|
|
|||
|
if http_mode and HTTPpost_url:
|
|||
|
# 检查代码是否在异步环境中运行
|
|||
|
if asyncio.iscoroutinefunction(logging.Handler.emit):
|
|||
|
async_http_hander = AsyncHTTPhandler(HTTPpost_url)
|
|||
|
async_http_hander.setLevel(logging.INFO)
|
|||
|
formatter = self.public_formatter
|
|||
|
if custom_formatter:
|
|||
|
formatter = custom_formatter
|
|||
|
async_http_hander.setFormatter(formatter)
|
|||
|
logger.addHandler(async_http_hander)
|
|||
|
http_handler = HTTPhandler(HTTPpost_url)
|
|||
|
http_handler.setLevel(logging.INFO)
|
|||
|
formatter = self.public_formatter
|
|||
|
if custom_formatter:
|
|||
|
formatter = custom_formatter
|
|||
|
http_handler.setFormatter(formatter)
|
|||
|
logger.addHandler(http_handler)
|
|||
|
|
|||
|
return logger
|