탄력적 스택으로 로깅

이 콘텐츠는 Azure용 클라우드 네이티브 .NET 애플리케이션 설계 eBook 에서 발췌한 것으로, .NET 문서에서 제공되거나 오프라인 상태에서도 읽을 수 있는 PDF(무료 다운로드 가능)로 제공됩니다.

Cloud Native .NET apps for Azure eBook cover thumbnail.

좋은 중앙 집중식 로깅 도구가 많이 있으며 무료 오픈 소스 도구에서 더 비싼 옵션에 이르기까지 비용이 다양합니다. 대부분의 경우 무료 도구도 유료 제품만큼 좋거나 더 낫습니다. 이러한 도구 중 하나는 Elasticsearch, Logstash 및 Kibana라는 세 가지 오픈 소스 구성 요소의 조합입니다.

이러한 도구를 총칭하여 Elastic Stack 또는 ELK 스택이라고 합니다.

Elastic Stack

Elastic Stack은 Kubernetes 클러스터에서 정보를 수집하기 위한 강력한 옵션입니다. Kubernetes는 Elasticsearch 엔드포인트로의 로그 전송을 지원하며 대부분 그림 7-5와 같이 환경 변수를 설정하기만 하면 됩니다.

KUBE_LOGGING_DESTINATION=elasticsearch
KUBE_ENABLE_NODE_LOGGING=true

그림 7-5. Kubernetes용 구성 변수

이 단계에서는 클러스터에 Elasticsearch를 설치하고 모든 클러스터 로그를 클러스터로 보내는 대상을 지정합니다.

An example of a Kibana dashboard showing the results of a query against logs ingested from Kubernetes그림 7-6. Kubernetes에서 수집된 로그에 대한 쿼리 결과를 보여 주는 Kibana 대시보드의 예

Elastic Stack의 장점은 무엇인가요?

Elastic Stack은 저비용의 확장 가능하고 클라우드 친화적인 방식으로 중앙 집중식 로깅을 제공합니다. 사용자 인터페이스는 데이터 분석을 간소화하므로 투박한 인터페이스로 고생하는 대신 데이터에서 인사이트를 얻는 데 시간을 할애할 수 있습니다. 다양한 입력을 지원하므로 분산 애플리케이션이 더 다양한 종류의 서비스에 걸쳐 있으므로 계속해서 로그 및 메트릭 데이터를 시스템에 공급할 수 있을 것으로 기대할 수 있습니다. Elastic Stack은 대규모 데이터 집합에서도 빠른 검색을 지원하므로 대규모 애플리케이션에서도 자세한 데이터를 기록할 수 있으며 뛰어난 성능으로 데이터를 볼 수 있습니다.

Logstash

첫 번째 구성 요소는 Logstash입니다. 이 도구는 다양한 원본에서 로그 정보를 수집하는 데 사용됩니다. 예를 들어 Logstash는 디스크에서 로그를 읽고 Serilog와 같은 로깅 라이브러리에서 메시지를 수신할 수도 있습니다. Logstash는 로그가 도착하면 몇 가지 기본 필터링 및 확장을 수행할 수 있습니다. 예를 들어 로그에 IP 주소가 포함된 경우 Logstash는 지리적 조회를 수행하고 해당 메시지에 대한 국가/지역 또는 도시를 가져오도록 구성할 수 있습니다.

Serilog는 매개 변수화된 로깅을 허용하는 .NET 언어용 로깅 라이브러리입니다. 필드를 포함하는 텍스트 로그 메시지를 생성하는 대신 매개 변수가 별도로 유지됩니다. 이 라이브러리를 사용하면 보다 지능적인 필터링 및 검색이 가능합니다. Logstash에 쓰기 위한 샘플 Serilog 구성이 그림 7-7에 나와 있습니다.

var log = new LoggerConfiguration()
         .WriteTo.Http("http://localhost:8080")
         .CreateLogger();

