2019년 7월 7일 일요일

Logstash 필터 ruby - 3rd

별도의 구분자 없이 오직 길이로만 구분되는 로그도 있다.
2011-04-1010:24:35192.254.192.21110.168.0.3
2011-04-1010:25:21192.184.27.17  10.168.0.3
2011-04-1010:26:11192.239.17.233 10.168.0.3
2011-04-1010:27:22192.222.1.43   10.168.0.3
2011-04-1010:27:23192.68.15.236  10.168.0.3
2011-04-1010:28:35192.67.222.136 10.168.0.3
2011-04-1010:31:11192.46.105.186 10.168.0.3
2011-04-1010:31:11192.46.148.31  10.168.0.3
2011-04-1010:31:14192.221.72.126 10.168.0.3
2011-04-1010:33:23192.56.214.97  10.168.0.3

다음은 message 필드의 특정 길이에 해당하는 문자열을 추출, 필드로 분류해주는 ruby 필터식. '[시작위치..끝위치]' 구문을 사용했다.
filter {
 ruby {
  code => "
   event.set('date', event.get('message')[0..9])
   event.set('time', event.get('message')[10..17])
   event.set('sip', event.get('message')[18..32])
   event.set('dip', event.get('message')[33..42])
  "
 }
}

결과는 다음과 같음.
{
          "host" => "MHKANG",
          "time" => "10:24:35",
       "message" => "2011-04-1010:24:3510.254.192.211 10.168.0.3\r",
      "@version" => "1",
          "path" => "d:/test.log",
          "date" => "2011-04-10",
           "sip" => "192.254.192.211",
           "dip" => "10.168.0.3\r",
    "@timestamp" => 2019-07-07T05:45:08.848Z
}

길이를 뒤에서부터 측정할 수도 있고,
filter {
 ruby {
  code => "
   event.set('date', event.get('message')[-44..-35])
   event.set('time', event.get('message')[-34..-27])
   event.set('sip', event.get('message')[-26..-12])
   event.set('dip', event.get('message')[-11..-1])
  "
 }
}

'[시작위치,범위]' 구문을 사용할 수도 있다.
filter {
 ruby {
  code => "
   event.set('date', event.get('message')[0,10])
   event.set('time', event.get('message')[10,8])
   event.set('sip', event.get('message')[18,15])
   event.set('dip', event.get('message')[33,10])
  "
 }
}

이렇게도 됨.
filter {
 ruby {
  code => "
   event.set('date', event.get('message')[0..-35])
   event.set('time', event.get('message')[10..-27])
   event.set('sip', event.get('message')[18..-12])
   event.set('dip', event.get('message')[33..-1])
   event.set('timestamp', event.get('date') + ' ' + event.get('time'))
  " 
 }
}

결과는 모두 동일. 참고로 timestamp 필드는 date와 time 필드를 '공백'으로 이어붙인 결과.
{
          "host" => "MHKANG",
     "timestamp" => "2011-04-10 10:24:35",
          "time" => "10:24:35",
       "message" => "2011-04-1010:24:3510.254.192.211 10.168.0.3\r",
      "@version" => "1",
          "path" => "d:/test.log",
          "date" => "2011-04-10",
           "sip" => "192.254.192.211",
           "dip" => "10.168.0.3\r",
    "@timestamp" => 2019-07-07T05:49:01.127Z
}

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스