[Elasticsearch] Collecting RSS information with Logstash

RSS feed는 웹사이트의 최신 콘텐츠를 효율적으로 수집하고 분석할 수 있는 강력한 도구입니다. Logstash를 사용하면 RSS 데이터를 쉽게 수집하고 처리할 수 있습니다. 이 글에서는 Google News RSS를 Logstash로 수집하는 방법을 예제로 설명하겠습니다.

Logstash config

Logstash의 설정 파일은 input, filter, output 세 가지 섹션으로 구성됩니다. 아래는 Google News의 RSS 피드를 수집하기 위한 예제 설정입니다.

Input

http_poller 플러그인을 사용해 RSS 피드를 주기적으로 요청합니다.

input {
  http_poller {
    urls => {
      google_news => {
        url => "https://news.google.com/rss"
        method => get
      }
    }
    request_timeout => 60
    schedule => { every => "10m" }
    codec => "plain"
    metadata_target => "http_metadata"
  }
}

urls: 수집할 RSS 피드 URL을 지정합니다.
schedule: 데이터를 가져올 주기를 설정합니다. every => “5m”은 5분마다 데이터를 요청합니다. cron 표현식을 사용하여 보다 세부적인 설정이 가능합니다
metadata_target: 요청 메타데이터를 저장할 필드를 지정합니다.

Fiter

수집된 RSS 데이터를 구조화된 형태로 변환합니다.

filter {
  xml {
    source => "message"
    target => "rss"
    store_xml => true
    force_array => false
  }
  split {
    field => "[rss][channel][item]"
  }
  mutate {
    add_field => {
      "title" => "%{[rss][channel][item][title]}"
      "link" => "%{[rss][channel][item][link]}"
      "source" => "%{[rss][channel][item][source][content]}"
      "pubDate" => "%{[rss][channel][item][pubDate]}"
      "type" => "%{[http_metadata][input][http_poller][request][name]}"
    }
    remove_field => ["message", "rss", "event", "http_metadata"]
  }
}

xml: RSS 데이터를 XML 형태에서 파싱하여 rss 필드에 저장합니다.
split: 각 기사(item)를 개별 이벤트로 분리합니다.
mutate: 원하는 필드(title, link, source, pubDate)를 추가하고 불필요한 데이터를 제거합니다.

Output

결과 데이터를 Elasticsearch에 저장하거 콘솔에 출력합니다.

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "rss-data-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }  
}

이 예제를 사용하면 Logstash를 활용하면 RSS 데이터를 효율적으로 수집하고 처리할 수 있습니다.