fixed # 修复astrbot日志未使用logging.basicConfig

This commit is contained in:
2026-10-27 11:40:59 +08:00
parent b3455ded58
commit d05b2e5765
20 changed files with 333 additions and 46 deletions
+6
View File
@@ -1,5 +1,11 @@
# 更新日志
## 待发布
- 全部插件及私有共享模块日志接入AstrBot官方logger,保留启动下载进度。
- 不再配置独立日志文件或修改宿主日志处理器;移除包内开发命令行入口。
- 新增发布包日志规范检查,拒绝内置logging及自建日志处理器。
## 2.0.2 — 待发布
### 新增
+1 -2
View File
@@ -2,14 +2,13 @@
import asyncio
from collections import OrderedDict
import logging
import re
from time import monotonic
import aiohttp
from astrbot.api import logger
logger = logging.getLogger(__name__)
MAX_BYTES = 2 * 1024 * 1024
MAX_ENTRIES = 16
FETCH_TIMEOUT = 2
+1 -4
View File
@@ -2,10 +2,10 @@
import asyncio
import json
import logging
from pathlib import Path
from astrbot.api import AstrBotConfig
from astrbot.api import logger
from astrbot.api.event import AstrMessageEvent, filter
from astrbot.api.message_components import At, Image
from astrbot.api.star import Context, Star, StarTools
@@ -16,9 +16,6 @@ from .runtime import Runtime, command_map
COMMANDS = command_map('astrbot')
logger = logging.getLogger(__name__)
class FarmPlugin(Star):
def __init__(self, context: Context, config: AstrBotConfig):
super().__init__(context)
+9
View File
@@ -0,0 +1,9 @@
"""AstrBot拥有日志配置和输出,插件不创建或关闭任何日志处理器。"""
def open_logs(data_dir):
return None, None
def close_logs(file_handler, console_handler):
pass
+9 -12
View File
@@ -10,6 +10,7 @@ import shlex
from urllib.error import HTTPError, URLError
from zipfile import BadZipFile
from .runtime_logging import open_logs, close_logs
from ._vendor.farm_core import Catalogue, FarmService, Identity, SQLiteStore
from ._vendor.farm_core.domain import FarmError
from ._vendor.farm_core.commands import (
@@ -133,6 +134,7 @@ class Runtime:
self.rendering = None
self.started = False
self.log_handler = None
self.console_handler = None
self.legacy_source = self.data_dir / 'farm.db'
self._resource_lock = asyncio.Lock()
self._closing = False
@@ -153,15 +155,9 @@ class Runtime:
return
epoch = self._start_epoch
self.data_dir.mkdir(parents=True, exist_ok=True)
self.log_handler = logging.FileHandler(
self.data_dir / "farm-preview.log", encoding="utf-8",
)
self.log_handler.setFormatter(logging.Formatter(
"%(asctime)s %(levelname)s %(name)s %(message)s",
))
logging.getLogger(__package__).setLevel(logging.INFO)
logging.getLogger(__package__).addHandler(self.log_handler)
self.log_handler, self.console_handler = open_logs(self.data_dir)
try:
logger.info('农场启动:正在检查作物版本和本地缓存')
if self.resource_options_provider is not None:
self.resource_source, self.service_url = (
self.resource_options_provider()
@@ -191,6 +187,8 @@ class Runtime:
if self._closing or epoch != self._start_epoch:
return
self.started = True
logger.info('农场启动完成(%s)',
'图片可用' if self.rendering else '文字模式')
logger.info("farm preview initialized schema=%s", SCHEMA_VERSION)
async def _prepare_resources(self):
@@ -206,6 +204,7 @@ class Runtime:
)
validate_options(self.resource_source, self.service_url)
resource = 'assets'
logger.info('农场启动:正在准备图片素材和字体')
selected = self.catalogue_release
bundle_path = selected.bundle_path if selected else None
if bundle_path is None:
@@ -265,10 +264,8 @@ class Runtime:
await self.store.close()
self.started = False
self._closing = False
if self.log_handler:
logging.getLogger(__package__).removeHandler(self.log_handler)
self.log_handler.close()
self.log_handler = None
close_logs(self.log_handler, self.console_handler)
self.log_handler = self.console_handler = None
async def execute(
self, action, arguments, *, bot_id, platform, user_id, message_id,
+43
View File
@@ -0,0 +1,43 @@
"""真寻和NoneBot的日志生命周期;AstrBot构建使用宿主专用实现。"""
import logging
def has_console_handler(target):
while target is not None:
if any(isinstance(handler, logging.StreamHandler)
and not isinstance(handler, logging.FileHandler)
and handler.level <= logging.INFO
for handler in target.handlers):
return True
target = target.parent if target.propagate else None
return False
def open_logs(data_dir):
target = logging.getLogger(__package__)
file_handler = logging.FileHandler(
data_dir / 'farm-preview.log', encoding='utf-8',
)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s %(name)s %(message)s',
))
target.setLevel(logging.INFO)
target.addHandler(file_handler)
console_handler = None
if not has_console_handler(target):
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(logging.Formatter(
'%(asctime)s [农场] %(message)s', datefmt='%H:%M:%S',
))
target.addHandler(console_handler)
return file_handler, console_handler
def close_logs(file_handler, console_handler):
target = logging.getLogger(__package__)
for handler in (file_handler, console_handler):
if handler is not None:
target.removeHandler(handler)
handler.close()