2014-03-13 2 views
5

grok match 명령으로 추출 된 필드의 산술 표현식으로 가정 된 grok 필터에 새 필드를 추가하려고합니다.EVAL in grok logstash

불행히도 올바른 구문을 알아낼 수 없었습니다 ... 아무도 없습니까?

어쨌든 {(8*6)}이 48을 반환 하겠지만 어쨌든 변수 대신에 상수가 있습니까?

==== 
`if [type] == "f5" { 
     grok { 
     match => [ message, "...%{WORD:was_status}...%{NUMBER:hour}hr:%{NUMBER:min}min:%{NUMBER:sec}sec" ] 
     add_field => [ "duration_%{was_status}", "\{((%{hour} * 3600) + (%{min} * 60) + %{sec})}" ] 
     } 
    }`  
==== 

는 결과를 얻었으나, EVAL 분명히 제대로 작동하지 :

message: .... [ was down for 0hr:0min:4sec ] 
duration_down \`{((0 * 3600) + (0 * 60) + 4)}` 

고마워, 유리

답변

10

There is an outstanding feature request for a math filter을,하지만 난이 시점에서 이러한 기능을 잘 모르는 것 같아요 .

그동안 ruby filter을 사용하여 이벤트에 임의의 Ruby 코드를 실행할 수 있습니다. 일반적으로 문자열에 값을 구문 분석

input { 
    generator { 
     count => 1 
     message => "1 2 3" 
    } 
} 

filter { 
    grok { 
     match => ["message", "%{NUMBER:a:int} %{NUMBER:b:int} %{NUMBER:c:int}"] 
    } 
    ruby { 
     code => "event['sum'] = event['a'] + event['b'] + event['c']" 
    } 
} 

output { 
    stdout { 
     codec => rubydebug{} 
    } 
} 

grok 것을 :

다음은 간단한 예입니다. 정수로 변환하지 않았다면 Ruby는 + 연산자를 문자열 연결로 처리했을 것입니다 (그리고 sum은 결국 123과 같습니다).

귀하의 ruby 필터는 더 다음과 같습니다

ruby { 
    code => "event['duration_down'] = event['hour']*3600 + event['min']*60 + event['sec']" 
}