如何修改Logstash配置提取Oracle RDS XML审计日志AuditRecord片段
Logstash配置修改方案
核心处理逻辑
针对S3存储的gz格式Oracle审计日志,我们通过「输入适配+过滤层清理无效内容+结构化解析+ES输出」四个步骤实现需求,核心解决JSON前缀行报错的问题。
1. 输入层配置(适配S3 gz压缩文件)
使用S3输入插件直接读取压缩文件,指定纯文本解码避免JSON前缀行提前解析报错:
input { s3 { bucket => "你的S3存储桶名称" prefix => "Oracle审计日志在S3中的存储路径前缀" codec => plain { charset => "UTF-8" } sincedb_path => "/data/logstash/sincedb/oracle_audit_sincedb" # 记录已读取文件偏移,避免重复消费 gzip_pattern => "\.gz$" # 自动识别gz格式并解压 region => "你的AWS区域,例如ap-southeast-1" } }
2. 过滤层核心处理
2.1 丢弃无效JSON前缀行
所有不包含<AuditRecord>标签的行(即你提到的JSON前缀行)直接丢弃,从根源避免解析报错:
filter { # 第一步:过滤无审计内容的无效行 if "<AuditRecord>" not in [message] { drop {} } # 第二步:提取<AuditRecord>到</AuditRecord>区间的审计内容 grok { match => { "message" => "<AuditRecord>%{DATA:oracle_audit_raw}</AuditRecord>" } tag_on_failure => [ "_audit_content_parse_fail" ] } # 可选:提取失败的行也丢弃,避免脏数据 if "_audit_content_parse_fail" in [tags] { drop {} } # 第三步:结构化解析审计内容 # 若审计记录为XML格式,推荐用XML过滤器解析,比Grok更稳定高效: xml { source => "oracle_audit_raw" store_xml => false # 不存储完整XML结构,节省存储空间 xpath => { "//AuditType/text()" => "audit_type" "//DBUser/text()" => "db_username" "//ActionTime/text()" => "event_time" "//ActionName/text()" => "db_operation" "//ObjectName/text()" => "operated_object" "//ClientIP/text()" => "client_ip" } remove_field => [ "message", "oracle_audit_raw" ] # 清理冗余原始字段 } # 若为非XML结构化文本,可自行编写Grok规则解析: # grok { # match => { "oracle_audit_raw" => "你的自定义Grok规则" } # } }
3. 输出层对接Amazon ES
使用Amazon ES官方适配插件输出解析后的结构化数据:
output { amazon_es { hosts => ["你的Amazon ES集群域名,例如https://es-domain.us-east-1.es.amazonaws.com"] region => "你的AWS区域" # 若Logstash运行的EC2已绑定有权限访问ES的IAM角色,无需配置以下AK/SK # aws_access_key_id => "你的AWS AK" # aws_secret_access_key => "你的AWS SK" index => "oracle-audit-log-%{+YYYY.MM.dd}" # 按天拆分索引 ilm_enabled => false # 若未开索引生命周期管理可关闭 } }
注意事项
- 如果审计日志存在非UTF-8编码,可在input的plain codec中修改
charset参数适配 - IAM角色需要配置S3读权限、ES写入权限,避免权限报错
- 若单条日志跨行,可在input层配置
multilinecodec合并行,保证完整匹配<AuditRecord>标签
内容的提问来源于stack exchange,提问作者Jijo John
相关产品推荐
相关产品推荐

