mirror of
https://github.com/Nezumi-2711/astrbot_plugin_qq_group_daily_analysis.git
synced 2026-09-22 20:01:04 +00:00
feat(logger)
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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]]:
|
|
||||||
"""
|
"""
|
||||||
获取最近的分析结果。
|
获取最近的分析结果。
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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, {})
|
||||||
@@ -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,7 +1,7 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from astrbot.api import logger
|
from .logger import logger
|
||||||
|
|
||||||
|
|
||||||
class CircuitBreaker:
|
class CircuitBreaker:
|
||||||
|
|||||||
Reference in New Issue
Block a user