# v5 现场设备原始日志采样 ## 功能说明 v5 为 `syslog-consumer-rule` 增加按设备短时采集原始日志的诊断接口,并提供自动落盘脚本。 - 单次采集最长 600 秒; - 单次最多返回 50 条; - 先保留采集窗口内最早的 N 条日志; - 后续出现非标、规则执行异常、InfluxDB 写入异常、达梦写入异常或 Retry/DLT 时,用异常日志逐条替换最早的正常样本; - 返回内容来自规则解析和非标字段截断之前,不受 `HB_XDR_TRUNCATED` 影响; - 三个 `syslog-consumer-rule` 实例通过相同 Redis 汇聚有界候选集; - 不新增数据库表,也不需要执行达梦 SQL。 ## 升级与配置 滚动升级全部 `syslog-consumer-rule` 实例,并确保各实例连接同一个 Redis。原始日志采集和多实例汇聚默认 均已启用;建议在所有实例显式保留以下配置,便于现场识别和后续调整: ```yaml - SYSLOG_RAW_CAPTURE_ENABLED=true - SYSLOG_RAW_CAPTURE_CLUSTER_ENABLED=true ``` 推荐保留默认配置: ```yaml - SYSLOG_RAW_CAPTURE_MAX_ACTIVE_SESSIONS=20 - SYSLOG_RAW_CAPTURE_MAX_RETAINED_SESSIONS=100 - SYSLOG_RAW_CAPTURE_CLUSTER_ACTIVATION_DELAY_MS=1000 - SYSLOG_RAW_CAPTURE_CLUSTER_SYNC_INTERVAL_MS=200 - SYSLOG_RAW_CAPTURE_SETTLE_SECONDS=30 - SYSLOG_RAW_CAPTURE_RESULT_RETENTION_MINUTES=30 ``` 如果多个 Java 进程运行在同一主机且没有不同的容器 `HOSTNAME`,应为每个实例配置不同标识: ```yaml - SYSLOG_RAW_CAPTURE_NODE_ID=consumer-rule-01 ``` 接口会返回完整原文,应只允许受信任的运维网络或现有管理网关访问。 ## 一键采集 脚本依赖 `bash`、`curl` 和 `python3`。先增加执行权限: ```bash chmod 700 /升级资料路径/v5/capture-device-raw-logs.sh ``` 基本用法: ```bash /升级资料路径/v5/capture-device-raw-logs.sh \ 38 \ 60 \ 10 \ http://127.0.0.1:8289/xdrrule \ /data/haobang/raw-log-captures ``` 参数依次是: 1. 设备 ID; 2. 采集秒数,默认 60,最大 600; 3. 样本数,默认 10,最大 50; 4. `syslog-consumer-rule` 基础地址,默认 `http://127.0.0.1:8289/xdrrule`; 5. 本地输出目录,默认当前目录下的 `raw-log-captures`。 如果接口经过鉴权网关,可通过环境变量传入请求头: ```bash RAW_CAPTURE_AUTH_HEADER='Authorization: Bearer 替换为现场令牌' \ ./capture-device-raw-logs.sh 38 120 20 https://管理地址/xdrrule /data/raw-samples ``` ## 输出文件 每次运行生成独立目录: ```text device-38_20260914-190000_会话ID/ ├── start.json ├── latest.json ├── result.json ├── samples.jsonl ├── session-id.txt ├── summary.txt └── raw/ ├── 001_normal_事件ID.log └── 002_anomaly_事件ID.log ``` - `result.json`:最终完整 API 响应,是最完整的交付文件; - `samples.jsonl`:每行一条样本及其处理状态、异常原因和原文; - `raw/*.log`:每条原始报文单独保存,内容不添加分隔符,也不主动截断; - `summary.txt`:会话时间、收到的消息数、异常数和替换数; - `latest.json`:脚本被中断或等待超时时保留的最后一次有效快照。 脚本设置 `umask 077`,新生成文件默认只允许执行脚本的账号访问。 ## 生命周期 状态依次为: ```text SCHEDULED -> RUNNING -> DRAINING -> COMPLETED ``` 采集时间到达后不再接收新日志,随后默认等待 30 秒,让窗口内日志的异步处理异常完成替换。进入 `COMPLETED` 后结果默认继续保留 30 分钟,之后 Redis TTL 自动删除。 脚本会一直轮询到 `COMPLETED` 并自动导出,不需要人工再次查询。关闭终端或脚本等待超时不会使服务端会话 永久运行,会话仍按上述时间自动结束。 ## 常见问题 ### 返回 503:现场原始日志采样功能未启用 确认实例没有通过环境变量设置 `SYSLOG_RAW_CAPTURE_ENABLED=false`,并确认实例已经升级到 v5 JAR。 ### 返回 503:跨实例原始日志采样暂不可用 检查所有 `syslog-consumer-rule` 实例到 Redis 的网络、密码、数据库编号是否一致。Redis 故障只影响诊断 采集,不会中断主 Kafka 消费。 ### 返回 429 活动采集会话达到上限。等待已有会话进入 `COMPLETED`,或核对是否有人重复创建采集任务。 ### 脚本退出码为 2 表示客户端等待超时,但已经把最后一次有效快照写入输出目录。服务端会话仍会自动结束,可在结果保留期内 使用 `session-id.txt` 中的 ID 再查询: ```bash curl 'http://127.0.0.1:8289/xdrrule/api/syslog/raw-captures/会话ID' ```