feat(logger)

This commit is contained in:
SXP-Simon
2026-02-08 23:28:56 +08:00
parent b8ea7adf5a
commit e73fd99e26
31 changed files with 100 additions and 72 deletions
+9 -4
View File
@@ -17,11 +17,16 @@ sys.path.insert(0, project_root)
print(f"Project Root: {project_root}") print(f"Project Root: {project_root}")
# Mock logger before importing anything that uses it # Mock logger before importing anything that uses it
from astrbot.api import logger # noqa: E402 # Mock logger
from data.plugins.astrbot_plugin_qq_group_daily_analysis.src.utils import (
logger as plugin_logger_module,
)
logger.info = lambda msg, *args, **kwargs: print(f"[INFO] {msg}") plugin_logger_module.logger.info = lambda msg, *args, **kwargs: print(f"[INFO] {msg}")
logger.error = lambda msg, *args, **kwargs: print(f"[ERROR] {msg}") plugin_logger_module.logger.error = lambda msg, *args, **kwargs: print(f"[ERROR] {msg}")
logger.warning = lambda msg, *args, **kwargs: print(f"[WARN] {msg}") plugin_logger_module.logger.warning = lambda msg, *args, **kwargs: print(
f"[WARN] {msg}"
)
# Now import plugin modules # Now import plugin modules
try: try:
+1 -1
View File
@@ -6,7 +6,7 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from typing import Any from typing import Any
from astrbot.api import logger from ...utils.logger import logger
from ...models.data_models import TokenUsage from ...models.data_models import TokenUsage
from ..utils.json_utils import parse_json_response from ..utils.json_utils import parse_json_response
@@ -5,7 +5,7 @@
from datetime import datetime from datetime import datetime
from astrbot.api import logger from ...utils.logger import logger
from ...models.data_models import GoldenQuote, TokenUsage from ...models.data_models import GoldenQuote, TokenUsage
from ..utils import InfoUtils from ..utils import InfoUtils
+1 -1
View File
@@ -6,7 +6,7 @@
import re import re
from datetime import datetime from datetime import datetime
from astrbot.api import logger from ...utils.logger import logger
from ...models.data_models import SummaryTopic, TokenUsage from ...models.data_models import SummaryTopic, TokenUsage
from ..utils import InfoUtils from ..utils import InfoUtils
@@ -3,7 +3,7 @@
专门处理用户称号和MBTI类型分析 专门处理用户称号和MBTI类型分析
""" """
from astrbot.api import logger from ...utils.logger import logger
from ...models.data_models import TokenUsage, UserTitle from ...models.data_models import TokenUsage, UserTitle
from ..utils.json_utils import extract_user_titles_with_regex from ..utils.json_utils import extract_user_titles_with_regex
+1 -1
View File
@@ -5,7 +5,7 @@ LLM分析器模块
import asyncio import asyncio
from astrbot.api import logger from ..utils.logger import logger
from ..models.data_models import GoldenQuote, SummaryTopic, TokenUsage, UserTitle from ..models.data_models import GoldenQuote, SummaryTopic, TokenUsage, UserTitle
from .analyzers.golden_quote_analyzer import GoldenQuoteAnalyzer from .analyzers.golden_quote_analyzer import GoldenQuoteAnalyzer
+1 -1
View File
@@ -6,7 +6,7 @@ JSON处理工具模块
import json import json
import re import re
from astrbot.api import logger from ...utils.logger import logger
def fix_json(text: str) -> str: def fix_json(text: str) -> str:
+1 -1
View File
@@ -6,7 +6,7 @@ LLM API请求处理工具模块
import asyncio import asyncio
from typing import Any from typing import Any
from astrbot.api import logger from ...utils.logger import logger
from ...utils.resilience import CircuitBreaker, global_llm_rate_limiter from ...utils.resilience import CircuitBreaker, global_llm_rate_limiter
+3 -5
View File
@@ -12,7 +12,7 @@
from typing import Optional, List, Dict, Any from typing import Optional, List, Dict, Any
from dataclasses import dataclass from dataclasses import dataclass
from astrbot.api import logger from ..utils.logger import logger
from ..domain.value_objects.unified_message import UnifiedMessage from ..domain.value_objects.unified_message import UnifiedMessage
from ..domain.value_objects.platform_capabilities import PlatformCapabilities from ..domain.value_objects.platform_capabilities import PlatformCapabilities
@@ -23,6 +23,7 @@ from .message_converter import MessageConverter
@dataclass @dataclass
class AnalysisConfig: class AnalysisConfig:
"""分析操作配置""" """分析操作配置"""
days: int = 1 days: int = 1
max_messages: int = 1000 max_messages: int = 1000
min_messages_threshold: int = 10 min_messages_threshold: int = 10
@@ -124,10 +125,7 @@ class AnalysisOrchestrator:
effective_count = caps.get_effective_count(max_count) effective_count = caps.get_effective_count(max_count)
if effective_days < days: if effective_days < days:
logger.info( logger.info(f"平台限制:请求 {days} 天,实际使用 {effective_days}")
f"平台限制:请求 {days} 天,"
f"实际使用 {effective_days}"
)
return await self.adapter.fetch_messages( return await self.adapter.fetch_messages(
group_id=group_id, group_id=group_id,
+4 -2
View File
@@ -7,7 +7,7 @@
from datetime import datetime from datetime import datetime
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional
from astrbot.api import logger from ..utils.logger import logger
from ..domain.services import ReportGenerator from ..domain.services import ReportGenerator
from ..domain.value_objects.topic import Topic from ..domain.value_objects.topic import Topic
@@ -78,7 +78,9 @@ class ReportingService:
statistics=statistics, statistics=statistics,
topics=topics if self.config.get_include_topics() else [], topics=topics if self.config.get_include_topics() else [],
user_titles=user_titles if self.config.get_include_user_titles() else [], user_titles=user_titles if self.config.get_include_user_titles() else [],
golden_quotes=golden_quotes if self.config.get_include_golden_quotes() else [], golden_quotes=golden_quotes
if self.config.get_include_golden_quotes()
else [],
include_header=True, include_header=True,
include_footer=True, include_footer=True,
) )
+6 -2
View File
@@ -9,10 +9,14 @@ import asyncio
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import Any, Callable, Dict, List, Optional, Set from typing import Any, Callable, Dict, List, Optional, Set
from astrbot.api import logger from ..utils.logger import logger
from ..infrastructure.config import ConfigManager from ..infrastructure.config import ConfigManager
from ..shared.constants import TASK_STATE_PENDING, TASK_STATE_RUNNING, TASK_STATE_COMPLETED from ..shared.constants import (
TASK_STATE_PENDING,
TASK_STATE_RUNNING,
TASK_STATE_COMPLETED,
)
class ScheduledTask: class ScheduledTask:
+1 -1
View File
@@ -7,7 +7,7 @@ Bot实例管理模块
from typing import Any, Optional from typing import Any, Optional
from astrbot.api import logger from ..utils.logger import logger
from ..infrastructure.platform import PlatformAdapter, PlatformAdapterFactory from ..infrastructure.platform import PlatformAdapter, PlatformAdapterFactory
+1 -1
View File
@@ -7,7 +7,7 @@
import datetime import datetime
from typing import Any from typing import Any
from astrbot.api import logger from ..utils.logger import logger
class HistoryManager: class HistoryManager:
+1 -1
View File
@@ -6,7 +6,7 @@
from collections import defaultdict from collections import defaultdict
from datetime import datetime, timedelta from datetime import datetime, timedelta
from astrbot.api import logger from ..utils.logger import logger
from ..models.data_models import EmojiStatistics, GroupStatistics, TokenUsage from ..models.data_models import EmojiStatistics, GroupStatistics, TokenUsage
from ..visualization.activity_charts import ActivityVisualizer from ..visualization.activity_charts import ActivityVisualizer
+1 -1
View File
@@ -2,7 +2,7 @@ import base64
import aiohttp import aiohttp
from astrbot.api import logger from ..utils.logger import logger
from ..utils.trace_context import TraceContext from ..utils.trace_context import TraceContext
+1 -1
View File
@@ -7,7 +7,7 @@
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional
from astrbot.api import logger from ...utils.logger import logger
class ConfigManager: class ConfigManager:
+4 -2
View File
@@ -7,7 +7,7 @@ LLM 客户端 - 包装 AstrBot 的 LLM 提供商系统
from typing import Any, Dict, List, Optional, Tuple from typing import Any, Dict, List, Optional, Tuple
from astrbot.api import logger from ...utils.logger import logger
from ...domain.value_objects.statistics import TokenUsage from ...domain.value_objects.statistics import TokenUsage
from ...domain.exceptions import LLMException, LLMRateLimitException from ...domain.exceptions import LLMException, LLMRateLimitException
@@ -110,7 +110,9 @@ class LLMClient:
if hasattr(response, "completion_text"): if hasattr(response, "completion_text"):
response_text = response.completion_text response_text = response.completion_text
elif isinstance(response, dict): elif isinstance(response, dict):
response_text = response.get("completion_text", response.get("text", "")) response_text = response.get(
"completion_text", response.get("text", "")
)
else: else:
response_text = str(response) response_text = str(response)
@@ -11,7 +11,7 @@ from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional
from astrbot.api import logger from ...utils.logger import logger
class HistoryRepository: class HistoryRepository:
@@ -121,9 +121,7 @@ class HistoryRepository:
history = self.load_group_history(group_id) history = self.load_group_history(group_id)
return history.get("daily", {}).get(date_str) return history.get("daily", {}).get(date_str)
def get_recent_results( def get_recent_results(self, group_id: str, limit: int = 7) -> List[Dict[str, Any]]:
self, group_id: str, limit: int = 7
) -> List[Dict[str, Any]]:
""" """
获取最近的分析结果。 获取最近的分析结果。
+7 -4
View File
@@ -2,7 +2,9 @@
平台适配器工厂 平台适配器工厂
""" """
from typing import Optional, Any, Dict, Type from typing import Any, Dict, List, Optional, Type
from ...utils.logger import logger
from .base import PlatformAdapter from .base import PlatformAdapter
@@ -49,8 +51,7 @@ class PlatformAdapterFactory:
return adapter_class(bot_instance, config) return adapter_class(bot_instance, config)
except Exception: except Exception:
# 记录异常,但不崩溃 # 记录异常,但不崩溃
import logging logger.error(f"{platform_name} 创建适配器时出错", exc_info=True)
logging.getLogger(__name__).error(f"{platform_name} 创建适配器时出错", exc_info=True)
return None return None
@classmethod @classmethod
@@ -68,6 +69,7 @@ class PlatformAdapterFactory:
def _register_adapters(): def _register_adapters():
try: try:
from .adapters.onebot_adapter import OneBotAdapter from .adapters.onebot_adapter import OneBotAdapter
PlatformAdapterFactory.register("aiocqhttp", OneBotAdapter) PlatformAdapterFactory.register("aiocqhttp", OneBotAdapter)
PlatformAdapterFactory.register("onebot", OneBotAdapter) PlatformAdapterFactory.register("onebot", OneBotAdapter)
except ImportError: except ImportError:
@@ -75,8 +77,9 @@ def _register_adapters():
try: try:
from .adapters.discord_adapter import DiscordAdapter from .adapters.discord_adapter import DiscordAdapter
PlatformAdapterFactory.register("discord", DiscordAdapter) PlatformAdapterFactory.register("discord", DiscordAdapter)
PlatformAdapterFactory.register("discord_bot", DiscordAdapter) # 添加别名 PlatformAdapterFactory.register("discord_bot", DiscordAdapter) # 添加别名
except ImportError: except ImportError:
pass pass
@@ -9,7 +9,7 @@ from dataclasses import dataclass, field
from enum import Enum from enum import Enum
from typing import Callable, Optional from typing import Callable, Optional
from astrbot.api import logger from ...utils.logger import logger
class CircuitState(Enum): class CircuitState(Enum):
@@ -9,7 +9,7 @@ import time
from dataclasses import dataclass, field from dataclasses import dataclass, field
from typing import Optional from typing import Optional
from astrbot.api import logger from ...utils.logger import logger
@dataclass @dataclass
+1 -1
View File
@@ -10,7 +10,7 @@ from dataclasses import dataclass
from functools import wraps from functools import wraps
from typing import Callable, Optional, Tuple, Type, Union from typing import Callable, Optional, Tuple, Type, Union
from astrbot.api import logger from ...utils.logger import logger
@dataclass @dataclass
+1 -1
View File
@@ -1,7 +1,7 @@
from collections.abc import Callable from collections.abc import Callable
from typing import Any from typing import Any
from astrbot.api import logger from ..utils.logger import logger
from ..utils.trace_context import TraceContext from ..utils.trace_context import TraceContext
+1 -1
View File
@@ -10,7 +10,7 @@ from pathlib import Path
import aiohttp import aiohttp
from astrbot.api import logger from ..utils.logger import logger
from ..visualization.activity_charts import ActivityVisualizer from ..visualization.activity_charts import ActivityVisualizer
from .templates import HTMLTemplates from .templates import HTMLTemplates
+1 -1
View File
@@ -9,7 +9,7 @@ import threading
from jinja2 import Environment, FileSystemLoader, select_autoescape from jinja2 import Environment, FileSystemLoader, select_autoescape
from astrbot.api import logger from ..utils.logger import logger
class HTMLTemplates: class HTMLTemplates:
+1 -1
View File
@@ -8,7 +8,7 @@ import weakref
from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.cron import CronTrigger
from astrbot.api import logger from ..utils.logger import logger
from ..core.message_sender import MessageSender from ..core.message_sender import MessageSender
from ..reports.dispatcher import ReportDispatcher from ..reports.dispatcher import ReportDispatcher
+1 -1
View File
@@ -6,7 +6,7 @@ import aiohttp
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from astrbot.api import logger from ..utils.logger import logger
@dataclass @dataclass
+1 -1
View File
@@ -5,7 +5,7 @@
import asyncio import asyncio
from astrbot.api import logger from .logger import logger
from ..analysis.llm_analyzer import LLMAnalyzer from ..analysis.llm_analyzer import LLMAnalyzer
from ..analysis.statistics import UserAnalyzer from ..analysis.statistics import UserAnalyzer
+16
View File
@@ -0,0 +1,16 @@
import logging
from astrbot.api import logger as astrbot_logger
class PluginLoggerAdapter(logging.LoggerAdapter):
"""
插件日志适配器
自动为日志添加 [QQ群分析] 前缀,方便区分
"""
def process(self, msg, kwargs):
return f"[QQ群分析] {msg}", kwargs
# 导出带前缀的 logger
logger = PluginLoggerAdapter(astrbot_logger, {})
+1 -1
View File
@@ -7,7 +7,7 @@ import asyncio
import sys import sys
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from astrbot.api import logger from .logger import logger
class PDFInstaller: class PDFInstaller:
+1 -1
View File
@@ -1,7 +1,7 @@
import asyncio import asyncio
import time import time
from astrbot.api import logger from .logger import logger
class CircuitBreaker: class CircuitBreaker: