Rails: Filebeat 및 유연한 스택이 있는 검색 로그

데이터에 민감한 응용 프로그램에서 디버깅은 가장 관건적이고 시간이 많이 걸린다. 특히 요청 데이터가 매우 높은 상황에서 디버깅과 관련될 때 모든 개발자의 마지막 수단은 응용 프로그램 로그이다. 대형 로그 파일에서 디버깅은 쉬운 일이 아니다.
본고에서, 나는 Filebeat을 사용하여 rails 로그를 검색할 수 있는 방법과 UI를 지원하는 로그 검색을 통해 디버깅을 신속하고 간단하게 하는 방법을 간략하게 소개할 것이다.등등, Filebeat는 단독 실체가 아닙니다. 이것은 탄력적인 창고에 속합니다. 이것은 경량급 로그 탁송인입니다. 자원을 비축하지 않습니다.
이 문장은 다음과 같은 내용을 포함할 것이다
  • 신축성 스태킹 소개
  • 파일 박자 구성 및 설정
  • 어플리케이션 로그 스크롤이 있는 사용자 정의 색인 템플릿
  • Lograge 설정은 로그를 JSON 형식으로 출력합니다.
  • 프레젠테이션 Rails 애플리케이션 refer this repository
  • 신축성 스태킹 소개


    Elastic stack은 Elasticsearch, Kibana, BeatsLogstash으로 구성되어 있으며 이전에는 ELK stack이라고 불렸는데 실시간 모니터링, 시각화, 검색과 분석 응용 프로그램 데이터에 사용되었고 Filebeat는 Beats family에 속하는 경량급 데이터 탁송인으로 주로 파일에서 데이터를 보내는 데 사용되었다.

    Filebeat 설정 및 구성


    장치
    filebeat의 설치는 매우 간단합니다.당신은 공식 documentation에서 기술한 간단한 절차에 따라 조작할 수 있습니다.
    서류 박자 견본.yml–/usr/local/etc/filebeat/filebeat.yml
    #---------- Filebeat inputs ----------
    filebeat.inputs:
    - type: log
      enabled: true
      json:
        message_key: message
        keys_under_root: true
        overwrite_keys: true
      paths:
        - /Users/pramod/projects/efk-rails/log/sync_development.log
    #ElasticSearch template setting 
    setup.ilm.enabled: false
    setup.template.enabled: false
    setup.template.name: "efk-rails-sync-dev"
    setup.template.pattern: "efk-rails-sync-dev-*"
    #---------- Kibana ----------
    setup.kibana:
      host: "0.0.0.0:5601"
    #---------- Elasticsearch output ----------
    output.elasticsearch:
      # Array of hosts to connect to.
      hosts: ["0.0.0.0:9200"]
      index: "sync-log-dev"
    
    위의 프로필에서 우리는 다음과 같은 옵션을 설정하였다
  • 입력 - filebeat의 입력을 지정하는 데 사용합니다. 여기에 rails 로그 파일/Users/pramod/projects/efk rails/log/sync development로 설정합니다.JSON 옵션이 있는 로그입니다. 이 옵션은 디코딩 구조를 JSON 메시지
  • 의 로그로 구성합니다.
  • 출력 - filebeat의 출력을 설정하는 데 사용되며, 여기에elasticsearch 인덱스를 쓸 것입니다.
  • 설치.kibana – kibana 대시보드
  • 의 kibana 끝점을 로드합니다.

    스크롤이 있는 사용자 정의 색인 템플릿


    물론 기본 templaterollover 옵션을 사용할 수 있지만 사용자 정의 색인 템플릿 이름을 사용할 수 없습니다. 만약에 키바나와elasticsearch 실례에 환경 스마트 키바나 계기판을 설치하기를 원한다면 이것은 특히 필요합니다. 이것은 대부분의 Rails 응용 프로그램에서 필요한 것입니다.
    여기에서, 우리는 맞춤형 템플릿과 인덱스 생명주기 관리 (ilm) 를 사용하여 서로 다른 rails 환경에 따라 로그 인덱스를 회전시킬 것입니다.
    사용자 정의 색인 템플릿 이름과 rollover policy을 사용하려면 다음과 같은 절차를 따라야 한다
  • 에서ilm을false로 설정하고 다음 옵션을 사용하여 사용자 정의 템플릿 이름과 모드를 추가합니다
  • setup.ilm.enabled: false
    setup.template.enabled: false
    setup.template.name: "efk-rails-sync-dev"
    setup.template.pattern: "efk-rails-sync-dev-*"
    
    위의 설정은 filebeat에 efk rails sync dev와 efk rails sync dev-* 이름과 인덱스 모드를 각각 사용하도록 알려 줍니다. 일반적인 방법은 인덱스 이름을 사용하지 않고 인덱스 모드를 지정하는 것입니다.
  • Kibana dev tool을 사용하여 수명 주기 정책 수립
  • PUT _ilm/policy/sync-log
    {
      "policy": {
        "phases": {
          "hot": {
            "min_age": "0ms",
            "actions": {
              "rollover": {
                "max_age": "3d",
                "max_size": "100mb"
              }
            }
          },
          "delete": {
            "min_age": "2d",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
    
    색인 생명주기 정책을 만들 것입니다. 이 정책은 색인 크기가 100mb에 달하거나 색인 기한이 3일일 때 색인을 스크롤합니다.
  • Kibana dev tool을 사용하여 템플릿 패턴 작성
  • PUT _template/efk-rails-sync-dev
    {
      "index_patterns": ["efk-rails-sync-dev-*"], 
      "settings": {
        "number_of_shards": 1,
        "index.lifecycle.name": "sync-log", 
        "index.lifecycle.rollover_alias": "sync-log-dev"
      }
    }
    
    이것은 인덱스 별명이 efk-rails-sync-dev인 템플릿 sync-log-dev을 만들고 2단계에서 만든 라이프 사이클 정책 sync-log을 추가합니다.
  • 마지막 단계에서 스크롤 정책을 사용하여 관리하는 첫 번째 인덱스를 만들고 쓰기 인덱스로 지정합니다
  • PUT efk-rails-sync-dev-000001 
    {
      "aliases": {
        "sync-log-dev":{
          "is_write_index": true
        }
      }
    }
    
    이것은 초기 인덱스 efk-rails-sync-dev-000001을 만들고 filebeat는 이 인덱스를 사용하여 프로그램의 출력을 기록합니다.

    JSON 형식의 응용 프로그램 로그


    색인 생명주기 정책, 템플릿, 첫 번째 스크롤 색인을 만들면 filebeat Harvester에서 로그를 포착합니다.응용 프로그램 로그를 JSON 형식으로 출력해야 합니다.
    rails 로그를 JSON 형식으로 출력하려면 Gemfile에 추가하고 번들로 설치하면 애플리케이션에서 사용할 수 있는 logragegem을 사용합니다.
    데모 목적으로 단일 컨트롤러 작업만 JSON에 기록하고 Kibana를 통해 검색합니다.
    다음 lograge 구성은 SyncController# 인덱스와 SyncController# 생성 작업의 로그를 JSON 형식으로 출력합니다.
    $config/initializers/lograge.rb
    Rails.application.configure do
      config.lograge.enabled = true
      config.lograge.keep_original_rails_log = true
      config.lograge.base_controller_class = 'ActionController::API'
      config.lograge.logger = ActiveSupport::Logger.new "#{Rails.root}/log/sync_#{Rails.env}.log"
      config.lograge.formatter = Lograge::Formatters::Json.new
      config.lograge.ignore_custom = lambda do |event|
        # return true here if you want to ignore based on the event
        return false if event.payload[:controller].include?("SyncController") &&
         ['index', 'create'].include?(event.payload[:action])
        return true
      end
      config.lograge.custom_payload do |controller|
        if controller.class.name.include?('SyncController')
          SyncLogger.new(controller).log_data
        end
      end
    end
    
    SyncLogger 서비스는 레코더 파일에 메타데이터를 추가합니다.
    $app/services/sync_logger.rb
    class SyncLogger
      def initialize(controller)
        @controller = controller
      end
      def log_data
        request_type = @controller.request.method
        username = @controller.current_user.try(:username) || 'guest'
        r_data = request_type == 'GET' ? JSON.parse(@controller.response.body) : @controller.request.parameters
        log_data = {
          u_agent: @controller.request.user_agent,
          request_time: Time.now.to_s(:number),
          search_key: "#{request_type}_#{username}_#{Time.zone.now.to_s(:number)}",
          ip: @controller.request.ip,
          user_id: @controller.current_user.try(:id),
          username: username,
          data: r_data
        }
      end
    end
    
    상기 서비스는 다음 형식으로 SyncController#index와 SyncController#create action으로 JSON 출력을 만들 것입니다
    $log/sync 개발.저널
    {"method":"GET","path":"/sync","format":"*/*","controller":"SyncController","action":"index","status":200,"duration":16.64,"view":1.18,"db":0.2,"u_agent":"PostmanRuntime/7.26.1","request_time":"20200818210529","search_key":"GET_pramod_20200818153529","ip":"127.0.0.1","user_id":1,"username":"pramod","data":[{"username":"pramod"},{"username":"pramdo1"}]}
    {"method":"GET","path":"/sync","format":"*/*","controller":"SyncController","action":"index","status":200,"duration":15.82,"view":0.48,"db":0.93,"u_agent":"PostmanRuntime/7.26.1","request_time":"20200818210647","search_key":"GET_pramod_20200818153647","ip":"127.0.0.1","user_id":1,"username":"pramod","data":[{"username":"pramod"},{"username":"pramdo1"}]}
    
    Starting filebeat filebeat의 루트 디렉터리에서 다음 명령을 실행하여 이 로그를elasticsearch로 보냅니다. tar를 다운로드하고 추출하거나 filebeat를 서비스로 설치했다면 filebeat를 서비스로 시작할 수 있습니다.
    ./filebeat -e
    or 
    sudo service filebeat start
    
    successful에서 다음 filebeat 로그를 보셔야 합니다
    로그 출력
    INFO    registrar/registrar.go:152  States Loaded from registrar: 2
    2020-08-18T21:46:30.722+0530    INFO    crawler/crawler.go:72   Loading Inputs: 1
    2020-08-18T21:46:30.723+0530    INFO    log/input.go:152    Configured paths: [/Users/pramod/projects/efk-rails/log/sync_development.log]
    2020-08-18T21:46:30.723+0530    INFO    input/input.go:114  Starting input of type: log; ID: 15918551478222648142
    2020-08-18T21:46:30.723+0530    INFO    crawler/crawler.go:106  Loading and starting Inputs completed. Enabled inputs: 1
    

    기바나가 움직이고 있어요.


    위의 설정이 올바르면 Kibana 검색 로그를 통해 색인 모드를 만들 수 있습니다.키바나 인덱스 관리에서 efk-rails-sync-dev-000001 인덱스를 볼 수 있으며 같은 인덱스를 사용하면 검색에 사용할 인덱스 모드를 만들 수 있습니다.

    키바나 검색을 통해서.

    그래, 우리는 완성했어!상기 절차를 따르면 프로그램에서 비슷한 설정을 실행할 수 있어야 합니다.만약 어떤 의문이나 건의가 있으면, 평론 부분에서 저에게 알려 주십시오.

    좋은 웹페이지 즐겨찾기