Logstash: UNIX Epoch 시간이 읽을 수 있는 형식으로 변환되지 않습니다.

Logstash: UNIX Epoch 시간이 읽을 수 있는 형식으로 변환되지 않습니다.

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할 수 있습니다 . 그러면 필터는 다음과 같습니다.mutatestrip

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

당신은 무슨 일이 일어나고 있는지 화면에서 보게 될 것입니다.

관련 정보