Fluentd 및 BigQuery를 사용한 실시간 로그 분석

이 가이드에서는 실시간으로 브라우저 트래픽을 로깅하고 분석하는 방법을 보여줍니다. 이는 다양한 소스에서 많은 양의 로그를 기록하고 문제를 디버깅하거나 로그에서 최신 통계를 생성하려는 경우에 유용합니다.

이 가이드에서는 NGNIX 웹 서버에서 생성한 로그 정보를 Fluentd를 사용하여 BigQuery로 전송한 다음 BigQuery를 사용하여 로그 정보를 분석하는 방법을 설명합니다. 여기서는 사용자가 Google Cloud, Linux 명령줄, 애플리케이션 로그 수집, 로그 분석의 기본 사항을 숙지하고 있다고 가정합니다.

소개

로그는 대규모 시스템과 애플리케이션의 성능을 보여주는 강력한 도구입니다. 그러나 이러한 시스템이 확장되고 복잡해지면서 수많은 컴퓨팅 리소스에 분산되어 있는 여러 로그를 관리하기가 쉽지 않게 되었습니다.

Fluentd는 인기 오픈소스 로그 수집기로 많은 데이터 소스와 시스템에서 수집된 로그를 하나의 로깅 레이어로 통합시키는 데 목적을 두고 있습니다. 어떤 데이터를 분석해야 유용할지를 미리 파악하기란 쉽지 않으므로 모든 데이터를 로깅하고 나중에 정렬하는 것이 일반적인 방법입니다. 하지만 이러한 모든 데이터를 수집하여 저장하게 되면 관리가 힘들어지고 원하는 데이터를 찾는 것이 어려워지거나 시간이 많이 소요되게 됩니다.

바로 여기서 로그 통계와 관련된 BigQuery의 강점이 유용성을 발휘합니다. BigQuery는 Google의 확장성이 뛰어난 완전 관리형 클라우드 데이터 웨어하우스 및 분석 엔진입니다. 테라바이트 용량의 로그에 대한 쿼리를 수십 초 안에 수행하여 시스템 문제를 해결하고 성능을 개선하는 데 필요한 답을 신속하게 얻습니다.

기본적으로 초당 100,000행의 로그 데이터를 BigQuery로 스트리밍할 수 있으며 추가 할당량을 요청하여 이 한도를 늘릴 수 있습니다.

Fluentd에는 수집된 로그를 저장할 대상으로 BigQuery를 사용할 수 있는 출력 플러그인이 있습니다. 이 플러그인을 사용하면 많은 서버에서 거의 실시간으로 BigQuery에 로그를 직접 로드할 수 있습니다. 그런 다음 Google 스프레드시트 또는 Google 데이터 스튜디오 내에 자주 업데이트되는 대시보드를 만들어 이 데이터를 쉽게 시각화할 수 있습니다.

목표

  • Compute Engine 인스턴스에서 NGINX 웹 서버를 실행합니다.
  • Fluentd 로그 수집 에이전트를 설치합니다.
  • 다음 작업을 수행하도록 Fluentd를 구성합니다.
    • NGINX 트래픽 로그 수집
    • BigQuery로 로그 전달
  • BigQuery 웹 UI를 사용하여 로그 메시지를 쿼리합니다.
  • BigQuery를 사용하여 로그 분석 쿼리를 실행합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Compute Engine
  • BigQuery

가격 계산기를 사용하면 예상 사용량을 토대로 예상 비용을 산출할 수 있습니다.

시작하기 전에

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Cloud Console의 프로젝트 선택기 페이지에서 Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

NGINX 웹 서버 VM 만들기

