Log/fluentd

04. Fluentd filter plugins

우라릭 2022. 10. 8. 23:09

본 글은 https://docs.fluentd.org/을 번역/요약/정리/사견 추가한 글입니다.

 

1. 도입

Fluentd는 9가지 종류의 플러그인이 있습니다. 그 중 filter 플러그인에 대해 살펴보겠습니다. Filter plugin은 이벤트 스트림을 바꿀 수 있게 해줍니다. 예를 들어,

  1. 하나 이상의 필드를 이용해 이벤트를 필터링하기
  2. 새로운 필드를 이벤트에 더해주기
  3. 개인 정보 보호와 규정을 위해 특정 필드를 지우거나 마스킹하기

등을 할 수 있습니다.

2. filter_record_transformer

filter_record_transformer는 이벤트 스트림을 변경시킬 수 있게 합니다. 만약 이벤트를 추가/삭제/수정하고 싶으면 이 필터를 먼저 써보세요.

<filter foo.bar>
  @type record_transformer
  <record>
    hostname "#{Socket.gethostname}"
    tag ${tag}
  </record>
</filter>

위와 같은 코드는 이벤트에 새로운 필드인 hostname, tag를 추가합니다.

3. filter_grep

filter_grep은 특정 값을 가지는 이벤트를 가져옵니다. 가져오지 못한 이벤트들은 filtered out 됩니다.

<filter foo.bar>
  @type grep

  <regexp>
    key message
    pattern /cool/
  </regexp>

  <regexp>
    key hostname
    pattern /^web\d+\.example\.com$/
  </regexp>

  <exclude>
    key message
    pattern /uncool/
  </exclude>
</filter>

<regexp>, <exclude> 등의 조건들은 기본적으로 AND 연산으로 계산됩니다. <or>로 OR 연산도 가능합니다.

4. filter_parser

filter_parser는 이벤트 record의 문자열 필드를 파싱하고 변환합니다.

<filter foo.bar>
  @type parser
  key_name log
  <parse>
    @type regexp
    expression /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)$/
    time_format %d/%b/%Y:%H:%M:%S %z
  </parse>
</filter>

예를 들어, 아래와 같은 요청이 오면

time: injected time (depends on your input)
record: {"log":"192.168.0.1 - - [05/Feb/2018:12:00:00 +0900] \"GET / HTTP/1.1\" 200 777"}

아래와 같이 변환됩니다.

time 05/Feb/2018:12:00:00 +0900
record: {"host":"192.168.0.1","user":"-","method":"GET","path":"/","code":"200","size":"777"}

5. filter_geoip

filter_geoip는 Maxmind GeoIP DB를 이용해 지리 정보를 추가시켜줍니다.

<filter access.apache>
  @type geoip

  # Specify one or more geoip lookup field which has ip address (default: host)
  geoip_lookup_keys  host

  # Specify optional geoip database (using bundled GeoLiteCity databse by default)
  # geoip_database    "/path/to/your/GeoIPCity.dat"
  # Specify optional geoip2 database (using bundled GeoLite2 database by default)
  # geoip2_database   "/path/to/your/GeoLite2-City.mmdb"
  # Specify backend library (geoip2_c, geoip, geoip2_compat)
  backend_library geoip2_c

  # Set adding field with placeholder (more than one settings are required.)
  <record>
    city            ${city.names.en["host"]}
    latitude        ${location.latitude["host"]}
    longitude       ${location.longitude["host"]}
    country         ${country.iso_code["host"]}
    country_name    ${country.names.en["host"]}
    postal_code     ${postal.code["host"]}
    region_code     ${subdivisions.0.iso_code["host"]}
    region_name     ${subdivisions.0.names.en["host"]}
  </record>

  # To avoid get stacktrace error with `[null, null]` array for elasticsearch.
  skip_adding_null_record  true
</filter>

6. filter_stdout

filter_stdout은 이벤트를 stdoutput으로 출력합니다. 디버깅 목적으로 적절합니다.

<filter pattern>
  @type stdout
</filter>

'Log > fluentd' 카테고리의 다른 글

06. Fluentd parser plugins  (0) 2022.10.09
05. Fluentd buffer plugins  (0) 2022.10.08
03. Fluentd output plugins  (0) 2022.10.08
02. Fluentd input plugins  (0) 2022.10.08
01. Fluentd란?  (1) 2022.10.08