2013-09-16 103 views
0

我们收到使用Logstash日志具有以下配置:多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"\]}} 

我们的话,就接受它并将其传给下一台机器上,采取的消息,并把它放在另一包装器!我们只对实际的日志消息感兴趣,而没有其他的东西(源路径,源代码,标签,字段,时间戳e.t.c.)

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

感谢,

马特

回答

1

的logstash文件是错误的 - 它表示默认的“解码器”是plain但事实上它不使用的编解码器 - 它采用了输出format

为了得到一个简单的输出,你输出更改为类似

output { 
    pipe { 
     command => "python /usr/lib/piperedis.py" 
     message_format => "%{message}" 
    } 
} 
0

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

line = sys.stdin.readline() 
line_json = json.loads(line) 
line_json['message'] # will be your @message