이 가이드에서는 Cloud Marketplace를 사용하여 NGINX 웹 서버를 실행하도록 미리 구성된 Compute Engine 인스턴스를 만듭니다.

  1. Cloud Console에서 Nginx(Google 클릭하여 배포) 이미지의 Marketplace 세부정보 페이지로 이동합니다.

    NGINX 세부정보 페이지로 이동

  2. 실행을 클릭합니다.

  3. 메시지가 표시되면 사용할 Google Cloud 프로젝트를 선택합니다.

  4. 필요한 API가 사용 설정될 때까지 기다립니다.

  5. 배포 이름을 nginx로 지정합니다.

  6. 미국 리전 또는 유럽 리전에 있는 영역을 선택합니다.

  7. 방화벽네트워킹 섹션에서 HTTP 트래픽 허용 옵션이 선택되어 있는지 확인합니다.

  8. 서비스 약관에 나열된 약관을 읽습니다.

  9. 조건에 동의하면 배포를 클릭합니다.

    배포 세부정보 화면에서 지정한 영역에서 생성 중인 새 VM과 설치 중인 NGINX 웹 서버가 표시됩니다.

  10. 배포가 완료될 때까지 기다린 후 계속 진행합니다.

권한 추가

BigQuery에 쓰려면 가상 머신에 추가 권한이 필요합니다. VM 권한을 수정하려면 먼저 VM을 종료해야 합니다.

  1. Cloud Console에서 Compute Engine VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

    nginx-vm이라는 새 VM 인스턴스가 표시됩니다.

  2. VM의 세부정보 페이지를 열려면 VM 이름을 클릭합니다.

  3. 페이지 상단의 중지 버튼을 클릭합니다.

    VM을 종료하는 데 몇 분 정도 걸립니다.

  4. 페이지 상단의 수정을 클릭합니다.

  5. 아래로 스크롤하여 BigQuery 액세스를 사용 설정됨으로 변경합니다.

  6. 페이지 하단의 저장을 클릭합니다.

  7. 새 권한으로 VM을 다시 시작하려면 페이지 상단의 시작을 클릭합니다.

아직 이 페이지를 닫지 마세요. 다음 섹션에서도 이 페이지에서 계속 작업합니다.

Fluentd 및 BigQuery 커넥터 설치

이 가이드의 이 섹션에서는 Fluentd 로그 수집기와 BigQuery용 Fluentd 출력 플러그인을 VM에 설치합니다.

  1. VM 인스턴스 세부정보 페이지에서 SSH 버튼을 클릭하여 인스턴스에 대한 연결을 엽니다.
  2. VM의 셸 창에서 다음과 같이 Debian 버전을 확인합니다.

    lsb_release -rdc
    

    VM에서 실행 중인 Debian 버전과 코드명이 결과에 표시됩니다.

    Description:    Debian GNU/Linux 9.6 (stretch)
    Release:        9.6
    Codename:       stretch
    
  3. Debian의 Fluentd 다운로드 페이지로 이동하여 Debian 코드명 버전의 설치 명령줄을 찾습니다.

    예를 들어 Debian Stretch의 경우 다음 명령어를 찾습니다.

    curl -L
       https://toolbelt.treasuredata.com/sh/install-debian-stretch-td-agent3.sh
       | sh
    
  4. VM의 셸 창에 명령어를 복사합니다.

    이 명령어는 VM에 td-agent 패키지를 설치합니다. 이 패키지에는 Fluentd 배포가 포함되어 있습니다.

  5. Fluentd-to-BigQuery 플러그인을 설치합니다.

    sudo /usr/sbin/td-agent-gem install fluent-plugin-bigquery
    

BigQuery 데이터 세트 및 테이블을 로그 대상으로 만들기

Fluentd는 입력 플러그인을 사용하여 다른 애플리케이션 및 서비스에서 생성한 로그를 수집합니다. 이 데이터를 구조화된 JSON 레코드로 파싱한 다음 구성된 모든 출력 플러그인으로 전달합니다.

Fluentd NGINX 액세스 로그 파서가 NGINX access.log 파일을 읽습니다. 다음 목록은 필드 및 예시 값이 있는 레코드의 예시를 보여줍니다.

time: 1362020400
record:
{
  "remote"              : "127.0.0.1",
  "host"                : "192.168.0.1",
  "user"                : "-",
  "method"              : "GET",
  "path"                : "/",
  "code"                : "200",
  "size"                : "777",
  "referer"             : "-",
  "agent"               : "Opera/12.0",
  "http_x_forwarded_for": "-"
}

