2017-07-06 43 views
0

我一直在試圖設置一個自定義的多行日誌解析器來獲取帶有一些可讀字段的Stackdriver日誌。目前,它看起來像這樣:Stackdriver自定義多行日誌記錄,時間格式

<source> 
    type tail 
    read_from_head true 
    path /root/ansible.log 
    pos_file /var/lib/google-fluentd/pos/ansible.pos 
    time_format "%a %b %e %T %Z %Y" 
    format multiline 
    format_firstline /Started ansible run at/ 
    format1 /Started ansible run at (?<timestart>[^\n]+)\n(?<body>.*)/ 
    format2 /PLAY RECAP.*/ 
    format3 /ok=(?<ok>\d+)\s+changed=(?<changed>\d+)\s+unreachable=(?<unreachable>\d+)\s+failed=(?<failed>\d+).*/ 
    format4 /Finished ansible run at (?<timeend>[^\n]+)/ 
    tag ansible 
</source> 

它的完成的規格爲http://docs.fluentd.org/v0.12/articles/parser_multiline,和它的作品。但它沒有適當的時間戳 - timestarttimeend只是json中的簡單字段。所以在當前狀態下,time_format設置是無用的,因爲我在正則表達式中沒有time變量。這樣可以彙總我所需要的所有變量,當我運行fluend服務時,日誌會顯示在Stackdriver中,而且幾乎都很快樂。

但是,當我將其中一個時間變量的名稱更改爲time時,試圖爲條目實際分配一個Stackdriver時間戳,它不起作用。機器上流利的日誌表示工作人員啓動並解析了所有內容,但根本沒有在Stackdriver控制檯中顯示日誌。

timestarttimeend看起來像Fri Jun 2 20:39:58 UTC 2017或沿着這些線。時間格式的規格是http://ruby-doc.org/stdlib-2.4.1/libdoc/time/rdoc/Time.html#method-c-strptime,我已經檢查過並重複檢查了太多次,我無法弄清楚我做錯了什麼。

編輯:另一個細節:當我試圖解析出time變量,而日誌沒有在爲Stackdriver控制檯顯示,選擇合適的標籤(在這種情況下ansible)在標籤列表中顯示。只是結果是空的。

回答

0

你是正確的,因爲爲Stackdriver日誌代理查找在'time'領域的時間戳,但它使用Ruby的Time.iso8601來解析該值(誤差在Time.at回落)。您引用的字符串(Fri Jun 2 20:39:58 UTC 2017)不是這兩種格式中的任何一種,因此無法解析它(您可能會在/var/log/google-fluentd/google-fluentd.log中看到錯誤)。 您可以將record_transformer插件添加到您的配置中,將解析日期更改爲正確的格式(提示:enable_ruby是您的朋友)。喜歡的東西:

<filter foo.bar> 
    @type record_transformer 
    enable_ruby 
    <record> 
    time ${Time.strptime(record['time'], '%a %b %d %T %Z %Y').iso8601} 
    </record> 
</filter> 

應該工作...

+0

除,正如我所說,我沒有看到在fluentd日誌中的任何錯誤,fluentd日誌說一切正常,它只是日誌唐不會出現在Stackdriver中。至於時間格式,我已經嘗試在上面的塊中使用'%a%b%e%T%Z%Y',所以我只是想知道爲什麼我的方法不工作。 – snetch