📚概述
graylog
中pipeline
的功能还是比较常用的,可以对字段进行处理,日志删除等操作。
🎨原理
Pipeline
位于Stream
之后,可以对Stream
中的消息进行处理。
实际使用过程中,分流到Stream
的规则中可能会用到pipeline
清晰后的字段,那么该如何处理呢?
Graylog
接收的所有消息最初都会路由到“All messges
”流中。可以将此流用作pipeline
处理的入口点,从而允许将传入消息路由到更多流并随后进行处理。也就是说所有消息的过滤、字段变动可以先针对All messages
进行,然后在到达其他stream
时数据已经被清理一次了。
📗pipeline配置与使用
📐pipeline规则配置
点击System/pipelines -> Manage rules -> Create Rule
根据具体的需求配置合适的规则即可。
例如:对filebeat_fields
字段重命名
rule "app_name rename"
when
has_field("filebeat_fields_app_name")
then
//rename_field(old_field, new_field)
rename_field("filebeat_fields_app_name","app_name");
end
删除无用字段
rule "delete useless filed"
when
has_field("filebeat_collector_node_id")
then
remove_field("filebeat_@metadata_version");
remove_field("filebeat_@metadata_beat");
remove_field("beats_type");
remove_field("filebeat_@metadata_type");
remove_field("filebeat_@timestamp");
remove_field("filebeat_offset");
remove_field("filebeat_prospector_type");
remove_field("filebeat_beat_version");
end
🎫规则配置结果
🧩pipeline配置
点击System/pipelines -> Manage pipelines -> Add new pipeline
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQtEbmsr-1669204646977)(https://cdn.nlark.com/yuque/0/2022/png/2642424/1667968229982-712f01fc-3904-42be-a5de-5fe39d97636a.png)]
- 填写名称信息
- 关联
connections
,点击edit connections
,选择All messages
。这里是全局配置,所以选择了All messages
,如果需要对单独的Stream
进行数据处理,配置指定的Stream
即可。
- 配置
stage
,点击Add new stage
,可以在一个stage
中配置上述所有规则
![image.png](https://img-blog.csdnimg.cn/img_convert/0e045fd7e1f44bedd31ce0a8d79d9e82.png#averageHue=#fafaf9&clientId=u81abf24e-c8f4-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=363&id=u3fa8a1d1&margin=[object Object]&name=image.png&originHeight=363&originWidth=1869&originalType=binary&ratio=1&rotation=0&showTitle=false&size=51669&status=done&style=none&taskId=ueea99cd9-b4fa-4d2e-8d3f-d455fccdbad&title=&width=1869)
stage
中有具体的处理流程,配置的顺序、以及条件都会影响最终的消息。
📙常用的pipeline
debug
日志不入库
rule "discard debug messages"
when
// debug 日志不入库
to_long($message.level) > 6
then
drop_message();
end
日志级别说明
级别(从低到高):ALL
、TRACE
、DEBUG
、INFO
、WARN
、ERROR
、FATAL
、OFF
slf4j
中就只有trace
、debug
、info
、warn
、error
level_name | level |
---|---|
DEBUG | 7 |
INFO | 6 |
WARN | 4 |
ERROR | 3 |
有些日志中并没有level
字段,上述规则就无效了。
时间格式对齐
修改timestamp
时间为日志中的时间。日志产生时间和日志推送的时间是不一致的,对日志查询存在一定的影响。如下图所示:
日志示例:
2022-11-23 15:12:38.332 [http-nio-8081-exec-5] INFO c.a.g.controller.LogGenerateController - info级别177951 info code
需要把上述日志格式中的时间解析为timestamp
字段
rule "timestamp del"
when
true
then
let m = regex("([0-9]{4}-[0-9]{2}-[0-9]{2}\\s[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3})",to_string($message.message));
set_field("timestamp",parse_date(to_string(m["0"]),"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
end
注意:如果已经对有日志了,那么
timestamp
的时间格式为yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
,这里格式化的时间格式必须是yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
,否则日志不能正常存储