2014-04-07 3 views
20

Logstash + Elasticsearch + Kibana를 사용하여 Tomcat 로그 파일의 개요를 볼 수 있습니다.Logstash : 파일 이름을 필드로 추가하는 방법은 무엇입니까?

각 로그 항목마다 내가 작성한 파일의 이름을 알아야합니다. 필드로 추가하고 싶습니다. 그것을 할 수있는 방법이 있습니까? 나는 조금 봤 거든 난 단지 this SO question을 찾았지만 대답은 더 이상 최신입니다. 내가 logstash 때마다 다시 구성해야 다음

input { 
    file { 
    type => "catalinalog" 
    path => [ "/path/to/my/files/catalina**" ] 
    add_field => { "server" => "prod1" } 
    } 
} 

그러나 새로운 수있다 :

지금까지 내가 볼 수있는 유일한 솔루션과 같이 다른 "add_field"각 가능한 파일 이름에 대한 별도의 구성을 지정하는 것입니다 파일 이름. 더 좋은 아이디어가 있습니까?

답변

35

안녕하세요 저는이 일을하기 위해 그로크 필터를 추가했습니다. 파일 이름을 경로가 아니라고하고 싶었지만 필요에 맞게 변경할 수 있습니다.

경우
filter { 
    grok { 
    match => ["path","%{GREEDYDATA}/%{GREEDYDATA:filename}\.log"] 
    } 
} 
+0

답장을 보내 주셔서 감사합니다 :) 그 파일 이름 안의 로그 파일 내용을 찾으시겠습니까? – machinery

+2

일반적으로 메시지 필드에서 grok를 사용하지는 않지만 logstash가 자동으로 추가하는 특수 필드 인 경로 필드를 사용합니다. –

+0

Thanks a lot :) 해결책은 "{GREEDYDATA : filename}"앞에 백분율 기호를 추가 한 후 작동합니다. 답변을 업데이트하십시오. 해결책으로 수락합니다. "경로"필드의 존재를 알지 못했습니다. – machinery

1

당신은 하나 개의 이벤트에서 메시지와 파일 이름을 결합하고 싶습니다 :

filter { 
grok { 
    match => { 
     message => "ERROR (?<function>[\S]*)" 
     } 
} 
grok { 
    match => { 
     path => "%{GREEDYDATA}/%{GREEDYDATA:filename}\.log" 
     } 
}} 

결과를 ElasticSearch에 ('파일 이름'과 '기능'필드에 초점) :

"_index": "logstash-2016.08.03", 
    "_type": "logs", 
    "_id": "AVZRyEI49-A6kyBCq6Yt", 
    "_score": 1, 
    "_source": { 
     "message": "27/07/16 12:16:18,321 ERROR blaaaaaaaaa.internal.com", 
     "@version": "1", 
     "@timestamp": "2016-08-03T19:01:33.083Z", 
     "path": "/home/admin/mylog.log", 
     "host": "my-virtual-machine", 
     "function": "blaaaaaaaaa.internal.com", 
     "filename": "mylog" 
    } 
관련 문제