🤖 自动格式化代码 [skip ci]
This commit is contained in:
2
bot.py
2
bot.py
@@ -10,6 +10,7 @@ from dotenv import load_dotenv
|
|||||||
|
|
||||||
# 最早期初始化日志系统,确保所有后续模块都使用正确的日志格式
|
# 最早期初始化日志系统,确保所有后续模块都使用正确的日志格式
|
||||||
from src.common.logger import initialize_logging
|
from src.common.logger import initialize_logging
|
||||||
|
|
||||||
initialize_logging()
|
initialize_logging()
|
||||||
|
|
||||||
from src.common.logger import get_logger
|
from src.common.logger import get_logger
|
||||||
@@ -46,7 +47,6 @@ app = None
|
|||||||
loop = None
|
loop = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def request_shutdown() -> bool:
|
async def request_shutdown() -> bool:
|
||||||
"""请求关闭程序"""
|
"""请求关闭程序"""
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -14,4 +14,4 @@ from common.logger import reload_log_config
|
|||||||
|
|
||||||
print("🔄 重新加载日志配置...")
|
print("🔄 重新加载日志配置...")
|
||||||
reload_log_config()
|
reload_log_config()
|
||||||
print("✅ 配置已重新加载!faiss日志已被屏蔽。")
|
print("✅ 配置已重新加载!faiss日志已被屏蔽。")
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -494,7 +494,6 @@ class HeartFChatting:
|
|||||||
"observed_messages": plan_result.get("observed_messages", ""),
|
"observed_messages": plan_result.get("observed_messages", ""),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
with Timer("执行动作", cycle_timers):
|
with Timer("执行动作", cycle_timers):
|
||||||
action_type, action_data, reasoning = (
|
action_type, action_data, reasoning = (
|
||||||
plan_result.get("action_result", {}).get("action_type", "error"),
|
plan_result.get("action_result", {}).get("action_type", "error"),
|
||||||
@@ -502,7 +501,6 @@ class HeartFChatting:
|
|||||||
plan_result.get("action_result", {}).get("reasoning", "未提供理由"),
|
plan_result.get("action_result", {}).get("reasoning", "未提供理由"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
if action_type == "reply":
|
if action_type == "reply":
|
||||||
action_str = "回复"
|
action_str = "回复"
|
||||||
elif action_type == "no_reply":
|
elif action_type == "no_reply":
|
||||||
|
|||||||
@@ -5,71 +5,74 @@ from typing import Callable, Optional
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
from structlog.dev import ConsoleRenderer
|
|
||||||
import toml
|
import toml
|
||||||
|
|
||||||
# 创建logs目录
|
# 创建logs目录
|
||||||
LOG_DIR = Path("logs")
|
LOG_DIR = Path("logs")
|
||||||
LOG_DIR.mkdir(exist_ok=True)
|
LOG_DIR.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
|
||||||
# 读取日志配置
|
# 读取日志配置
|
||||||
def load_log_config():
|
def load_log_config():
|
||||||
"""从配置文件加载日志设置"""
|
"""从配置文件加载日志设置"""
|
||||||
config_path = Path("config/bot_config.toml")
|
config_path = Path("config/bot_config.toml")
|
||||||
default_config = {
|
default_config = {
|
||||||
"date_style": "Y-m-d H:i:s",
|
"date_style": "Y-m-d H:i:s",
|
||||||
"log_level_style": "lite",
|
"log_level_style": "lite",
|
||||||
"color_text": "title",
|
"color_text": "title",
|
||||||
"log_level": "INFO",
|
"log_level": "INFO",
|
||||||
"suppress_libraries": [],
|
"suppress_libraries": [],
|
||||||
"library_log_levels": {}
|
"library_log_levels": {},
|
||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if config_path.exists():
|
if config_path.exists():
|
||||||
with open(config_path, 'r', encoding='utf-8') as f:
|
with open(config_path, "r", encoding="utf-8") as f:
|
||||||
config = toml.load(f)
|
config = toml.load(f)
|
||||||
return config.get('log', default_config)
|
return config.get("log", default_config)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return default_config
|
return default_config
|
||||||
|
|
||||||
|
|
||||||
LOG_CONFIG = load_log_config()
|
LOG_CONFIG = load_log_config()
|
||||||
|
|
||||||
|
|
||||||
def get_timestamp_format():
|
def get_timestamp_format():
|
||||||
"""将配置中的日期格式转换为Python格式"""
|
"""将配置中的日期格式转换为Python格式"""
|
||||||
date_style = LOG_CONFIG.get("date_style", "Y-m-d H:i:s")
|
date_style = LOG_CONFIG.get("date_style", "Y-m-d H:i:s")
|
||||||
# 转换PHP风格的日期格式到Python格式
|
# 转换PHP风格的日期格式到Python格式
|
||||||
format_map = {
|
format_map = {
|
||||||
'Y': '%Y', # 4位年份
|
"Y": "%Y", # 4位年份
|
||||||
'm': '%m', # 月份(01-12)
|
"m": "%m", # 月份(01-12)
|
||||||
'd': '%d', # 日期(01-31)
|
"d": "%d", # 日期(01-31)
|
||||||
'H': '%H', # 小时(00-23)
|
"H": "%H", # 小时(00-23)
|
||||||
'i': '%M', # 分钟(00-59)
|
"i": "%M", # 分钟(00-59)
|
||||||
's': '%S', # 秒数(00-59)
|
"s": "%S", # 秒数(00-59)
|
||||||
}
|
}
|
||||||
|
|
||||||
python_format = date_style
|
python_format = date_style
|
||||||
for php_char, python_char in format_map.items():
|
for php_char, python_char in format_map.items():
|
||||||
python_format = python_format.replace(php_char, python_char)
|
python_format = python_format.replace(php_char, python_char)
|
||||||
|
|
||||||
return python_format
|
return python_format
|
||||||
|
|
||||||
|
|
||||||
def configure_third_party_loggers():
|
def configure_third_party_loggers():
|
||||||
"""配置第三方库的日志级别"""
|
"""配置第三方库的日志级别"""
|
||||||
# 设置全局日志级别
|
# 设置全局日志级别
|
||||||
global_log_level = LOG_CONFIG.get("log_level", "INFO")
|
global_log_level = LOG_CONFIG.get("log_level", "INFO")
|
||||||
root_logger = logging.getLogger()
|
root_logger = logging.getLogger()
|
||||||
root_logger.setLevel(getattr(logging, global_log_level.upper(), logging.INFO))
|
root_logger.setLevel(getattr(logging, global_log_level.upper(), logging.INFO))
|
||||||
|
|
||||||
# 完全屏蔽的库
|
# 完全屏蔽的库
|
||||||
suppress_libraries = LOG_CONFIG.get("suppress_libraries", [])
|
suppress_libraries = LOG_CONFIG.get("suppress_libraries", [])
|
||||||
for lib_name in suppress_libraries:
|
for lib_name in suppress_libraries:
|
||||||
lib_logger = logging.getLogger(lib_name)
|
lib_logger = logging.getLogger(lib_name)
|
||||||
lib_logger.setLevel(logging.CRITICAL + 1) # 设置为比CRITICAL更高的级别,基本屏蔽所有日志
|
lib_logger.setLevel(logging.CRITICAL + 1) # 设置为比CRITICAL更高的级别,基本屏蔽所有日志
|
||||||
lib_logger.propagate = False # 阻止向上传播
|
lib_logger.propagate = False # 阻止向上传播
|
||||||
|
|
||||||
# 设置特定级别的库
|
# 设置特定级别的库
|
||||||
library_log_levels = LOG_CONFIG.get("library_log_levels", {})
|
library_log_levels = LOG_CONFIG.get("library_log_levels", {})
|
||||||
for lib_name, level_name in library_log_levels.items():
|
for lib_name, level_name in library_log_levels.items():
|
||||||
@@ -82,14 +85,14 @@ def reconfigure_existing_loggers():
|
|||||||
"""重新配置所有已存在的logger,解决加载顺序问题"""
|
"""重新配置所有已存在的logger,解决加载顺序问题"""
|
||||||
# 获取根logger
|
# 获取根logger
|
||||||
root_logger = logging.getLogger()
|
root_logger = logging.getLogger()
|
||||||
|
|
||||||
# 重新设置根logger的所有handler的格式化器
|
# 重新设置根logger的所有handler的格式化器
|
||||||
for handler in root_logger.handlers:
|
for handler in root_logger.handlers:
|
||||||
if isinstance(handler, logging.handlers.RotatingFileHandler):
|
if isinstance(handler, logging.handlers.RotatingFileHandler):
|
||||||
handler.setFormatter(file_formatter)
|
handler.setFormatter(file_formatter)
|
||||||
elif isinstance(handler, logging.StreamHandler):
|
elif isinstance(handler, logging.StreamHandler):
|
||||||
handler.setFormatter(console_formatter)
|
handler.setFormatter(console_formatter)
|
||||||
|
|
||||||
# 遍历所有已存在的logger并重新配置
|
# 遍历所有已存在的logger并重新配置
|
||||||
logger_dict = logging.getLogger().manager.loggerDict
|
logger_dict = logging.getLogger().manager.loggerDict
|
||||||
for name, logger_obj in logger_dict.items():
|
for name, logger_obj in logger_dict.items():
|
||||||
@@ -97,29 +100,29 @@ def reconfigure_existing_loggers():
|
|||||||
# 检查是否是第三方库logger
|
# 检查是否是第三方库logger
|
||||||
suppress_libraries = LOG_CONFIG.get("suppress_libraries", [])
|
suppress_libraries = LOG_CONFIG.get("suppress_libraries", [])
|
||||||
library_log_levels = LOG_CONFIG.get("library_log_levels", {})
|
library_log_levels = LOG_CONFIG.get("library_log_levels", {})
|
||||||
|
|
||||||
# 如果在屏蔽列表中
|
# 如果在屏蔽列表中
|
||||||
if any(name.startswith(lib) for lib in suppress_libraries):
|
if any(name.startswith(lib) for lib in suppress_libraries):
|
||||||
logger_obj.setLevel(logging.CRITICAL + 1)
|
logger_obj.setLevel(logging.CRITICAL + 1)
|
||||||
logger_obj.propagate = False
|
logger_obj.propagate = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 如果在特定级别设置中
|
# 如果在特定级别设置中
|
||||||
for lib_name, level_name in library_log_levels.items():
|
for lib_name, level_name in library_log_levels.items():
|
||||||
if name.startswith(lib_name):
|
if name.startswith(lib_name):
|
||||||
level = getattr(logging, level_name.upper(), logging.WARNING)
|
level = getattr(logging, level_name.upper(), logging.WARNING)
|
||||||
logger_obj.setLevel(level)
|
logger_obj.setLevel(level)
|
||||||
break
|
break
|
||||||
|
|
||||||
# 强制清除并重新设置所有handler
|
# 强制清除并重新设置所有handler
|
||||||
original_handlers = logger_obj.handlers[:]
|
original_handlers = logger_obj.handlers[:]
|
||||||
for handler in original_handlers:
|
for handler in original_handlers:
|
||||||
logger_obj.removeHandler(handler)
|
logger_obj.removeHandler(handler)
|
||||||
|
|
||||||
# 如果logger没有handler,让它使用根logger的handler(propagate=True)
|
# 如果logger没有handler,让它使用根logger的handler(propagate=True)
|
||||||
if not logger_obj.handlers:
|
if not logger_obj.handlers:
|
||||||
logger_obj.propagate = True
|
logger_obj.propagate = True
|
||||||
|
|
||||||
# 如果logger有自己的handler,重新配置它们
|
# 如果logger有自己的handler,重新配置它们
|
||||||
for handler in original_handlers:
|
for handler in original_handlers:
|
||||||
if isinstance(handler, logging.handlers.RotatingFileHandler):
|
if isinstance(handler, logging.handlers.RotatingFileHandler):
|
||||||
@@ -128,24 +131,25 @@ def reconfigure_existing_loggers():
|
|||||||
handler.setFormatter(console_formatter)
|
handler.setFormatter(console_formatter)
|
||||||
logger_obj.addHandler(handler)
|
logger_obj.addHandler(handler)
|
||||||
|
|
||||||
|
|
||||||
# 定义模块颜色映射
|
# 定义模块颜色映射
|
||||||
MODULE_COLORS = {
|
MODULE_COLORS = {
|
||||||
"api": "\033[92m", # 亮绿色
|
"api": "\033[92m", # 亮绿色
|
||||||
"emoji": "\033[92m", # 亮绿色
|
"emoji": "\033[92m", # 亮绿色
|
||||||
"chat": "\033[94m", # 亮蓝色
|
"chat": "\033[94m", # 亮蓝色
|
||||||
"config": "\033[93m", # 亮黄色
|
"config": "\033[93m", # 亮黄色
|
||||||
"common": "\033[95m", # 亮紫色
|
"common": "\033[95m", # 亮紫色
|
||||||
"tools": "\033[96m", # 亮青色
|
"tools": "\033[96m", # 亮青色
|
||||||
"lpmm": "\033[96m",
|
"lpmm": "\033[96m",
|
||||||
"plugin_system": "\033[91m", # 亮红色
|
"plugin_system": "\033[91m", # 亮红色
|
||||||
"experimental": "\033[97m", # 亮白色
|
"experimental": "\033[97m", # 亮白色
|
||||||
"person_info": "\033[32m", # 绿色
|
"person_info": "\033[32m", # 绿色
|
||||||
"individuality": "\033[34m", # 蓝色
|
"individuality": "\033[34m", # 蓝色
|
||||||
"manager": "\033[35m", # 紫色
|
"manager": "\033[35m", # 紫色
|
||||||
"llm_models": "\033[36m", # 青色
|
"llm_models": "\033[36m", # 青色
|
||||||
"plugins": "\033[31m", # 红色
|
"plugins": "\033[31m", # 红色
|
||||||
"plugin_api": "\033[33m", # 黄色
|
"plugin_api": "\033[33m", # 黄色
|
||||||
"remote": "\033[38;5;93m", # 紫蓝色
|
"remote": "\033[38;5;93m", # 紫蓝色
|
||||||
}
|
}
|
||||||
|
|
||||||
RESET_COLOR = "\033[0m"
|
RESET_COLOR = "\033[0m"
|
||||||
@@ -153,21 +157,21 @@ RESET_COLOR = "\033[0m"
|
|||||||
|
|
||||||
class ModuleColoredConsoleRenderer:
|
class ModuleColoredConsoleRenderer:
|
||||||
"""自定义控制台渲染器,为不同模块提供不同颜色"""
|
"""自定义控制台渲染器,为不同模块提供不同颜色"""
|
||||||
|
|
||||||
def __init__(self, colors=True):
|
def __init__(self, colors=True):
|
||||||
self._colors = colors
|
self._colors = colors
|
||||||
self._config = LOG_CONFIG
|
self._config = LOG_CONFIG
|
||||||
|
|
||||||
# 日志级别颜色
|
# 日志级别颜色
|
||||||
self._level_colors = {
|
self._level_colors = {
|
||||||
"debug": "\033[38;5;208m", # 橙色
|
"debug": "\033[38;5;208m", # 橙色
|
||||||
"info": "\033[34m", # 蓝色
|
"info": "\033[34m", # 蓝色
|
||||||
"success": "\033[32m", # 绿色
|
"success": "\033[32m", # 绿色
|
||||||
"warning": "\033[33m", # 黄色
|
"warning": "\033[33m", # 黄色
|
||||||
"error": "\033[31m", # 红色
|
"error": "\033[31m", # 红色
|
||||||
"critical": "\033[35m", # 紫色
|
"critical": "\033[35m", # 紫色
|
||||||
}
|
}
|
||||||
|
|
||||||
# 根据配置决定是否启用颜色
|
# 根据配置决定是否启用颜色
|
||||||
color_text = self._config.get("color_text", "title")
|
color_text = self._config.get("color_text", "title")
|
||||||
if color_text == "none":
|
if color_text == "none":
|
||||||
@@ -181,7 +185,7 @@ class ModuleColoredConsoleRenderer:
|
|||||||
else:
|
else:
|
||||||
self._enable_module_colors = True
|
self._enable_module_colors = True
|
||||||
self._enable_level_colors = False
|
self._enable_level_colors = False
|
||||||
|
|
||||||
def __call__(self, logger, method_name, event_dict):
|
def __call__(self, logger, method_name, event_dict):
|
||||||
"""渲染日志消息"""
|
"""渲染日志消息"""
|
||||||
# 获取基本信息
|
# 获取基本信息
|
||||||
@@ -189,14 +193,14 @@ class ModuleColoredConsoleRenderer:
|
|||||||
level = event_dict.get("level", "info")
|
level = event_dict.get("level", "info")
|
||||||
logger_name = event_dict.get("logger_name", "")
|
logger_name = event_dict.get("logger_name", "")
|
||||||
event = event_dict.get("event", "")
|
event = event_dict.get("event", "")
|
||||||
|
|
||||||
# 构建输出
|
# 构建输出
|
||||||
parts = []
|
parts = []
|
||||||
|
|
||||||
# 日志级别样式配置
|
# 日志级别样式配置
|
||||||
log_level_style = self._config.get("log_level_style", "lite")
|
log_level_style = self._config.get("log_level_style", "lite")
|
||||||
level_color = self._level_colors.get(level.lower(), "") if self._colors else ""
|
level_color = self._level_colors.get(level.lower(), "") if self._colors else ""
|
||||||
|
|
||||||
# 时间戳(lite模式下按级别着色)
|
# 时间戳(lite模式下按级别着色)
|
||||||
if timestamp:
|
if timestamp:
|
||||||
if log_level_style == "lite" and level_color:
|
if log_level_style == "lite" and level_color:
|
||||||
@@ -204,7 +208,7 @@ class ModuleColoredConsoleRenderer:
|
|||||||
else:
|
else:
|
||||||
timestamp_part = timestamp
|
timestamp_part = timestamp
|
||||||
parts.append(timestamp_part)
|
parts.append(timestamp_part)
|
||||||
|
|
||||||
# 日志级别显示(根据配置样式)
|
# 日志级别显示(根据配置样式)
|
||||||
if log_level_style == "full":
|
if log_level_style == "full":
|
||||||
# 显示完整级别名并着色
|
# 显示完整级别名并着色
|
||||||
@@ -214,7 +218,7 @@ class ModuleColoredConsoleRenderer:
|
|||||||
else:
|
else:
|
||||||
level_part = f"[{level_text:>8}]"
|
level_part = f"[{level_text:>8}]"
|
||||||
parts.append(level_part)
|
parts.append(level_part)
|
||||||
|
|
||||||
elif log_level_style == "compact":
|
elif log_level_style == "compact":
|
||||||
# 只显示首字母并着色
|
# 只显示首字母并着色
|
||||||
level_text = level.upper()[0]
|
level_text = level.upper()[0]
|
||||||
@@ -223,9 +227,9 @@ class ModuleColoredConsoleRenderer:
|
|||||||
else:
|
else:
|
||||||
level_part = f"[{level_text:>8}]"
|
level_part = f"[{level_text:>8}]"
|
||||||
parts.append(level_part)
|
parts.append(level_part)
|
||||||
|
|
||||||
# lite模式不显示级别,只给时间戳着色
|
# lite模式不显示级别,只给时间戳着色
|
||||||
|
|
||||||
# 模块名称(带颜色)
|
# 模块名称(带颜色)
|
||||||
if logger_name:
|
if logger_name:
|
||||||
if self._colors and self._enable_module_colors:
|
if self._colors and self._enable_module_colors:
|
||||||
@@ -237,7 +241,7 @@ class ModuleColoredConsoleRenderer:
|
|||||||
else:
|
else:
|
||||||
module_part = f"[{logger_name}]"
|
module_part = f"[{logger_name}]"
|
||||||
parts.append(module_part)
|
parts.append(module_part)
|
||||||
|
|
||||||
# 消息内容(确保转换为字符串)
|
# 消息内容(确保转换为字符串)
|
||||||
if isinstance(event, str):
|
if isinstance(event, str):
|
||||||
parts.append(event)
|
parts.append(event)
|
||||||
@@ -250,7 +254,7 @@ class ModuleColoredConsoleRenderer:
|
|||||||
else:
|
else:
|
||||||
# 其他类型直接转换为字符串
|
# 其他类型直接转换为字符串
|
||||||
parts.append(str(event))
|
parts.append(str(event))
|
||||||
|
|
||||||
# 处理其他字段
|
# 处理其他字段
|
||||||
extras = []
|
extras = []
|
||||||
for key, value in event_dict.items():
|
for key, value in event_dict.items():
|
||||||
@@ -264,10 +268,10 @@ class ModuleColoredConsoleRenderer:
|
|||||||
else:
|
else:
|
||||||
value_str = str(value)
|
value_str = str(value)
|
||||||
extras.append(f"{key}={value_str}")
|
extras.append(f"{key}={value_str}")
|
||||||
|
|
||||||
if extras:
|
if extras:
|
||||||
parts.append(" ".join(extras))
|
parts.append(" ".join(extras))
|
||||||
|
|
||||||
return " ".join(parts)
|
return " ".join(parts)
|
||||||
|
|
||||||
|
|
||||||
@@ -288,6 +292,7 @@ logging.basicConfig(
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def configure_structlog():
|
def configure_structlog():
|
||||||
"""配置structlog"""
|
"""配置structlog"""
|
||||||
structlog.configure(
|
structlog.configure(
|
||||||
@@ -306,6 +311,7 @@ def configure_structlog():
|
|||||||
cache_logger_on_first_use=True,
|
cache_logger_on_first_use=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# 配置structlog
|
# 配置structlog
|
||||||
configure_structlog()
|
configure_structlog()
|
||||||
|
|
||||||
@@ -343,39 +349,43 @@ for handler in root_logger.handlers:
|
|||||||
else:
|
else:
|
||||||
handler.setFormatter(console_formatter)
|
handler.setFormatter(console_formatter)
|
||||||
|
|
||||||
|
|
||||||
# 立即配置日志系统,确保最早期的日志也使用正确格式
|
# 立即配置日志系统,确保最早期的日志也使用正确格式
|
||||||
def _immediate_setup():
|
def _immediate_setup():
|
||||||
"""立即设置日志系统,在模块导入时就生效"""
|
"""立即设置日志系统,在模块导入时就生效"""
|
||||||
# 重新配置structlog
|
# 重新配置structlog
|
||||||
configure_structlog()
|
configure_structlog()
|
||||||
|
|
||||||
# 清除所有已有的handler,重新配置
|
# 清除所有已有的handler,重新配置
|
||||||
root_logger = logging.getLogger()
|
root_logger = logging.getLogger()
|
||||||
for handler in root_logger.handlers[:]:
|
for handler in root_logger.handlers[:]:
|
||||||
root_logger.removeHandler(handler)
|
root_logger.removeHandler(handler)
|
||||||
|
|
||||||
# 重新添加配置好的handler
|
# 重新添加配置好的handler
|
||||||
root_logger.addHandler(logging.handlers.RotatingFileHandler(
|
root_logger.addHandler(
|
||||||
LOG_DIR / "app.log.jsonl",
|
logging.handlers.RotatingFileHandler(
|
||||||
maxBytes=10 * 1024 * 1024,
|
LOG_DIR / "app.log.jsonl",
|
||||||
backupCount=5,
|
maxBytes=10 * 1024 * 1024,
|
||||||
encoding="utf-8",
|
backupCount=5,
|
||||||
))
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
)
|
||||||
root_logger.addHandler(logging.StreamHandler())
|
root_logger.addHandler(logging.StreamHandler())
|
||||||
|
|
||||||
# 设置格式化器
|
# 设置格式化器
|
||||||
for handler in root_logger.handlers:
|
for handler in root_logger.handlers:
|
||||||
if isinstance(handler, logging.handlers.RotatingFileHandler):
|
if isinstance(handler, logging.handlers.RotatingFileHandler):
|
||||||
handler.setFormatter(file_formatter)
|
handler.setFormatter(file_formatter)
|
||||||
else:
|
else:
|
||||||
handler.setFormatter(console_formatter)
|
handler.setFormatter(console_formatter)
|
||||||
|
|
||||||
# 配置第三方库日志
|
# 配置第三方库日志
|
||||||
configure_third_party_loggers()
|
configure_third_party_loggers()
|
||||||
|
|
||||||
# 重新配置所有已存在的logger
|
# 重新配置所有已存在的logger
|
||||||
reconfigure_existing_loggers()
|
reconfigure_existing_loggers()
|
||||||
|
|
||||||
|
|
||||||
# 立即执行配置
|
# 立即执行配置
|
||||||
_immediate_setup()
|
_immediate_setup()
|
||||||
|
|
||||||
@@ -418,7 +428,7 @@ def configure_logging(
|
|||||||
|
|
||||||
def set_module_color(module_name: str, color_code: str):
|
def set_module_color(module_name: str, color_code: str):
|
||||||
"""为指定模块设置颜色
|
"""为指定模块设置颜色
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
module_name: 模块名称
|
module_name: 模块名称
|
||||||
color_code: ANSI颜色代码,例如 '\033[92m' 表示亮绿色
|
color_code: ANSI颜色代码,例如 '\033[92m' 表示亮绿色
|
||||||
@@ -435,27 +445,29 @@ def reload_log_config():
|
|||||||
"""重新加载日志配置"""
|
"""重新加载日志配置"""
|
||||||
global LOG_CONFIG
|
global LOG_CONFIG
|
||||||
LOG_CONFIG = load_log_config()
|
LOG_CONFIG = load_log_config()
|
||||||
|
|
||||||
# 重新配置console渲染器
|
# 重新配置console渲染器
|
||||||
root_logger = logging.getLogger()
|
root_logger = logging.getLogger()
|
||||||
for handler in root_logger.handlers:
|
for handler in root_logger.handlers:
|
||||||
if isinstance(handler, logging.StreamHandler) and not isinstance(handler, logging.handlers.RotatingFileHandler):
|
if isinstance(handler, logging.StreamHandler) and not isinstance(handler, logging.handlers.RotatingFileHandler):
|
||||||
# 这是控制台处理器,更新其格式化器
|
# 这是控制台处理器,更新其格式化器
|
||||||
handler.setFormatter(structlog.stdlib.ProcessorFormatter(
|
handler.setFormatter(
|
||||||
processor=ModuleColoredConsoleRenderer(colors=True),
|
structlog.stdlib.ProcessorFormatter(
|
||||||
foreign_pre_chain=[
|
processor=ModuleColoredConsoleRenderer(colors=True),
|
||||||
structlog.stdlib.add_logger_name,
|
foreign_pre_chain=[
|
||||||
structlog.stdlib.add_log_level,
|
structlog.stdlib.add_logger_name,
|
||||||
structlog.stdlib.PositionalArgumentsFormatter(),
|
structlog.stdlib.add_log_level,
|
||||||
structlog.processors.TimeStamper(fmt=get_timestamp_format(), utc=False),
|
structlog.stdlib.PositionalArgumentsFormatter(),
|
||||||
structlog.processors.StackInfoRenderer(),
|
structlog.processors.TimeStamper(fmt=get_timestamp_format(), utc=False),
|
||||||
structlog.processors.format_exc_info,
|
structlog.processors.StackInfoRenderer(),
|
||||||
],
|
structlog.processors.format_exc_info,
|
||||||
))
|
],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
# 重新配置第三方库日志
|
# 重新配置第三方库日志
|
||||||
configure_third_party_loggers()
|
configure_third_party_loggers()
|
||||||
|
|
||||||
# 重新配置所有已存在的logger
|
# 重新配置所有已存在的logger
|
||||||
reconfigure_existing_loggers()
|
reconfigure_existing_loggers()
|
||||||
|
|
||||||
@@ -469,27 +481,29 @@ def force_reset_all_loggers():
|
|||||||
"""强制重置所有logger,解决格式不一致问题"""
|
"""强制重置所有logger,解决格式不一致问题"""
|
||||||
# 清除所有现有的logger配置
|
# 清除所有现有的logger配置
|
||||||
logging.getLogger().manager.loggerDict.clear()
|
logging.getLogger().manager.loggerDict.clear()
|
||||||
|
|
||||||
# 重新配置根logger
|
# 重新配置根logger
|
||||||
root_logger = logging.getLogger()
|
root_logger = logging.getLogger()
|
||||||
root_logger.handlers.clear()
|
root_logger.handlers.clear()
|
||||||
|
|
||||||
# 重新添加我们的handler
|
# 重新添加我们的handler
|
||||||
root_logger.addHandler(logging.handlers.RotatingFileHandler(
|
root_logger.addHandler(
|
||||||
LOG_DIR / "app.log.jsonl",
|
logging.handlers.RotatingFileHandler(
|
||||||
maxBytes=10 * 1024 * 1024,
|
LOG_DIR / "app.log.jsonl",
|
||||||
backupCount=5,
|
maxBytes=10 * 1024 * 1024,
|
||||||
encoding="utf-8",
|
backupCount=5,
|
||||||
))
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
)
|
||||||
root_logger.addHandler(logging.StreamHandler())
|
root_logger.addHandler(logging.StreamHandler())
|
||||||
|
|
||||||
# 设置格式化器
|
# 设置格式化器
|
||||||
for handler in root_logger.handlers:
|
for handler in root_logger.handlers:
|
||||||
if isinstance(handler, logging.handlers.RotatingFileHandler):
|
if isinstance(handler, logging.handlers.RotatingFileHandler):
|
||||||
handler.setFormatter(file_formatter)
|
handler.setFormatter(file_formatter)
|
||||||
else:
|
else:
|
||||||
handler.setFormatter(console_formatter)
|
handler.setFormatter(console_formatter)
|
||||||
|
|
||||||
# 设置级别
|
# 设置级别
|
||||||
global_log_level = LOG_CONFIG.get("log_level", "INFO")
|
global_log_level = LOG_CONFIG.get("log_level", "INFO")
|
||||||
root_logger.setLevel(getattr(logging, global_log_level.upper(), logging.INFO))
|
root_logger.setLevel(getattr(logging, global_log_level.upper(), logging.INFO))
|
||||||
@@ -497,14 +511,14 @@ def force_reset_all_loggers():
|
|||||||
|
|
||||||
def initialize_logging():
|
def initialize_logging():
|
||||||
"""手动初始化日志系统,确保所有logger都使用正确的配置
|
"""手动初始化日志系统,确保所有logger都使用正确的配置
|
||||||
|
|
||||||
在应用程序的早期调用此函数,确保所有模块都使用统一的日志配置
|
在应用程序的早期调用此函数,确保所有模块都使用统一的日志配置
|
||||||
"""
|
"""
|
||||||
global LOG_CONFIG
|
global LOG_CONFIG
|
||||||
LOG_CONFIG = load_log_config()
|
LOG_CONFIG = load_log_config()
|
||||||
configure_third_party_loggers()
|
configure_third_party_loggers()
|
||||||
reconfigure_existing_loggers()
|
reconfigure_existing_loggers()
|
||||||
|
|
||||||
# 输出初始化信息
|
# 输出初始化信息
|
||||||
logger = get_logger("logger")
|
logger = get_logger("logger")
|
||||||
log_level = LOG_CONFIG.get("log_level", "INFO")
|
log_level = LOG_CONFIG.get("log_level", "INFO")
|
||||||
@@ -515,16 +529,16 @@ def force_initialize_logging():
|
|||||||
"""强制重新初始化整个日志系统,解决格式不一致问题"""
|
"""强制重新初始化整个日志系统,解决格式不一致问题"""
|
||||||
global LOG_CONFIG
|
global LOG_CONFIG
|
||||||
LOG_CONFIG = load_log_config()
|
LOG_CONFIG = load_log_config()
|
||||||
|
|
||||||
# 强制重置所有logger
|
# 强制重置所有logger
|
||||||
force_reset_all_loggers()
|
force_reset_all_loggers()
|
||||||
|
|
||||||
# 重新配置structlog
|
# 重新配置structlog
|
||||||
configure_structlog()
|
configure_structlog()
|
||||||
|
|
||||||
# 配置第三方库
|
# 配置第三方库
|
||||||
configure_third_party_loggers()
|
configure_third_party_loggers()
|
||||||
|
|
||||||
# 输出初始化信息
|
# 输出初始化信息
|
||||||
logger = get_logger("logger")
|
logger = get_logger("logger")
|
||||||
log_level = LOG_CONFIG.get("log_level", "INFO")
|
log_level = LOG_CONFIG.get("log_level", "INFO")
|
||||||
@@ -533,14 +547,14 @@ def force_initialize_logging():
|
|||||||
|
|
||||||
def show_module_colors():
|
def show_module_colors():
|
||||||
"""显示所有模块的颜色效果"""
|
"""显示所有模块的颜色效果"""
|
||||||
logger = get_logger("demo")
|
get_logger("demo")
|
||||||
print("\n=== 模块颜色展示 ===")
|
print("\n=== 模块颜色展示 ===")
|
||||||
|
|
||||||
for module_name, color_code in MODULE_COLORS.items():
|
for module_name, _color_code in MODULE_COLORS.items():
|
||||||
# 临时创建一个该模块的logger来展示颜色
|
# 临时创建一个该模块的logger来展示颜色
|
||||||
demo_logger = structlog.get_logger(module_name).bind(logger_name=module_name)
|
demo_logger = structlog.get_logger(module_name).bind(logger_name=module_name)
|
||||||
demo_logger.info(f"这是 {module_name} 模块的颜色效果")
|
demo_logger.info(f"这是 {module_name} 模块的颜色效果")
|
||||||
|
|
||||||
print("=== 颜色展示结束 ===\n")
|
print("=== 颜色展示结束 ===\n")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user