use structlog instead of loguru
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from peewee import Model, DoubleField, IntegerField, BooleanField, TextField, FloatField, DateTimeField
|
||||
from .database import db
|
||||
import datetime
|
||||
from ..logger_manager import get_logger
|
||||
from src.common.logger import get_logger
|
||||
|
||||
logger = get_logger("database_model")
|
||||
# 请在此处定义您的数据库实例。
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
import functools
|
||||
import inspect
|
||||
from typing import Callable, Any
|
||||
from .logger import logger, add_custom_style_handler
|
||||
from rich.traceback import install
|
||||
|
||||
install(extra_lines=3)
|
||||
|
||||
|
||||
def use_log_style(
|
||||
style_name: str,
|
||||
console_format: str,
|
||||
console_level: str = "INFO",
|
||||
# file_format: Optional[str] = None, # 暂未支持文件输出
|
||||
# file_level: str = "DEBUG",
|
||||
) -> Callable:
|
||||
"""装饰器:为函数内的日志启用特定的自定义样式。
|
||||
|
||||
Args:
|
||||
style_name (str): 自定义样式的唯一名称。
|
||||
console_format (str): 控制台输出的格式字符串。
|
||||
console_level (str, optional): 控制台日志级别. Defaults to "INFO".
|
||||
# file_format (Optional[str], optional): 文件输出格式 (暂未支持). Defaults to None.
|
||||
# file_level (str, optional): 文件日志级别 (暂未支持). Defaults to "DEBUG".
|
||||
|
||||
Returns:
|
||||
Callable: 返回装饰器本身。
|
||||
"""
|
||||
|
||||
def decorator(func: Callable) -> Callable:
|
||||
# 获取被装饰函数所在的模块名
|
||||
module = inspect.getmodule(func)
|
||||
if module is None:
|
||||
# 如果无法获取模块(例如,在交互式解释器中定义函数),则使用默认名称
|
||||
module_name = "unknown_module"
|
||||
logger.warning(f"无法确定函数 {func.__name__} 的模块,将使用 '{module_name}'")
|
||||
else:
|
||||
module_name = module.__name__
|
||||
|
||||
# 在函数首次被调用(或模块加载时)确保自定义处理器已添加
|
||||
# 注意:这会在模块加载时执行,而不是每次函数调用时
|
||||
# print(f"Setting up custom style '{style_name}' for module '{module_name}' in decorator definition")
|
||||
add_custom_style_handler(
|
||||
module_name=module_name,
|
||||
style_name=style_name,
|
||||
console_format=console_format,
|
||||
console_level=console_level,
|
||||
# file_format=file_format,
|
||||
# file_level=file_level,
|
||||
)
|
||||
|
||||
@functools.wraps(func)
|
||||
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
||||
# 创建绑定了模块名和自定义样式标记的 logger 实例
|
||||
custom_logger = logger.bind(module=module_name, custom_style=style_name)
|
||||
# print(f"Executing {func.__name__} with custom logger for style '{style_name}'")
|
||||
# 将自定义 logger 作为第一个参数传递给原函数
|
||||
# 注意:这要求被装饰的函数第一个参数用于接收 logger
|
||||
try:
|
||||
return func(custom_logger, *args, **kwargs)
|
||||
except TypeError as e:
|
||||
# 捕获可能的类型错误,比如原函数不接受 logger 参数
|
||||
logger.error(
|
||||
f"调用 {func.__name__} 时出错:请确保该函数接受一个 logger 实例作为其第一个参数。错误:{e}"
|
||||
)
|
||||
# 可以选择重新抛出异常或返回特定值
|
||||
raise e
|
||||
|
||||
return wrapper
|
||||
|
||||
return decorator
|
||||
|
||||
|
||||
# --- 示例用法 (可以在其他模块中这样使用) ---
|
||||
|
||||
# # 假设这是你的模块 my_module.py
|
||||
# from src.common.log_decorators import use_log_style
|
||||
# from src.common.logger import get_module_logger, LoguruLogger
|
||||
|
||||
# # 获取模块的标准 logger
|
||||
# standard_logger = get_module_logger(__name__)
|
||||
|
||||
# # 定义一个自定义样式
|
||||
# MY_SPECIAL_STYLE = "special"
|
||||
# MY_SPECIAL_FORMAT = "<bg yellow><black> SPECIAL [{time:HH:mm:ss}] </black></bg yellow> | <level>{message}</level>"
|
||||
|
||||
# @use_log_style(style_name=MY_SPECIAL_STYLE, console_format=MY_SPECIAL_FORMAT)
|
||||
# def my_function_with_special_logs(custom_logger: LoguruLogger, x: int, y: int):
|
||||
# standard_logger.info("这是一条使用标准格式的日志")
|
||||
# custom_logger.info(f"开始执行特殊操作,参数: x={x}, y={y}")
|
||||
# result = x + y
|
||||
# custom_logger.success(f"特殊操作完成,结果: {result}")
|
||||
# standard_logger.info("标准格式日志:函数即将结束")
|
||||
# return result
|
||||
|
||||
# @use_log_style(style_name="another_style", console_format="<cyan>任务:</cyan> {message}")
|
||||
# def another_task(task_logger: LoguruLogger, task_name: str):
|
||||
# standard_logger.debug("准备执行另一个任务")
|
||||
# task_logger.info(f"正在处理任务 '{task_name}'")
|
||||
# # ... 执行任务 ...
|
||||
# task_logger.warning("任务处理中遇到一个警告")
|
||||
# standard_logger.info("另一个任务的标准日志")
|
||||
|
||||
# if __name__ == "__main__":
|
||||
# print("\n--- 调用 my_function_with_special_logs ---")
|
||||
# my_function_with_special_logs(10, 5)
|
||||
# print("\n--- 调用 another_task ---")
|
||||
# another_task("数据清理")
|
||||
# print("\n--- 单独使用标准 logger ---")
|
||||
# standard_logger.info("这是一条完全独立的标准日志")
|
||||
1233
src/common/logger.py
1233
src/common/logger.py
File diff suppressed because it is too large
Load Diff
@@ -1,118 +0,0 @@
|
||||
from src.common.logger import get_module_logger, LogConfig
|
||||
from src.common.logger import (
|
||||
BACKGROUND_TASKS_STYLE_CONFIG,
|
||||
MAIN_STYLE_CONFIG,
|
||||
MEMORY_STYLE_CONFIG,
|
||||
PFC_STYLE_CONFIG,
|
||||
MOOD_STYLE_CONFIG,
|
||||
TOOL_USE_STYLE_CONFIG,
|
||||
RELATION_STYLE_CONFIG,
|
||||
CONFIG_STYLE_CONFIG,
|
||||
HEARTFLOW_STYLE_CONFIG,
|
||||
CHAT_STYLE_CONFIG,
|
||||
EMOJI_STYLE_CONFIG,
|
||||
SUB_HEARTFLOW_STYLE_CONFIG,
|
||||
SUB_HEARTFLOW_MIND_STYLE_CONFIG,
|
||||
SUBHEARTFLOW_MANAGER_STYLE_CONFIG,
|
||||
BASE_TOOL_STYLE_CONFIG,
|
||||
CHAT_STREAM_STYLE_CONFIG,
|
||||
PERSON_INFO_STYLE_CONFIG,
|
||||
WILLING_STYLE_CONFIG,
|
||||
PFC_ACTION_PLANNER_STYLE_CONFIG,
|
||||
STATISTIC_STYLE_CONFIG,
|
||||
NORMAL_CHAT_STYLE_CONFIG,
|
||||
FOCUS_CHAT_STYLE_CONFIG,
|
||||
LPMM_STYLE_CONFIG,
|
||||
HFC_STYLE_CONFIG,
|
||||
OBSERVATION_STYLE_CONFIG,
|
||||
PLANNER_STYLE_CONFIG,
|
||||
PROCESSOR_STYLE_CONFIG,
|
||||
ACTION_TAKEN_STYLE_CONFIG,
|
||||
TIANYI_STYLE_CONFIG,
|
||||
REMOTE_STYLE_CONFIG,
|
||||
TOPIC_STYLE_CONFIG,
|
||||
SENDER_STYLE_CONFIG,
|
||||
CONFIRM_STYLE_CONFIG,
|
||||
MODEL_UTILS_STYLE_CONFIG,
|
||||
PROMPT_STYLE_CONFIG,
|
||||
CHANGE_MOOD_TOOL_STYLE_CONFIG,
|
||||
CHANGE_RELATIONSHIP_TOOL_STYLE_CONFIG,
|
||||
GET_KNOWLEDGE_TOOL_STYLE_CONFIG,
|
||||
GET_TIME_DATE_TOOL_STYLE_CONFIG,
|
||||
LPMM_GET_KNOWLEDGE_TOOL_STYLE_CONFIG,
|
||||
MESSAGE_BUFFER_STYLE_CONFIG,
|
||||
CHAT_MESSAGE_STYLE_CONFIG,
|
||||
CHAT_IMAGE_STYLE_CONFIG,
|
||||
INIT_STYLE_CONFIG,
|
||||
INTEREST_CHAT_STYLE_CONFIG,
|
||||
API_SERVER_STYLE_CONFIG,
|
||||
NORMAL_CHAT_RESPONSE_STYLE_CONFIG,
|
||||
EXPRESS_STYLE_CONFIG,
|
||||
ACTION_MANAGER_STYLE_CONFIG,
|
||||
)
|
||||
|
||||
# 可根据实际需要补充更多模块配置
|
||||
MODULE_LOGGER_CONFIGS = {
|
||||
"background_tasks": BACKGROUND_TASKS_STYLE_CONFIG, # 后台任务
|
||||
"main": MAIN_STYLE_CONFIG, # 主程序
|
||||
"memory": MEMORY_STYLE_CONFIG, # 海马体
|
||||
"pfc": PFC_STYLE_CONFIG, # PFC
|
||||
"mood": MOOD_STYLE_CONFIG, # 心情
|
||||
"tool_use": TOOL_USE_STYLE_CONFIG, # 工具使用
|
||||
"relation": RELATION_STYLE_CONFIG, # 关系
|
||||
"config": CONFIG_STYLE_CONFIG, # 配置
|
||||
"heartflow": HEARTFLOW_STYLE_CONFIG, # 麦麦大脑袋
|
||||
"normal_chat_response": NORMAL_CHAT_RESPONSE_STYLE_CONFIG, # 麦麦组织语言
|
||||
"chat": CHAT_STYLE_CONFIG, # 见闻
|
||||
"emoji": EMOJI_STYLE_CONFIG, # 表情包
|
||||
"sub_heartflow": SUB_HEARTFLOW_STYLE_CONFIG, # 麦麦水群
|
||||
"sub_heartflow_mind": SUB_HEARTFLOW_MIND_STYLE_CONFIG, # 麦麦小脑袋
|
||||
"subheartflow_manager": SUBHEARTFLOW_MANAGER_STYLE_CONFIG, # 麦麦水群[管理]
|
||||
"base_tool": BASE_TOOL_STYLE_CONFIG, # 工具使用
|
||||
"chat_stream": CHAT_STREAM_STYLE_CONFIG, # 聊天流
|
||||
"person_info": PERSON_INFO_STYLE_CONFIG, # 人物信息
|
||||
"willing": WILLING_STYLE_CONFIG, # 意愿
|
||||
"pfc_action_planner": PFC_ACTION_PLANNER_STYLE_CONFIG, # PFC私聊规划
|
||||
"statistic": STATISTIC_STYLE_CONFIG, # 麦麦统计
|
||||
"lpmm": LPMM_STYLE_CONFIG, # LPMM
|
||||
"hfc": HFC_STYLE_CONFIG, # HFC
|
||||
"observation": OBSERVATION_STYLE_CONFIG, # 聊天观察
|
||||
"planner": PLANNER_STYLE_CONFIG, # 规划器
|
||||
"processor": PROCESSOR_STYLE_CONFIG, # 处理器
|
||||
"action_taken": ACTION_TAKEN_STYLE_CONFIG, # 动作
|
||||
"tianyi": TIANYI_STYLE_CONFIG, # 天依
|
||||
"remote": REMOTE_STYLE_CONFIG, # 远程
|
||||
"topic": TOPIC_STYLE_CONFIG, # 话题
|
||||
"sender": SENDER_STYLE_CONFIG, # 消息发送
|
||||
"confirm": CONFIRM_STYLE_CONFIG, # EULA与PRIVACY确认
|
||||
"model_utils": MODEL_UTILS_STYLE_CONFIG, # 模型工具
|
||||
"prompt": PROMPT_STYLE_CONFIG, # 提示词
|
||||
"change_mood_tool": CHANGE_MOOD_TOOL_STYLE_CONFIG, # 改变心情工具
|
||||
"change_relationship": CHANGE_RELATIONSHIP_TOOL_STYLE_CONFIG, # 改变关系工具
|
||||
"get_knowledge_tool": GET_KNOWLEDGE_TOOL_STYLE_CONFIG, # 获取知识工具
|
||||
"get_time_date": GET_TIME_DATE_TOOL_STYLE_CONFIG, # 获取时间日期工具
|
||||
"lpm_get_knowledge_tool": LPMM_GET_KNOWLEDGE_TOOL_STYLE_CONFIG, # LPMM获取知识工具
|
||||
"message_buffer": MESSAGE_BUFFER_STYLE_CONFIG, # 消息缓冲
|
||||
"chat_message": CHAT_MESSAGE_STYLE_CONFIG, # 聊天消息
|
||||
"chat_image": CHAT_IMAGE_STYLE_CONFIG, # 聊天图片
|
||||
"init": INIT_STYLE_CONFIG, # 初始化
|
||||
"interest_chat": INTEREST_CHAT_STYLE_CONFIG, # 兴趣
|
||||
"api": API_SERVER_STYLE_CONFIG, # API服务器
|
||||
"normal_chat": NORMAL_CHAT_STYLE_CONFIG, # 一般水群
|
||||
"focus_chat": FOCUS_CHAT_STYLE_CONFIG, # 专注水群
|
||||
"expressor": EXPRESS_STYLE_CONFIG, # 麦麦表达
|
||||
"action_manager": ACTION_MANAGER_STYLE_CONFIG, # 动作选择
|
||||
# ...如有更多模块,继续添加...
|
||||
}
|
||||
|
||||
|
||||
def get_logger(module_name: str):
|
||||
style_config = MODULE_LOGGER_CONFIGS.get(module_name)
|
||||
if style_config:
|
||||
log_config = LogConfig(
|
||||
console_format=style_config["console_format"],
|
||||
file_format=style_config["file_format"],
|
||||
)
|
||||
return get_module_logger(module_name, config=log_config)
|
||||
# 若无特殊样式,使用默认
|
||||
return get_module_logger(module_name)
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
__version__ = "0.1.0"
|
||||
|
||||
from .api import global_api
|
||||
from .api import get_global_api
|
||||
|
||||
|
||||
__all__ = [
|
||||
"global_api",
|
||||
"get_global_api",
|
||||
]
|
||||
|
||||
@@ -1,55 +1,59 @@
|
||||
from src.common.server import global_server
|
||||
from src.common.server import get_global_server
|
||||
import os
|
||||
import importlib.metadata
|
||||
from maim_message import MessageServer
|
||||
from src.common.logger_manager import get_logger
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import global_config
|
||||
|
||||
global_api = None
|
||||
|
||||
# 检查maim_message版本
|
||||
try:
|
||||
maim_message_version = importlib.metadata.version("maim_message")
|
||||
version_compatible = [int(x) for x in maim_message_version.split(".")] >= [0, 3, 3]
|
||||
except (importlib.metadata.PackageNotFoundError, ValueError):
|
||||
version_compatible = False
|
||||
def get_global_api() -> MessageServer:
|
||||
"""获取全局MessageServer实例"""
|
||||
global global_api
|
||||
if global_api is None:
|
||||
# 检查maim_message版本
|
||||
try:
|
||||
maim_message_version = importlib.metadata.version("maim_message")
|
||||
version_compatible = [int(x) for x in maim_message_version.split(".")] >= [0, 3, 3]
|
||||
except (importlib.metadata.PackageNotFoundError, ValueError):
|
||||
version_compatible = False
|
||||
|
||||
# 读取配置项
|
||||
maim_message_config = global_config.maim_message
|
||||
# 读取配置项
|
||||
maim_message_config = global_config.maim_message
|
||||
|
||||
# 设置基本参数
|
||||
kwargs = {
|
||||
"host": os.environ["HOST"],
|
||||
"port": int(os.environ["PORT"]),
|
||||
"app": global_server.get_app(),
|
||||
}
|
||||
# 设置基本参数
|
||||
kwargs = {
|
||||
"host": os.environ["HOST"],
|
||||
"port": int(os.environ["PORT"]),
|
||||
"app": get_global_server().get_app(),
|
||||
}
|
||||
|
||||
# 只有在版本 >= 0.3.0 时才使用高级特性
|
||||
if version_compatible:
|
||||
# 添加自定义logger
|
||||
maim_message_logger = get_logger("maim_message")
|
||||
kwargs["custom_logger"] = maim_message_logger
|
||||
# 只有在版本 >= 0.3.0 时才使用高级特性
|
||||
if version_compatible:
|
||||
# 添加自定义logger
|
||||
maim_message_logger = get_logger("maim_message")
|
||||
kwargs["custom_logger"] = maim_message_logger
|
||||
|
||||
# 添加token认证
|
||||
if maim_message_config.auth_token:
|
||||
if len(maim_message_config.auth_token) > 0:
|
||||
kwargs["enable_token"] = True
|
||||
# 添加token认证
|
||||
if maim_message_config.auth_token:
|
||||
if len(maim_message_config.auth_token) > 0:
|
||||
kwargs["enable_token"] = True
|
||||
|
||||
if maim_message_config.use_custom:
|
||||
# 添加WSS模式支持
|
||||
del kwargs["app"]
|
||||
kwargs["host"] = maim_message_config.host
|
||||
kwargs["port"] = maim_message_config.port
|
||||
kwargs["mode"] = maim_message_config.mode
|
||||
if maim_message_config.use_wss:
|
||||
if maim_message_config.cert_file:
|
||||
kwargs["ssl_certfile"] = maim_message_config.cert_file
|
||||
if maim_message_config.key_file:
|
||||
kwargs["ssl_keyfile"] = maim_message_config.key_file
|
||||
kwargs["enable_custom_uvicorn_logger"] = False
|
||||
if maim_message_config.use_custom:
|
||||
# 添加WSS模式支持
|
||||
del kwargs["app"]
|
||||
kwargs["host"] = maim_message_config.host
|
||||
kwargs["port"] = maim_message_config.port
|
||||
kwargs["mode"] = maim_message_config.mode
|
||||
if maim_message_config.use_wss:
|
||||
if maim_message_config.cert_file:
|
||||
kwargs["ssl_certfile"] = maim_message_config.cert_file
|
||||
if maim_message_config.key_file:
|
||||
kwargs["ssl_keyfile"] = maim_message_config.key_file
|
||||
kwargs["enable_custom_uvicorn_logger"] = False
|
||||
|
||||
|
||||
global_api = MessageServer(**kwargs)
|
||||
|
||||
if version_compatible and maim_message_config.auth_token:
|
||||
for token in maim_message_config.auth_token:
|
||||
global_api.add_valid_token(token)
|
||||
global_api = MessageServer(**kwargs)
|
||||
if version_compatible and maim_message_config.auth_token:
|
||||
for token in maim_message_config.auth_token:
|
||||
global_api.add_valid_token(token)
|
||||
return global_api
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
from src.common.database.database_model import Messages # 更改导入
|
||||
from src.common.logger import get_module_logger
|
||||
from src.common.logger import get_logger
|
||||
import traceback
|
||||
from typing import List, Any, Optional
|
||||
from peewee import Model # 添加 Peewee Model 导入
|
||||
|
||||
logger = get_module_logger(__name__)
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
def _model_to_dict(model_instance: Model) -> dict[str, Any]:
|
||||
|
||||
@@ -3,8 +3,7 @@ import asyncio
|
||||
import requests
|
||||
import platform
|
||||
|
||||
# from loguru import logger
|
||||
from src.common.logger_manager import get_logger
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import global_config
|
||||
from src.manager.async_task_manager import AsyncTask
|
||||
from src.manager.local_store_manager import local_storage
|
||||
|
||||
@@ -90,4 +90,11 @@ class Server:
|
||||
return self.app
|
||||
|
||||
|
||||
global_server = Server(host=os.environ["HOST"], port=int(os.environ["PORT"]))
|
||||
global_server = None
|
||||
|
||||
def get_global_server() -> Server:
|
||||
"""获取全局服务器实例"""
|
||||
global global_server
|
||||
if global_server is None:
|
||||
global_server = Server(host=os.environ["HOST"], port=int(os.environ["PORT"]))
|
||||
return global_server
|
||||
|
||||
Reference in New Issue
Block a user