python_exception/Log4p/Log4p.py

100 lines
4.2 KiB
Python
Raw Permalink Normal View History

2024-03-17 22:06:09 +08:00
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