그림 7-7. HTTP를 통해 logstash에 직접 로그 정보를 쓰기 위한 Serilog 구성

Logstash는 그림 7-8에 표시된 것과 같은 구성을 사용합니다.

input {
    http {
        #default host 0.0.0.0:8080
        codec => json
    }
}

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
        index=>"sales-%{+xxxx.ww}"
    }
}

그림 7-8. Serilog에서 로그를 사용하기 위한 Logstash 구성

광범위한 로그 조작이 필요하지 않은 시나리오의 경우 Logstash 대신 Beats라고 하는 대안이 있습니다. Beats는 로그에서 네트워크 데이터 및 가동 시간 정보에 이르기까지 다양한 데이터를 수집할 수 있는 도구 제품군입니다. 많은 애플리케이션에서 Logstash와 Beats를 모두 사용합니다.

Logstash에서 로그를 수집한 후에는 이를 저장할 위치가 필요합니다. Logstash는 다양한 출력을 지원하지만 더 흥미로운 출력 중 하나는 Elasticsearch입니다.

Elasticsearch

Elasticsearch는 로그가 도착하면 인덱싱할 수 있는 강력한 검색 엔진입니다. 로그에 대한 쿼리를 빠르게 실행할 수 있습니다. Elasticsearch는 엄청난 양의 로그를 처리할 수 있으며 극단적인 경우 여러 노드에서 스케일 아웃할 수 있습니다.

매개 변수를 포함하도록 제작되었거나 Logstash 처리를 통해 매개 변수가 분할된 로그 메시지는 Elasticsearch가 이 정보를 보존하므로 직접 쿼리할 수 있습니다.

jill@example.com에서 방문한 상위 10개 페이지를 검색하는 쿼리가 그림 7-9에 나와 있습니다.

"query": {
    "match": {
      "user": "jill@example.com"
    }
  },
  "aggregations": {
    "top_10_pages": {
      "terms": {
        "field": "page",
        "size": 10
      }
    }
  }

그림 7-9. 사용자가 방문한 상위 10개 페이지를 찾기 위한 Elasticsearch 쿼리

Kibana 웹 대시보드로 정보 시각화

스택의 최종 구성 요소는 Kibana입니다. 이 도구는 웹 대시보드에서 대화형 시각화를 제공하는 데 사용됩니다. 대시보드는 기술이 없는 일반 사용자도 만들 수 있습니다. Elasticsearch 인덱스에 있는 대부분의 데이터는 Kibana 대시보드에 포함될 수 있습니다. 개별 사용자는 대시보드 요구 사항이 다를 수 있으며 Kibana는 사용자별 대시보드를 허용하여 이러한 사용자 지정을 가능하게 합니다.

Azure에 Elastic Stack 설치

Elastic Stack은 여러 가지 방법으로 Azure에 설치할 수 있습니다. 언제나처럼 가상 머신을 프로비저닝하고 여기에 직접 Elastic Stack을 설치할 수 있습니다. 이 옵션은 가장 높은 수준의 사용자 지정 기능을 제공하므로 일부 숙련된 사용자가 선호하는 옵션입니다. IaaS(서비스 제공 인프라)에 배포하면 상당한 관리 오버헤드가 발생하여 해당 경로를 선택하는 사람이 컴퓨터 보안 및 최신 패치 유지와 같은 IaaS(서비스 제공 인프라)와 관련된 모든 작업에 대한 소유권을 갖게 됩니다.

오버헤드가 적은 옵션은 Elastic Stack이 이미 구성된 많은 Docker 컨테이너 중 하나를 사용하는 것입니다. 이러한 컨테이너는 기존 Kubernetes 클러스터에 드롭하고 애플리케이션 코드와 함께 실행할 수 있습니다. sebp/elk 컨테이너는 잘 문서화되고 테스트된 Elastic Stack 컨테이너입니다.

또 다른 옵션은 최근 발표된 ELK-as-a-service 제품입니다.

참고 자료