강의 때 텍스트, DB, EVT 등의 예제 분석 과정이 끝나면 다른 형식의 예제는 안 궁금한지 꼭 물어본다. 이때 가장 많이 궁금해하는 형식이 쉼표로 필드를 구분하는 CSV.
일단 CSV는 키바나의 파일 업로드 기능을 이용해서 간단하게 연동할 수 있다. 그런데 용량이 100MB를 넘어가면 해당 기능을 사용할 수 없음.
val1,1000,val2val3,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,val2val3,"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"}
댓글 없음:
댓글 쓰기