BigQuery에서 로그 대상 테이블을 만들 때 열 이름은 로그 레코드의 필드 이름과 정확히 일치해야 합니다. 다음 절차에서 테이블 열 이름이 나중에도 정확하도록 제안된 이름을 사용해야 합니다.

  1. BigQuery 웹 UI를 엽니다.

    BigQuery 웹 UI로 이동

  2. 탐색 패널의 리소스에서 프로젝트 이름을 클릭합니다.

  3. 쿼리 편집기 아래의 세부정보 패널에서 데이터 세트 만들기를 클릭합니다.

  4. 데이터 세트 IDfluentd을 입력합니다.

  5. 데이터 위치에서 NGINX 인스턴스를 만든 멀티 리전 위치(미국 또는 유럽)를 선택합니다.

  6. 데이터세트 만들기를 클릭합니다.

  7. 탐색 패널의 리소스에서 fluentd 데이터세트를 클릭합니다.

  8. 쿼리 편집기 아래의 세부정보 패널에서 테이블 만들기를 클릭합니다.

  9. 테이블 이름으로 nginx_access를 입력합니다.

  10. 텍스트로 편집 옵션을 선택합니다.

  11. 다음 JSON 열 정의를 텍스트 상자에 복사합니다.

    [  { "type": "TIMESTAMP", "name": "time" },
       { "type": "STRING",    "name": "remote" },
       { "type": "STRING",    "name": "host" },
       { "type": "STRING",    "name": "user" },
       { "type": "STRING",    "name": "method" },
       { "type": "STRING",    "name": "path" },
       { "type": "STRING",    "name": "code" },
       { "type": "INTEGER",   "name": "size" },
       { "type": "STRING",    "name": "referer" },
       { "type": "STRING",    "name": "agent" },
       { "type": "STRING",    "name": "http_x_forwarded_for" } ]
    

    열 이름이 Fluentd 로그 레코드의 필드 이름과 정확하게 일치하는지 확인합니다. time 열 값은 로그 레코드 타임스탬프를 BigQuery 호환 타임스탬프 문자열로 변환하여 레코드에 추가됩니다.

  12. 파티션 나누기 목록에서 필드로 파티션 나누기: 시간을 선택합니다.

    파티션을 나눈 테이블은 큰 테이블을 더 작은 세그먼트로 나누어 쿼리 성능을 개선하고 쿼리에서 읽는 데이터의 양을 줄여 비용을 제어합니다. 자세한 내용은 BigQuery 문서의 파티션을 나눈 테이블 소개를 참조하세요.

  13. 하단에서 테이블 만들기를 클릭합니다.

    이제 fluentd.nginx_access라는 BigQuery 테이블을 사용하여 로그 레코드를 수신할 수 있습니다.

  14. 테이블 세부정보를 보려면 리소스 > 세부정보에서 테이블 이름을 클릭합니다.

    세부정보를 통해 행의 개수, 테이블이 사용하는 저장용량 등의 정보를 볼 수 있습니다.

로그 수집을 설정하고 BigQuery로 전달

Fluentd 구성 파일 /etc/td-agent/td-agent.conf는 로그 데이터가 수집되는 소스, 수집된 로그의 출력, 필터를 정의합니다. 수집된 로그에 태그를 적용하여 처리 방법과 전송할 출력 플러그인을 정의할 수도 있습니다.

다음 절차에서 다음 작업을 수행하도록 Fluentd를 구성합니다.

