Logstash:UNIX 紀元時間未轉換為可讀格式

Logstash:UNIX 紀元時間未轉換為可讀格式

我已經設定了一個 ELK 堆疊,並且正在嘗試解析魷魚日誌條目。

我在嘗試將以下 UNIX/Epoc 時間轉換為

1442469455.757

為人類可讀的格式。

在排除故障時,我收到以下錯誤:

收到的事件的字元編碼與您配置的不同。

這帶有一個"_dateparsefailure"標籤,這意味著它失敗了。

我使用了以下logstash過濾器

filter {
if [type] == "squid" {
        grok {
        patterns_dir   => [ "/etc/logstash/patterns" ]
        match => { message => "%{SQUID_LOG}" }
        }
        date {
          match => [ "timestamp", "UNIX" ]
        }
   }
}

定義為符合主模式中的時間戳記的正規表示式模式"%{SQUID_LOG}" 是:(%{DATA:timestamp})

請告訴我是否有永久解決方案或解決方法。

提前致謝。

更新:

這似乎是由時間戳後面的額外空格引起的,如下所述:

value=>"1438744871.647\\xA0\\xA0\\xA0\\xA0\\xA0", :exception=>"Invalid UNIX epoch value '1438744871.647\\xA0\\xA0\\xA0\\xA0\\xA0'", :config_parsers=>"UNIX", :config_locale=>"default=en_GB", :level=>:warn

有沒有辦法擺脫'\\xA0\\xA0\\xA0\\xA0\\xA0'時間戳之後的那些?

配置:

input { stdin { } }

filter {
        grok {
        match => { message => "((%{DATA:time_stamp}) (%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))" }
        add_tag => "NONU"
        }
        mutate {
        strip => [ "time_stamp" ]
        }
        date {
         match => [ "time_stamp", "UNIX" ]
        }
   }

output {
  stdout { codec => rubydebug }
}

樣本資料:

1442469456.136      1 19.108.217.100 DENIED/407 3864 CONNECT fei.wsp.microsoft.com:443 - HIER_NONE/- text/html -

答案1

如果錯誤確實是由time_stamp欄位中的額外空格引起的,您可以使用mutate篩選器來strip解決。您的過濾器將如下所示:

filter {
  if [type] == "squid" {
    grok {
      patterns_dir   => [ "/etc/logstash/patterns" ]
      match => { message => "%{SQUID_LOG}" }
    }
    mutate {
      strip => ["time_stamp"]
    }
    date {
      match => [ "time_stamp", "UNIX" ]
    }
 }
}

更新

如果所有日誌條目在時間戳後恰好有 6 個額外空格,請如下更新您的 grok 模式。請注意time_stamp和之間的額外空格time_epapsed_ms

((%{DATA:time_stamp})      (%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))

如果可能多於或少於 6 個空格,則以下內容應有效。

((%{DATA:time_stamp})%{SPACE}(%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))

答案2

我懷疑這是 SQUID_LOG 解析過程中的問題(例如令牌遺失或放錯位置)。

如果將過濾器程式碼放在以下內容之間,您可以看到更多內容:

input {
  file {
    path => "/opt/logstash/squid.log"
    type => "squid"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

[filter]

output {
    stdout { codec => rubydebug }   
}

其中 /opt/logstash/squid.log 只是一些有問題的日誌行。

和:

/opt/logstash/bin/logstash -f this_test_conf_file.conf

您將在螢幕上看到正在發生的事情。

相關內容