2020년 11월 8일 일요일

Logstash 휴먼 버그

간단한 로그스태시 파이프라인 설정.
input {
 file {
  path => "D:/Edu/Multicam/elastic/log/iis_sample.log"
  start_position => "beginning"
  sincedb_path => "nul"
 }
}

output {
 elasticsearch {
  hosts => "192.168.56.1"
 }
}

실행 결과는 이렇다.
[2020-11-08T12:51:11,023][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-11-08T12:51:11,065][INFO ][logstash.outputs.elasticsearch][main] Creating rollover alias <logstash-{now/d}-000001>
{
          "path" => "D:/Edu/Multicam/elastic/log/iis_sample.log",
          "host" => "MHKANG",
    "@timestamp" => 2020-11-08T03:51:11.018Z,
      "@version" => "1",
       "message" => "2011-01-10 03:00:56 W3SVC1 192.168.48.11 GET /view.asp cate_id=2&vod_id=614 80 - 192.168.90.226 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+InfoPath.2;+MS-RTC+EA+2;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729) 200 0 0\r"
}

이때 제일 중요한 필드는 원본 데이터가 저장된 message. 그런데 혼재된 다른 필드 때문에 message 필드에 집중하기 힘들 때가 있다. 그래서 message를 제외한 나머지 필드 삭제. 
filter {
 mutate { remove_field => [ "@timestamp", "@version", "path", "host" ] }
}

이제 필터 수정에 따른 message의 변화에만 집중하면 된다.
[2020-11-08T12:54:06,099][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
    "message" => "2011-01-10 03:00:56 W3SVC1 192.168.48.11 GET /view.asp cate_id=2&vod_id=614 80 - 192.168.90.226 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+InfoPath.2;+MS-RTC+EA+2;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729) 200 0 0\r"
}

그런데 이 상태에서 인덱스명을 지정하면,
output {
 elasticsearch {
  hosts => "192.168.56.1"
  index => "iis-%{+yyyy}"
 }
}

의도했던 'iis-연도' 형식의 인덱스가 만들어지지 않는다. (elasticsearch.log)
[2020-11-08T12:55:05,143][INFO ][o.e.c.m.MetadataCreateIndexService] [MHKANG] [iis-] creating index, cause [auto(bulk api)], templates [], shards [1]/[1]
[2020-11-08T12:55:05,269][INFO ][o.e.c.m.MetadataMappingService] [MHKANG] [iis-/vG5ua_xbREWFi6YIrlxD8A] create_mapping [_doc]

원인은 연도를 포함한 시간 정보를 제공해주는 @timestamp를 삭제했기 때문. @timestamp를 다시 살려주면,
filter {
 mutate { remove_field => [ "@version", "path", "host" ] }
}

[2020-11-08T12:57:45,030][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
    "@timestamp" => 2020-11-08T03:57:45.035Z,
       "message" => "2011-01-10 03:00:56 W3SVC1 192.168.48.11 GET /view.asp cate_id=2&vod_id=614 80 - 192.168.90.226 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+InfoPath.2;+MS-RTC+EA+2;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729) 200 0 0\r"
}

의도대로 'iis-연도' 형식의 인덱스가 만들어진다.
[2020-11-08T12:57:45,162][INFO ][o.e.c.m.MetadataCreateIndexService] [MHKANG] [iis-2020] creating index, cause [auto(bulk api)], templates [], shards [1]/[1]
[2020-11-08T12:57:45,288][INFO ][o.e.c.m.MetadataMappingService] [MHKANG] [iis-2020/EN4Mku1CTzGRdnIPq8j4Pw] create_mapping [_doc]

@timestamp에 담긴 로그스태시의 데이터 전송 시간을 원본 데이터의 기록 시간으로 바꿔주면,
filter {
 mutate { remove_field => [ "@version", "path", "host" ] }
 dissect { mapping => { "message" => "%{timestamp} %{+timestamp} %{}" } }
 date { match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ] }
}

인덱스명의 연도 정보를 실제 데이터가 기록된 시간으로 바꿀 수도 있다.
[2020-11-08T12:59:51,086][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
     "timestamp" => "2011-01-10 03:00:56",
    "@timestamp" => 2011-01-09T18:00:56.000Z,
       "message" => "2011-01-10 03:00:56 W3SVC1 192.168.48.11 GET /view.asp cate_id=2&vod_id=614 80 - 192.168.90.226 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+InfoPath.2;+MS-RTC+EA+2;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729) 200 0 0\r"
}

[2020-11-08T12:59:51,228][INFO ][o.e.c.m.MetadataCreateIndexService] [MHKANG] [iis-2011] creating index, cause [auto(bulk api)], templates [], shards [1]/[1]
[2020-11-08T12:59:51,346][INFO ][o.e.c.m.MetadataMappingService] [MHKANG] [iis-2011/IpdvLVZoSv677yCdvh_xCg] create_mapping [_doc]

인덱스명에 시간 정보를 추가하려면 너무나 당연하게도 시간 정보를 제공해주는 @timestamp가 있어야 한다. 그런데 어제까지 @timestamp를 내 손으로 지워놓고는 인덱스명에 시간 정보가 추가되지 않는 현상이 버그인줄 알았다(..) 

댓글 없음:

댓글 쓰기

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