0

我们正在使用具有以下配置的 Logstash 接收日志:

input {
  udp {
    type => "logs"
    port => 12203
  }
}

filter {
  grok {
    type => "tracker"
     pattern => '%{GREEDYDATA:message}'
  }
  date {
    type => "tracker"
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss,SSS" ]
  }
}

output{
    tcp{
         type => "logs"
         host => "host"
         port => 12203
    }
}

然后,我们使用"host"以下设置在机器上提取日志:

input {
      tcp {
                      type => "logs"
                      port => 12203
                        }
}


output {
    pipe {
        command => "python /usr/lib/piperedis.py"
    }
}

从这里开始,我们正在解析这些行并将它们放入 Redis 数据库。然而,我们发现了一个有趣的问题。

Logstash 将日志消息“包装”在 JSON 样式包中,即:

{\"@source\":\"source/\",\"@tags\":[],\"@fields\":{\"timestamp\":[\"2013-09-16 15:50:47,440\"],\"thread\":[\"ajp-8009-7\"],\"level\":[\"INFO\"],\"classname\":[\"classname\"],\"message\":[\"message"\]}}

然后,我们在收到它并在下一台机器上传递它时,将其作为消息并将其放入另一个包装器中!我们只对实际的日志消息感兴趣,对其他内容(源路径、源、标签、字段、时间戳等)不感兴趣

有没有办法我们可以使用过滤器或其他东西来做到这一点?我们查看了文档,但找不到任何方法在 Logstash 实例之间传递原始日志行。

谢谢,

马特

4

2 回答 2

1

logstash 文档是错误的 - 它表明默认的“编解码器”是普通的,但实际上它不使用编解码器 - 它使用输出格式

要获得更简单的输出,请将输出更改为类似

output {
    pipe {
        command => "python /usr/lib/piperedis.py"
        message_format =>  "%{message}"
    }
}
于 2013-10-03T04:29:19.980 回答
0

为什么不直接从标准输出中提取这些消息?

line = sys.stdin.readline()
line_json = json.loads(line)
line_json['message'] # will be your @message
于 2013-12-11T03:04:14.873 回答