2022년 12월 25일 일요일

Logstash 필터 csv

강의 때 텍스트, DB, EVT 등의 예제 분석 과정이 끝나면 다른 형식의 예제는 안 궁금한지 꼭 물어본다. 이때 가장 많이 궁금해하는 형식이 쉼표로 필드를 구분하는 CSV.

일단 CSV는 키바나의 파일 업로드 기능을 이용해서 간단하게 연동할 수 있다. 그런데 용량이 100MB를 넘어가면 해당 기능을 사용할 수 없음.
val1,1000,val2
val3,10000,val4

이때 가장 간단한 해결 방법은 로그스태시의 dissect 필터.
filter {
 mutate {
  remove_field => ["host", "path", "@version", "@timestamp"]
 }

 dissect {
  mapping => {"message" => "%{field1},%{field2},%{field3}"}
  remove_field => "message"
 }
}
[2022-12-25T12:22:31,625][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
    "field3" => "val4\r",
    "field2" => "10000",
    "field1" => "val3"
}
{
    "field3" => "val2\r",
    "field2" => "1000",
    "field1" => "val1"
}

그런데 필드값에 쉼표가 포함되어 있으면 dissect는 필드 구분자인 쉼표와 값의 일부인 쉼표를 구분하지 못한다.
val1,1000,val2
val3,"10,000",val4
[2022-12-25T12:23:49,584][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
    "field3" => "000\",val4\r",
    "field2" => "\"10",
    "field1" => "val3"
}
{
    "field3" => "val2\r",
    "field2" => "1000",
    "field1" => "val1"
}

CSV 구조를 이해하는 CSV 필터

CSV 필터는 필드 구분자인 쉼표와 값으로 사용된 쉼표를 알아서 구분한다.
filter {
 mutate {
  remove_field => ["host", "path", "@version", "@timestamp"]
 }

 csv {
  columns => ["field1", "field2", "field3"]
  remove_field => "message"
 }
}
[2022-12-25T12:25:04,581][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
    "field3" => "val2",
    "field2" => "1000",
    "field1" => "val1"
}
{
    "field3" => "val4",
    "field2" => "10,000",
    "field1" => "val3"
}

댓글 없음:

댓글 쓰기

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