2016-07-25 4 views
0

일부 로그를 읽으려면 logstash를 사용하고 있습니다. 타임 스탬프가 시간 필드 (예 : 08 : 28 : 20,500)만으로 구성된 로그 파일은 있지만 날짜 필드는 없습니다. 오늘의 datetime과 매핑하고 싶습니다. 날짜 필터로 어떻게해야합니까?Logstash Parse Date Issue

내 로그 파일의 내용은 다음과 같습니다.

08:28:20,500 INFO [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 27) JBAS010403: Deploying JDBC-compliant driver class org.h2.Driver (version 1.3)>>"C:\CIGNA\jboss\jboss.log" 

이 문제를 해결할 수있는 사람이 있습니까? 사전에 감사드립니다.

수정 루비를 필터로 사용한 후 문제를 해결할 수있었습니다. 그러나 때때로 루비 예외가 있습니다. 아래에서 볼 수 있듯이 첫 번째 메시지는 루비 예외가 발생했지만 두 번째 메시지는 정상적으로 실행됩니다. 어떻게 이런 일이 일어날 지 궁금해 할 것입니다. 감사.

{ 
     "message" => "10:30:39 FATAL [org.jboss.as.server] (default task-1) JBAS015957: Server boot has failed in an unre 
coverable manner; exiting. See previous messages for details.\r", 
     "@version" => "1", 
    "@timestamp" => "2016-07-26T02:43:17.379Z", 
      "path" => "C:/CIGNA/jboss/jboss.log", 
      "host" => "SIMSPad", 
      "type" => "txt", 
      "Time" => "10:30:39", 
     "Level" => "FATAL", 
    "JavaClass" => "org.jboss.as.server", 
     "Message" => "(default task-1) JBAS015957: Server boot has failed in an unrecoverable manner; exiting. See previo 
us messages for details.\r", 
      "tags" => [ 
     [0] "_rubyexception" 
    ] 
} 
{ 
     "message" => "10:30:39 DEBUG [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) Settings reconfig 
ured: JBOSS EAP Resettlement\r", 
     "@version" => "1", 
    "@timestamp" => "2016-07-26T02:30:39.000Z", 
      "path" => "C:/CIGNA/jboss/jboss.log", 
      "host" => "SIMSPad", 
      "type" => "txt", 
      "Time" => "10:30:39", 
     "Level" => "DEBUG", 
    "JavaClass" => "org.jboss.as.quickstarts.logging.LoggingExample", 
     "Message" => "(default task-1) Settings reconfigured: JBOSS EAP Resettlement\r" 
} 

내 logstash .conf 파일의 업데이트 된 필터 부분은 다음과 같습니다.

filter { 
    grok { 
    match => { "message" => '\A%{TIME:Time}%{SPACE}%{WORD:Level}%{SPACE}\[%{PROG:JavaClass}]%{SPACE}%{JAVALOGMESSAGE:Message}'} 
    } 
    ruby { 
     code => " 
     p = Time.parse(event['message']); 
     event['@timestamp'] = LogStash::Timestamp.new(p); 
     " 
    } 
} 
+0

내가 샘플 로그 행에있는 타임 스탬프 (날짜 또는 시간)을 볼 수 없습니다. – Val

+0

죄송합니다, miscopied. 나는 그것을 지금 편집했다. 생각 나게 해줘서 고마워. –

+1

날짜 필터가 "타임 스탬프"가 아닌 "시간"과 일치한다고 가정합니다. 아니면 "타임 스탬프"다른 어딘가에 있습니까? – pandaadb

답변

3

당신은 루비 필터를 통해이를 수행 할 수 있습니다. 루비는 이것을 상자에서 파싱 할 수 있습니다. 죄송합니다. 날짜 필터로 시도하지 않았습니다 (잘 작동 할 수도 있음). 여기 내 예입니다

내 구성 :

input { 
    stdin { 
    } 
} 


filter { 

    ruby { 
     code => " 
     p = Time.parse(event['message']); 
     event['myTime'] = p; 
     " 
    } 

} 