로그 수집 및 전달을 설정하려면 다음 안내를 따르세요.

  1. SSH를 사용하여 NGINX가 설치된 VM에 연결합니다.
  2. 셸 창에서 루트 사용자 권한으로 텍스트 편집기를 열고(예: Vim 또는 Nano 열기) Fluentd 에이전트 구성 파일 /etc/td-agent/td-agent.conf를 편집합니다. 예를 들어 다음 명령어를 사용하여 Vim에서 파일을 엽니다.

    sudo vim /etc/td-agent/td-agent.conf
    
  3. 파일 하단에서 다음 줄을 추가하여 NGINX 로그를 읽고, NGINX 파서로 파싱하고, nginx.access 태그를 지정하도록 tail 입력 플러그인을 구성합니다.

    <source>
      @type tail
      @id input_tail
      <parse>
        @type nginx
      </parse>
      path /var/log/nginx/access.log
      pos_file /var/log/td-agent/httpd-access.log.pos
      tag nginx.access
    </source>
    
  4. 다음 줄을 추가하여 BigQuery 출력 플러그인을 구성합니다. [MY_PROJECT_NAME]를 Google Cloud 프로젝트의 이름으로 바꿉니다.

    <match nginx.access>
      @type bigquery_insert
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_NAME]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    그러면 Fluentd가 다음 작업을 수행하도록 구성됩니다.

    • nginx.access 태그가 지정된 모든 로그 항목의 경우 Fluentd가 bigquery_insert 플러그인을 사용하여 레코드를 BigQuery 테이블에 기록해야 합니다.
    • VM의 서비스 계정을 사용하여 인증이 수행됩니다.
    • 원래 타임스탬프가 BigQuery에서 타임스탬프로 변환할 수 있는 형식의 문자열로 레코드에 추가됩니다.
  5. 파일을 저장하고 편집기를 종료합니다.

  6. 새 구성이 적용되도록 Fluentd 에이전트를 다시 시작합니다.

    sudo systemctl restart td-agent
    

대체 인증 방법을 비롯한 이러한 구성 파일 매개변수에 대한 자세한 내용은 BigQuery Fluentd 플러그인 사이트Fluentd 플러그인 문서를 참조하세요.

BigQuery에서 로그 보기

이제 Fluentd를 구성했으므로 NGINX 로그 데이터를 생성하고 BigQuery를 사용하여 확인할 수 있습니다.

  1. Cloud Console에서 Compute Engine VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. nginx-vm VM 인스턴스의 외부 IP 주소를 복사합니다.

  3. 별도의 브라우저 탭에서 주소 상자에 IP 주소를 붙여넣습니다.

    기본 nginx에 오신 것을 환영합니다 페이지가 표시됩니다.

  4. Cloud Console에서 BigQuery 페이지로 이동합니다.

  5. 쿼리 편집기 창에 다음 쿼리를 복사하고 실행을 클릭합니다.

    SELECT * FROM `fluentd.nginx_access`
    

    쿼리 결과 패널에 브라우저의 액세스 로그 레코드를 보여주는 행이 표시됩니다. 인터넷으로 VM에 액세스할 수 있으므로 다른 원격 호스트의 액세스 로그 행도 표시될 수 있습니다.

로드 시뮬레이션 및 로그에서 통계 계산

이 섹션에서는 샘플 로드를 실행한 다음 BigQuery를 사용하여 이러한 로드에 대한 측정항목을 봅니다. 이 단계를 수행하면 BigQuery를 사용하여 로그를 읽을 수 있을 뿐만 아니라 로그 분석도 실행할 수 있습니다.

  1. Cloud Console에서 Cloud Shell을 시작합니다.
  2. ApacheBench(ab) 웹 서버 벤치마킹 도구 및 관련 도구를 설치합니다.

     sudo apt install -y apache2-utils
    
  3. Cloud Shell에서 NGINX 서버에 대해 실행할 테스트 로드를 생성합니다. [IP_ADDRESS]는 VM의 IP 주소로 바꿉니다.

    ab -t 20 -c 1 http://[IP_ADDRESS]/
    

    이 명령어는 ApacheBench 도구를 사용하여 NGINX 서버에 대한 20초의 로드를 생성합니다.

  4. Cloud Console에서 BigQuery 페이지로 이동합니다.

    BigQuery 페이지로 이동

  5. 쿼리 편집기 창에서 다음 쿼리를 사용하여 ApacheBench 요청 목록을 가져옵니다.

    SELECT * FROM `fluentd.nginx_access` limit 100
    
  6. 다음 SQL 명령어를 실행하여 각 응답 코드의 초당 요청 수를 계산합니다.

    SELECT
      time_sec, code, COUNT(*) as count
    FROM (
      SELECT
        TIMESTAMP_TRUNC(time, SECOND)AS time_sec, code
      FROM
        `fluentd.nginx_access`)
    GROUP BY
      time_sec, code
    ORDER BY
      time_sec DESC
    

    초당 값은 이전에 보았던 ApacheBench 출력의 초당 요청 수 줄과 거의 같아야 합니다.

