ELK 및 Rsyslog를 사용한 로그 수집

최근에 우리는 실행 중인 애플리케이션이 많은 6개의 기본 및 예비 서버에서 로그를 수집하는 문제에 직면했습니다. 모든 애플리케이션은 시간당 약 8,000개의 로그를 생성합니다. 또한 곧 ~120개의 Windows 시스템에서 로그를 수집해야 합니다. 현재 우리의 요구 사항을 충족하지 못하는 기성품 솔루션이 많이 있습니다. 결국 우리는 수집기 및 로그 저장소의 형태로 가장 간단하면서도 우아한 솔루션을 선택했습니다. ELK ( Elasticsearch , Logstash , Kibana ) 스택 및 발신자로서 — Rsyslog.



이제 하나씩 살펴보겠습니다.

문제와 해결책:



우리는 실행된 응용 프로그램이 많은 3개의 기본 서버와 3개의 예비 서버를 보유하고 있습니다. 모든 애플리케이션은 JSON 문자열 형식의 로그를 Syslog에 기록합니다. 가까운 장래에 우리는 많은 Windows 컴퓨터에서 로그를 수집해야 하지만 이것은 완전히 다른 이야기입니다.

회로도 솔루션은 다음과 같습니다.



보기 좋고 확장 가능합니다. 준비 및 구성으로 이동하겠습니다.

ELK 준비:



우리는 Docker을 사랑하기 때문에 그것을 사용할 것입니다! 편의상 docker-compose 을 사용하겠습니다.

Docker 작성 파일:

version: '3.2'

services:
  elasticsearch:
    image: 
docker.elastic.co/elasticsearch/elasticsearch:7.10.0
    volumes:
      - type: bind
        source: ./elasticsearch/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
    read_only: true
  - type: volume
    source: elasticsearch
    target: /usr/share/elasticsearch/data
environment:
  ES_JAVA_OPTS: "-Xmx512m -Xms512m"
  discovery.type: single-node
ports:
  - "9200:9200"
  - "9300:9300"
networks:
  - elk

  logstash:
    image: docker.elastic.co/logstash/logstash:7.10.0
    volumes:
  - type: bind
    source: ./logstash/config/logstash.yml
    target: /usr/share/logstash/config/logstash.yml
    read_only: true
  - type: bind
    source: ./logstash/pipeline
    target: /usr/share/logstash/pipeline
    read_only: true
ports:
  - "5000:5000/udp"
  - "9600:9600"
environment:
  LS_JAVA_OPTS: "-Xmx512m -Xms512m"
networks:
  - elk
depends_on:
  - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:7.10.0
volumes:
  - type: bind
    source: ./kibana/kibana.yml
    target: /usr/share/kibana/config/kibana.yml
    read_only: true
ports:
  - "5601:5601"
networks:
  - elk
depends_on:
  - elasticsearch

networks:
  elk:
    driver: bridge

volumes:
  elasticsearch:

지금은 하나의 노드로 충분하기 때문에 스케일링을 사용하지 않습니다. 그러나 앞으로는 스케일링에 대해 생각해야 할 것입니다.

Elasticsearch 구성:

cluster.name: "docker-cluster"
network.host: 0.0.0.0

# X-Pack settings
xpack.license.self_generated.type: basic
xpack.security.enabled: true
xpack.monitoring.collection.enabled: true

Kibana 구성:

server.name: kibana
server.host: "0"

# X-Pack settings
xpack.monitoring.ui.container.elasticsearch.enabled: true

# Elasticsearch settings
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.username: elastic
elasticsearch.password: strongpassword

Logstash 구성:

http.host: "0.0.0.0"

# X-Pack settings
xpack.monitoring.elasticsearch.hosts: [ 
"http://elasticsearch:9200" ]
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: strongpassword

Logstash 파이프라인 구성:

input {
udp {
    port => 5000
    codec => "json"
    type => "rsyslog"
}
}

filter {
json {
    source => "message"
    skip_on_invalid_json => true
}
}

output {
elasticsearch {
    index => "syslogs-%{+YYYY.MM}"
    hosts => "elasticsearch:9200"
    user => "elasticuser"
    password => "strongpassword"
}
}

결국 스택을 실행할 수 있습니다.

docker-compose up -d



결국 컨테이너가 시작되면 주소 127.0.0.1:5601로 이동할 수 있으며 모든 것이 올바르게 완료되면 Kibana 웹 인터페이스로 들어갑니다.

서버에서 Rsyslog를 준비합니다.



우선, 애플리케이션의 모든 로그가 Syslog 에 속하는지 확인해야 합니다.

/etc/rsyslog.d/로 이동하여 두 개의 파일을 만듭니다.
  • 파일 “01-json-template.conf”

  • 나가는 데이터에 대한 템플릿을 준비하겠습니다. 구조를 다루겠습니다. 첫 번째 값은 향후 필터링을 위한 타임스탬프입니다. 또한 애플리케이션의 메시지는 JSON 형식으로 변환됩니다. 다음 값은 sysloghost입니다. 이것은 서버 호스트 시스템의 이름입니다. 앞으로 다른 서버에서 로그를 분리해야 하기 때문에 필요합니다. 마지막 값은 프로그램 이름입니다. 로그를 작성한 애플리케이션의 이름입니다.

    template(name="json-template" type="list") {
    constant(value="{")
      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
      constant(value="\",\"message\":\"")     property(name="msg" format="json")
      constant(value="\",\"sysloghost\":\"")  property(name="hostname")
      constant(value="\",\"programname\":\"") property(name="programname")
    constant(value="\"}\n")
    }
    
  • 파일 "60-output.conf"
  • if $programname == [“app1”,”app2”,”app3”] then @elk-server-api:5000;json-template

    Array matching working only in rsyslog ≥ 7.2



    키바나로 이동



    먼저 Kibana를 구성하려면 관리/인덱스 패턴으로 이동하여 패턴syslogs-*을 생성합니다. 그런 다음 Kibana는 모든 로그 인덱스를 찾습니다.

    Kibana 검색 페이지에서 Kibana Query Language(KQL)을 사용하여 로그를 선택하고 필터링할 수 있습니다. 예:
  • "Server2"에서만 로그 가져오기:

  • sysloghost : “Server1”


  • "Server1"에서 "App2"로그 가져오기

  • sysloghost : “Server1” and programname : “App2”


  • level로 필터링:

  • sysloghost : “Server1” and programname : “App2” and level : “info”



    추신 Index Lifecycle Policies (ILM)을 구성하는 것을 잊지 마십시오.

    Index Lifecycle Policies의 예:





    그게 다야. 보다 편리한 로그 모니터링을 위해 심플Kibana Dashboard로 설정하였습니다. 다음과 같습니다.



    결론



    다른 서버 및 서비스에서 로그를 수집하기 위해 rsyslogELK 과 함께 간단한 솔루션을 사용할 수 있습니다. 그 결과 필요한 로그를 모니터링하고 찾을 수 있는 빠르고 유연하며 확장 가능한 시스템을 얻게 되었습니다.



    이전에 게시됨maddevs.io.

    좋은 웹페이지 즐겨찾기