2020년 8월 12일 수요일

Logstash의 escaped character

다음은 message 필드만 남기는 파이프라인 설정.
input {
 file {
  path => "d:/test.log"
  start_position => "beginning"
  sincedb_path => "nul"
 }
}

filter {
 mutate { remove_field => [ "@timestamp", "@version", "path", "host" ] }
}

output {
 stdout {}
}

결과는 이렇다. 데이터는 "로 구분된 ab와 cd.
[2020-08-11T15:14:15,740][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
    "message" => "ab\"cd\r"
}

다음은 "를 기준으로 message 필드를 두 개의 별도 필드로 쪼개는 설정. 필드 구분 표현식의 구분자 "와 필드를 구분하는 "의 충돌을 막기 위해 \(escaped character)를 사용했다.
filter {
 dissect {
  mapping => { "message" => "%{field1}\"%{field2}" }
  remove_field => [ "@timestamp", "@version", "path", "host" ] 
 }
}

그런데 안 됨. 2월까지 됐었는데? 사실 기억 안 남
{
          "tags" => [
        [0] "_dissectfailure"
    ],
      "@version" => "1",
          "path" => "d:/test.log",
       "message" => "ab\"cd\r",
    "@timestamp" => 2020-08-11T06:17:52.762Z,
          "host" => "MHKANG"
}

충돌을 막는 두 번째 방법은 필드 구분 표현식의 구분자 대신 '를 사용하는 것.
filter {
 dissect {
  mapping => { "message" => '%{field1}"%{field2}' }
  remove_field => [ "@timestamp", "@version", "path", "host", "message" ] 
 }
}

잘 된다.
[2020-08-11T15:24:39,984][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
     "field2" => "cd\r",
     "field1" => "ab"
}

죽어도 escaped character를 써야겠다면 로그스태시 설정을 바꾸면 된다. 기본 설정이 허용에서 금지로 바뀐 듯. 근데 기본 설정에서도 정규표현식은 잘 동작하는데(..) 정확히 무슨 용돈지 잘 모르겠다.

logstash.yml

관련 글

댓글 없음:

댓글 쓰기

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