선택사항: 대용량 로깅을 위해 일괄 로드 사용

이 가이드에서 설명한 것처럼 BigQuery 스트리밍 삽입을 사용하면 데이터를 몇 초 내에 쿼리할 수 있습니다. 이 방법은 약간의 비용이 발생하며 삽입 크기와 빈도에 제한이 적용됩니다.

대용량 로깅 시에는 BigQuery 일괄 로드를 사용하는 것이 좋습니다. 이름에서 알 수 있듯이 이는 우선순위가 낮은 일괄 작업을 사용하여 데이터를 로드합니다. 일괄 로드를 사용하면 스트리밍 삽입을 사용할 때보다 데이터가 로드되고 사용 가능해지기까지 더 오래 걸립니다. 하지만 일괄 로드에는 요금이 청구되지 않습니다.

스트리밍 삽입과 마찬가지로 일괄 로드 작업 빈도에도 제한이 있습니다. 가장 중요한 것은 테이블당 일일 로드 작업은 1,000개, 프로젝트당 일일 로드 작업은 50,000개로 제한된다는 점입니다.

일괄 로드를 구현하려면 bigquery_load Fluentd 플러그인을 사용합니다. 이 플러그인은 Fluentd 버퍼를 사용하여 지정된 시간 또는 크기 한도까지 파일 로그 집합을 수집한 후 BigQuery로 일괄 전송합니다.

일괄 로드를 사용하려면 다음 작업을 수행합니다.

  1. Fluentd 구성 파일 /etc/td-agent/td-agent.conf를 루트 사용자로 편집합니다.
  2. 앞에서 지정한 BigQuery 출력 플러그인 구성을 다음 줄로 바꿉니다. [MY_PROJECT_NAME]를 Google Cloud 프로젝트의 이름으로 바꿉니다.

    <match nginx.access>
      @type bigquery_load
    
      <buffer>
        @type file
        path /var/log/bigquery_nginx_access.*.buffer
        flush_at_shutdown true
        timekey_use_utc
        total_limit_size 1g
        flush_interval 3600
      </buffer>
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_NAME]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    이 구성은 bigquery_insert 플러그인 대신 bigquery_load 출력 플러그인을 사용해야 함을 지정합니다.

    buffer 섹션은 최대 1GB의 로그가 수집되거나 최대 1시간이 경과할 때까지 로그 데이터가 VM에 버퍼링되도록 지정합니다. 그러면 버퍼링된 데이터가 BigQuery에 로드됩니다. 구성 매개변수에 대한 자세한 내용은 플러그인 문서를 참조하세요.

문제해결

어느 시점에 에이전트가 로그를 수집하거나 전달하지 않는 것으로 의심되는 경우 Fluentd VM의 셸 창에서 다음 명령어를 실행하여 상태를 확인할 수 있습니다.

sudo systemctl status td-agent

서비스의 활성 상태와 서비스의 마지막 로그 몇 줄이 출력에 표시됩니다.

Active: active (running) since [DATE]

에이전트가 시작되지 않는 경우 가장 유력한 원인은 Fluentd 구성 파일의 오류입니다. 이 오류는 Fluentd 로그 파일에 보고되며, 로그 파일은 VM 셸 창에서 다음 명령어를 사용하여 확인할 수 있습니다.

sudo less /var/log/td-agent/td-agent.log

예를 들어 다음 출력은 플러그인의 이름이 올바르지 않을 경우의 오류를 보여줍니다.

[info]: parsing config file is succeeded path="/etc/td-agent/td-agent.conf"
[error]: config error file="/etc/td-agent/td-agent.conf" error_class=Fluent::ConfigError error="Unknown output plugin 'bad_plugin'. Run 'gem search -rd fluent-plugin' to find plugins"

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하려면 다음의 방법을 따르세요.

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제 를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계