2017-01-21 9 views
0

XML 및 기타 임의 출력을 포함하는 로그 파일을 구문 분석하려고합니다. 특정 경우 고객에게 예약이 성공적으로 전송되었는지 여부를 확인하고 싶습니다.Logstash - 헤드와 테일로 여러 줄의 메시지 분할

[11-28-51.440000] Sending reservation to customer 
[11-28-51.492900] <?xml version="1.0" encoding="UTF-8"?><SendReservation><ReservationId>1289</ReservationId><Customer>2892</Customer>...</SendReservation> 
[11-28-51.493000] Status: Successfull 
[11-28-52.261000] Something different 
[11-28-51.520000] Sending reservation to customer 
[11-28-54.548900] <?xml version="1.0" encoding="UTF-8"?><SendReservation><ReservationId>2732</ReservationId><Customer>7856</Customer>...</SendReservation> 
[11-28-54.600000] Status: Error: Reservation was rejected 

이제 logstash를 사용하여 ReservationId를 포함한 일부 예약 필드를 구문 분석해야합니다. 이를 위해 logstash XML 필터를 사용할 수 있습니다. 그러나 XML 출력 후 일반 텍스트로 인쇄되는 성공/오류 상태와 결합해야합니다.

"message" => "[11-28-51.492900] <?xml version="1.0" encoding="UTF-8"?><SendReservation><ReservationId>1289</ReservationId><Customer>2892</Customer>...</SendReservation>\n[11-28-51.493000] Status: Successfull\n[11-28-52.261000] Something different\n[11-28-51.520000] Sending reservation to customer 

는 XML 필터 I와 XML을 구문 분석 할 수 있도록 : 나는 logstash 이벤트 메시지를해야합니다 그것으로

input { 
    file { 
    path => "test.log" 
    start_position => "beginning" 
    type => "reservation" 
    codec => multiline { 
     pattern => "\[(.*?)\](.*?)<\?xml[^>]*>" 
     negate => true 
     what => previous 
    } 
    } 
} 

:

나는 여러 줄 입력을 사용하려고 유효한 XML을 포함하는 source이라는 필드가 있어야합니다. 그러므로 나는 XML 이전의 타임 스탬프와 모든 것을 없애려고 노력하고있다.

mutate { 
     gsub => [ "message", "^(.*?)<\?xml[^>]*>", "" ] 
    } 
    mutate { 
     gsub => [ "message", "(?<=<\/SendReservation>).*$", "" ] 
    } 

이 시점에서 정규 표현식은 첫 번째 줄 (첫 번째 줄 앞)에서만 작동합니다. 즉, 종료 태그 다음에 오는 모든 것을 잘라내는 것은 효과가 없습니다. 이것은 내 첫 번째 문제이며, 여러 행과 관련이있을 수 있습니다.

두 번째 문제은 XML 콘텐츠를 이동하는 방법을 알지 못하므로 XML 필터에서 원본 필드로 사용할 수있는 새로운 필드로 '메시지'를 잘라냅니다. 나는 grok overwrite을 시도했지만 기존 필드가 필요하며 새 필드를 만들어야합니다.

결론적으로 필자가 원하는 것은 다중 행 메시지에서 머리와 꼬리 필드를 만드는 것입니다. Head는 주 정보를 담고있는 XML의 첫 번째 줄을 포함 할 것이고 나머지는 내가 관련시켜야 할 몇 가지 추가 정보로 끝낼 것이다.

답변

1

좋아, 덕분에 https://regex101.comhttp://grokconstructor.appspot.com에 나는 첫 번째 문제에

grok { match => { "message" => "(?<head>(\[(.*?)\](.*?)<\?xml[^>]*>(.*?)<\/SendReservation>))+(?<tail>(?<=<\/SendReservation>)(.|\n)*$)" } } 

대답을 사용할 필요가 자신에게 그것을

을 발견했습니다 나는 \ n 계정으로을해야 : ?<=<\/SendReservation>)(.|\n)*$

두 번째 문제에 대한 답변 : Logstash는 모든 정규식 그룹 이름에서 필드를 만듭니다. 이 경우 grok 패턴 (?<head>(regex_for_xml))+(?<tail>(regex_for_text))headtail 필드를 생성합니다.