2013-09-16 101 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