output { 
      stdout { codec => rubydebug } 
} 

입력 및 출력 :

[

[email protected]:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2/ 
Settings: Default pipeline workers: 8 
Pipeline main started 

08:28:20 

{ 
     "message" => "08:28:20", 
     "@version" => "1", 
    "@timestamp" => "2016-07-25T09:43:28.814Z", 
      "host" => "pandaadb", 
     "myTime" => 2016-07-25 08:28:20 +0100 
} 

나는 단순히 문자열을 전달하고, 당신이 구문 분석 변수를 사용할 수 있습니다 , 예. 루비 코드에서 "시간".

루비는 날짜를 파싱 할 때 매우 똑똑하고 전체 날짜가 아니라 시간임을 인식합니다. 따라서 오늘의 타임 스탬프를 사용하고 시간 만 수정합니다.

희망 하시겠습니까?

편집 :

난 그냥 지금 날짜 필터를 시도하고 하나는 다르게 작동합니다. 올해 날짜를 올해 1 위로 설정합니다. 그래서 그것은 루비 필터가 해결책이 될 것으로 보입니다. 날짜 필터는 일치 된 후에 날짜를 수정하기 위해 알고있는 날짜 수정을 제공하지 않기 때문입니다.

편집 2 :

코멘트에서 당신은 @timestmap 필드에 그것을 작성하는 방법을 물었다. @timestamp 필드는 Logstash Timestamp Objects (문자열 또는 datetime 객체 아님)를 필요로하는 미리 정의 된 필드입니다. 따라서 해당 필드에 직접 작성할 수 있지만 개체를 ​​만들어야합니다. (다른 방법이 또한 날짜 필터를 사용하여 작업 할 것이지만, 이중 필터를 왜) 여기

필요한 코드 :

ruby { 
     code => " 
     p = Time.parse(event['message']); 
     event['@timestamp'] = LogStash::Timestamp.new(p); 
     " 
    } 

편집 : 업데이트 된 질문에 관해서

, 문제 이벤트에서 잘못된 변수를 사용하고 있다는 것입니다.필터에서

"message" => "10:30:39 FATAL [org.jboss.as.server] (default task-1) JBAS015957: Server boot has failed in an unre ...", 
"Time" => "10:30:39" 

그러나 당신이 "메시지"이벤트의 변수가 아니라 "시간"을 참조 :

로그 업데이트에서

, 당신은 당신의 grok 수는 예를 들어이 제대로 일을 분석하는 것을 볼 수 있습니다 변하기 쉬운. 그래서 ruby는 전체 메시지 문자열을 날짜로 파싱하려고합니다. 당신은 당신의 필터를 변경해야하는 D

:이 두 번째 로그에 작동 왜 나에게 신비이 이벤트 필드에있는 시간이 걸릴 구문 분석을 말할 것이다

filter { 
    grok { 
    match => { "message" => '\A%{TIME:Time}%{SPACE}%{WORD:Level}%{SPACE}\[%{PROG:JavaClass}]%{SPACE}%{JAVALOGMESSAGE:Message}'} 
    } 
    ruby { 
     code => " 
     p = Time.parse(event['Time']); 
     event['@timestamp'] = LogStash::Timestamp.new(p); 
     " 
    } 
} 

"시간 ".

감사합니다, 아르투르

+0

답해 주셔서 감사합니다. 간단한 질문 만하십시오. 그렇다면 먼저 루비 필터를 사용하여 새 필드 (예 : myTime)를 만든 다음 날짜 필터를 사용하여 새 필드를 @timestamp와 매핑해야합니까? –

+1

@KennedyKan "@timestamp"에 바로 쓸 수 있습니다. 더블 필터를 할 필요가 없습니다. 그러나 타임 스탬프 logstash 개체를 만들어야합니다. 나는 당신을 위해 대답을 업데이 트합니다 – pandaadb

+0

덕분에. 그것은 완벽하게 작동합니다. –