2016-09-01 3 views
0

LogSash 서버에 json 형식의 로그를 보냅니다. (: 전체 메시지는 한 줄에 정말입니다,하지만 난 읽기 쉽게하기 위해 여러 줄에 보여 주) 내가 얻을 내 Logstash 구성에 둘 필요가 무엇Logstash에서 json 형식의 로그 메시지를 구문 분석하여 특정 키/값 쌍을 얻으려면 어떻게해야합니까?

2016-09-01T21:07:30.152Z 153.65.199.92 
{ 
    "type":"trm-system", 
    "host":"susralcent09", 
    "timestamp":"2016-09-01T17:17:35.018470-04:00", 
    "@version":"1", 
    "customer":"cf_cim", 
    "role":"app_server", 
    "sourcefile":"/usr/share/tomcat/dist/logs/trm-system.log", 
    "message":"some message" 
} 

을 로그는 다음과 같이 보입니다 "sourcefile"값을 얻고 궁극적으로 파일 이름을 얻습니다 (예 : trm-system.log)?

답변

1

해시 필드 (타임 스탬프 없음)를 ES로 펌핑하면이를 인식해야합니다.

logstash 파이프 라인에서 수행하려는 경우 json filter을 사용하고 source =>을 두 번째 부분으로 지정합니다 (타임 스탬프 프리픽스를 다시 추가 할 수 있음). 모든 분야에서

이 결과는 현재의 메시지에 추가, 당신은 직접 액세스하거나 할 수있는 모든 조합 :

구성 :

input { stdin { } } 
filter { 
    # split line in Timestamp and Json 
    grok { match => [ message , "%{NOTSPACE:ts} %{NOTSPACE:ip} %{GREEDYDATA:js}"] } 

    # parse json part (called "js") and add new field from above 
    json { source => "js" } 
} 
output { 
    # stdout { codec => rubydebug } 
    # you access fields directly with %{fieldname}: 
    stdout { codec => line { format => "sourcefile: %{sourcefile}"} } 
} 

샘플 실행

2016-09-01T21:07:30.152Z 153.65.199.92 { "sourcefile":"/usr" } 
sourcefile: /usr 

및 rubydebug와

(호스트 및 @timestamp 삭제됨) :

{ 
    "message" => "2016-09-01T21:07:30.152Z 153.65.199.92 { \"sourcefile\":\"/usr\" }", 
    "@version" => "1", 
     "ts" => "2016-09-01T21:07:30.152Z", 
     "ip" => "153.65.199.92", 
     "js" => "{ \"sourcefile\":\"/usr\" }", 
"sourcefile" => "/usr" 
} 

알다시피, sourcefile 필드는 rubydebug 출력의 값으로 직접 알려져 있습니다.

로그 레코드 원본에 따라 multiline 코덱을 사용해야 할 수도 있습니다. js 필드를 삭제하고 @timestamp의 이름을 _parsedate으로 바꾼 다음 ts을 구문 분석하여 기록 타임 스탬프 (기바나가 행복해 지도록)로 바꿀 수도 있습니다. 이것은 샘플에 표시되지 않습니다. 또한 공간을 절약하기 위해 message을 제거합니다.

+0

출력 플러그인에서 파일 이름을 사용하고자하므로 Logstash 파이프 라인에서 구문 분석하고 싶습니다. json 필터를 살펴 봤지만 문서에서는 특정 필드를 가져 오는 방법을 설명하지 않으며 값을 사용합니다. 당신의 대답을 자세히 설명해주십시오. –

+0

@ChrisF done :) – eckes