# Copyright 2026 zhaoxi826 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from loguru import logger from rich.logging import RichHandler from loguru._logger import Logger def setup_logger() -> Logger: """对现有的 setup logger 进行状态更新或属性覆盖。 基于增量变更原则,合并最新的配置或数据,并触发相关依赖组件的缓存刷新或事件通知。 Returns: (Logger): 经由当前业务模型加工处理后所输出的具体数据实例或领域模型对象。 """ logger.remove() def format_record(record): # Format string for rich handler """执行与 format record 相关的核心业务流转操作。 该方法封装了具体的算法策略或状态控制逻辑,确保操作能够在事务上下文中被原子且一致地执行。 Args: record: 参与 format record 逻辑运算或数据构建的上下文依赖对象。 Returns: : 经由当前业务模型加工处理后所输出的具体数据实例或领域模型对象。 """ actor = record["extra"].get("actor_name", "System") trace_id = record["extra"].get("trace_id", "") trace_str = f" | trace_id:({trace_id})" if trace_id else "" return f"actor:({actor}){trace_str} : {record['message']}" logger.configure(extra={"actor_name": "System", "trace_id": ""}) logger.add( RichHandler(rich_tracebacks=True, markup=True, show_time=False, show_level=False, show_path=False), format=format_record, level="DEBUG", enqueue=True, # 异步记录 ) return logger global_logger = setup_logger() def get_logger(actor_name: str, trace_id: str = "") -> Logger: """检索并获取特定的 logger 数据集合或实例对象。 根据提供的查询条件或上下文凭证,从数据库、缓存或第三方服务中读取对应的资源状态。 Args: actor_name (str): 赋予该实体的人类可读名称或标题字符串,主要用于前端 UI 展示、日志记录或模糊检索。 trace_id (str): 目标对象的唯一全局标识符 (UUID/ULID),用于在数据库表或缓存结构中精准匹配该 trace 实例。 Returns: (Logger): 经由当前业务模型加工处理后所输出的具体数据实例或领域模型对象。 """ return global_logger.bind(actor_name=actor_name, trace_id=trace_id)