我正在使用saltstack配置cloudwatch代理日志(这就是为什么有些语法奇怪的原因)。我试图将任意数量的文件合并到一个文件中,这些文件包含相同架构的文件,但数据不同。
文件1
{
"logs": {
"logs_collected": {
"files":{
"collect_list": [
{
"file_name": "/var/log/suricata/eve-ips.json",
"log_group_name": "{{grains.environment_full}}SuricataIPS",
"log_stream_name": "{{grains.id}}",
"timezone": "UTC",
"timestamp_format": "%Y-%m-%dT%H:%M:%S.%f+0000"
}
]
}
}
}
}
文件2
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_name": "/var/log/company/company-json.log",
"log_group_name": "{{grains.environment_full}}Play",
"log_stream_name": "{{grains.id}}",
"timezone": "UTC",
"timestamp_format": "%Y-%m-%dT%H:%M:%S.%fZ"
},
{
"file_name": "/var/log/company/company-notifications.log",
"log_group_name": "{{grains.environment_full}}Notifications",
"log_stream_name": "{{grains.id}}",
"timezone": "UTC",
"timestamp_format": "%Y-%m-%dT%H:%M:%S.%fZ"
}
]
}
}
}
}
文件3
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_name": "/var/ossec/logs/alerts/alerts.json",
"log_group_name": "{{grains.environment_full}}OSSEC",
"log_stream_name": "{{grains.id}}",
"timezone": "UTC",
"timestamp_format": "%Y-%m-%d %H:%M:%S"
}
]
}
}
}
}
jQuery查询(基于一些SO帮助)
jq -s '.[0].logs.logs_collected.files.collect_list += [.[].logs.logs_collected.files.collect_list | add] | unique| .[0]' web.json suricata.json wazuh-agent.json
输出量
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_name": "/var/log/company/company-json.log",
"log_group_name": "{{grains.environment_full}}Play",
"log_stream_name": "{{grains.id}}",
"timezone": "UTC",
"timestamp_format": "%Y-%m-%dT%H:%M:%S.%fZ"
},
{
"file_name": "/var/log/company/company-notifications.log",
"log_group_name": "{{grains.environment_full}}Notifications",
"log_stream_name": "{{grains.id}}",
"timezone": "UTC",
"timestamp_format": "%Y-%m-%dT%H:%M:%S.%fZ"
},
{
"file_name": "/var/log/company/company-notifications.log",
"log_group_name": "{{grains.environment_full}}Notifications",
"log_stream_name": "{{grains.id}}",
"timezone": "UTC",
"timestamp_format": "%Y-%m-%dT%H:%M:%S.%fZ"
},
{
"file_name": "/var/log/suricata/eve-ips.json",
"log_group_name": "{{grains.environment_full}}SuricataIPS",
"log_stream_name": "{{grains.id}}",
"timezone": "UTC",
"timestamp_format": "%Y-%m-%dT%H:%M:%S.%f+0000"
},
{
"file_name": "/var/ossec/logs/alerts/alerts.json",
"log_group_name": "{{grains['environment_full']}}OSSEC",
"log_stream_name": "{{grains.id}}",
"timezone": "UTC",
"timestamp_format": "%Y-%m-%d %H:%M:%S"
}
]
}
}
}
}
如果您已经走了那么远,谢谢。还有一点要注意的是,如果我更改文件的顺序,collect_list
则总是重复第一个索引,如果web.json
最后一个(唯一一个长度为2的索引)则第二个日志文件不在组中。
作为尝试的一部分,您有几个错误的步骤。首先,要转换所有“列表”数组的数组
[.[].logs.logs_collected.files.collect_list]
单个数组,您需要使用,add
但是调用它的方式不正确。add将输入作为对象数组,并将输出的元素相加在一起。所以应该是
[.[].logs.logs_collected.files.collect_list] | add
然后是unique
函数,该函数再次将一个数组作为输入,并按排序顺序生成相同元素的数组,并删除了重复项。
[.[].logs.logs_collected.files.collect_list] | add | unique
至于第一个元素的重复,这是因为您使用的是append操作+=
而不是Assign =
。因为操作符右侧的代码使用附加将所有对象的条目归为一组,所以仅将值附加在第一个对象中,其余对象组合在一起。
(..)
在.[0]
从结果对象访问之前,还要将功能分组在一起。因此,不管文件的顺序如何,将其放在一起都能按预期工作。
jq -s '.[0].logs.logs_collected.files.collect_list = ([.[].logs.logs_collected.files.collect_list]|add|unique)|.[0]'
使用reduce
而不必使用slurp
mode的另一个变体-s
,而是处理inputs
标准输入上所有可用文件的ie内容
jq -n 'reduce inputs.logs.logs_collected.files.collect_list as $d (.; .logs.logs_collected.files.collect_list += $d)'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句