需配置可持久化、结构化日志机制:一、启用Log4j2并配置RollingFile Appender与指定Logger;二、在ActionHandler中用MDC注入traceId/actionType;三、对接ELK,用Filebeat采集并结构化日志;四、通过Spring AOP切面统一记录执行详情;五、写入数据库t_operation_log表保障可靠性。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您希望在Hermes Agent运行过程中追踪其执行动作、命令调用与状态变更,则需为其配置可持久化、结构化的操作日志记录机制。以下是实现该目标的多种具体方法:
一、启用内置日志模块并配置Log4j2
Hermes Agent默认集成Log4j2作为日志框架,可通过修改配置文件激活操作级日志输出,捕获任务调度、插件调用及HTTP请求等关键行为。
1、定位Hermes Agent安装目录下的conf/log4j2.xml文件。
2、在<Appenders>节点内添加RollingFile Appender,指定日志路径为logs/hermes-agent-operation.log。
3、在<Loggers>节点中新增Logger,设置name="com.hermes.agent.core.executor",并将level设为INFO。
4、确保该Logger引用前述RollingFile Appender,并将additivity设为false以避免重复输出。
5、重启Hermes Agent服务使配置生效,操作日志将按时间滚动写入指定文件。
二、在ActionHandler中嵌入MDC上下文标记
通过MDC(Mapped Diagnostic Context)为每次操作注入唯一追踪ID与操作类型,使日志条目具备可关联性与可筛选性,便于故障回溯与审计分析。
1、在任务入口类(如TaskExecutionHandler)的execute()方法起始处插入MDC.put("traceId", UUID.randomUUID().toString())。
2、调用MDC.put("actionType", task.getMetadata().getAction())记录当前执行动作类型。
3、在log4j2.xml的PatternLayout中更新日志格式,加入%X{traceId} %X{actionType}字段。
4、在finally块中调用MDC.clear(),防止线程复用导致上下文污染。
三、对接外部日志收集系统(如ELK)
将操作日志实时推送至Elasticsearch,结合Logstash或Filebeat完成采集、过滤与结构化,支持高并发场景下的集中式检索与可视化。
1、在Hermes Agent所在服务器部署Filebeat,配置filebeat.inputs指向logs/hermes-agent-operation.log。
2、在Filebeat的processors中添加dissect处理器,按固定分隔符提取timestamp、level、traceId、actionType等字段。
3、配置output.elasticsearch指向目标ES集群地址,并设置索引前缀为hermes-agent-operation-。
4、启动Filebeat服务,验证Elasticsearch中是否出现带有actionType字段的文档。
四、通过AOP切面统一拦截操作方法
利用Spring AOP对所有继承自BaseAction的执行方法进行环绕通知,在不侵入业务逻辑的前提下自动记录入参、耗时与结果状态。
1、定义切点表达式@Pointcut("execution(* com.hermes.agent.action..*Action.execute(..))")。
2、在@Around通知中获取方法签名、参数值与执行开始时间。
3、执行目标方法后,捕获返回值或异常,构造包含methodName、params、durationMs、status的JSON字符串。
4、调用Logger.info()输出该JSON,并确保日志级别为INFO且独立于普通调试日志。
5、确认切面类已添加@Aspect与@Component注解,并被Spring容器管理。
五、启用数据库持久化日志表
将高频关键操作(如任务触发、权限校验失败、插件加载异常)写入MySQL或PostgreSQL中的t_operation_log表,保障日志不因服务中断而丢失。
1、在数据库中创建表结构,包含字段:id(BIGINT AUTO_INCREMENT)、trace_id(VARCHAR(36))、action_type(VARCHAR(64))、status(TINYINT)、params_json(TEXT)、created_at(DATETIME DEFAULT CURRENT_TIMESTAMP)。
2、引入spring-jdbc依赖,在OperationLogService中封装JdbcTemplate.update()插入逻辑。
3、在各核心操作链路末尾(如TaskScheduler.trigger()返回前)调用该服务,传入必要字段。
4、设置数据库连接池最大活跃数不低于5,避免日志写入阻塞主流程。
5、对params_json字段内容执行StringEscapeUtils.escapeJson()处理,防止SQL注入与JSON解析异常。


















