需启用结构化、高粒度请求级日志记录:一、启用verbose_logging并切换json输出;二、网关层注入http日志中间件;三、用loguru绑定trace_id实现链路追踪;四、通过环境变量动态开关与脱敏。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您希望完整捕获Hermes Agent与外部服务(如大模型API、工具调用、HTTP请求等)之间的交互细节,则需启用结构化、高粒度的请求级日志记录。默认配置仅输出基础INFO级别日志,无法体现请求头、响应体、耗时、状态码等关键调试信息。以下是实现详细请求日志记录的多种配置方式:
一、启用verbose_logging并切换为JSON格式输出
该方法通过修改核心状态模块启用全量会话日志,并以机器可读的JSON格式持久化,便于后续解析与审计。JSON结构天然支持嵌套字段(如request.headers、response.status_code),是请求日志的理想载体。
1、打开hermes_state.py文件,定位到日志配置区域。
2、将verbose_logging字段设为True。
3、在日志处理器中引入python-json-logger库,替换原有formatter:
4、使用JsonFormatter并显式添加%(request_method)s、%(request_url)s、%(response_status)s等自定义日志字段(需配合中间件注入)。
5、确保日志输出路径指向~/.hermes/sessions/目录,文件扩展名为.json。
二、在网关层注入HTTP请求日志中间件
该方法聚焦于Agent对外发起的所有HTTP请求,通过拦截httpx.AsyncClient或requests.Session实例,在每次请求前后自动记录原始请求与响应数据,不依赖全局日志级别设置。
1、在gateway/run.py中导入httpx和logging模块。
2、定义一个自定义传输类LoggingTransport,继承httpx.HTTPTransport,重写handle_request方法。
3、在handle_request中序列化request.method、request.url、request.headers、request.content为JSON片段。
4、调用父类发送请求后,捕获response,记录response.status_code、response.headers及截断后的response.text(避免敏感内容泄露)。
5、将该LoggingTransport注入至httpx.AsyncClient(transport=...)实例中。
三、配置Loguru替代标准logging并启用bind机制
该方法利用Loguru的上下文绑定能力,在每个请求生命周期内动态附加唯一trace_id、session_id、tool_name等标识,实现跨模块、跨线程的请求链路追踪,避免日志混杂。
1、卸载默认logging.basicConfig,安装并初始化loguru.logger。
2、在Agent主循环入口处调用logger.bind(trace_id=str(uuid4()))创建独立日志上下文。
3、在调用任意工具前,使用logger.bind(tool_name="web_search")临时扩展上下文。
4、配置logger.add()输出至~/.hermes/logs/requests/目录,启用rotation="10 MB"与compression="zip"。
5、在关键位置插入logger.debug("Request sent", request=raw_dict)与logger.info("Response received", status=response.status_code)。
四、通过环境变量控制请求日志开关与脱敏策略
该方法面向生产环境,允许在不修改代码的前提下动态开启/关闭详细请求日志,并对API密钥、用户token等字段执行运行时脱敏,满足合规审计要求。
1、在~/.hermes/.env中新增两行:HERMES_LOG_REQUESTS=true与HERMES_LOG_REDACT_KEYS=api_key,token,authorization。
2、在tools/file_tools.py中读取上述变量,若HERMES_LOG_REQUESTS为true,则激活agent/redact.py中的字段过滤器。
3、构建请求日志字典前,调用redact_sensitive_fields(request_dict, keys_to_redact)函数,将匹配键值替换为"[REDACTED]"。
4、将脱敏后的字典传入json.dump()写入~/.hermes/sessions/requests_$(date +%Y%m%d).jsonl文件。
5、确保redact.py支持正则匹配(如.*password.*)与嵌套路径(如headers.authorization)。











