Logstashを使って簡単にNgix Accessログを収集してElasticsearchに保存します。


  • まずJava環境をインストールします。apt-get install openjdk-8-jdk
  • 公式サイトでLogstashをダウンロードします。https://www.elastic.co/cn/downloads/logstash
  • confディレクトリに設定ファイルを新規作成します。
  • input {
        #            
        file {
            path => ["/usr/local/nginx/logs/error.log"]
            start_position => "beginning"
            type => "error"
        }
        file {
            path => ["/usr/local/nginx/logs/www.xxx.com.access.log"]
            start_position => "beginning"
            type => "access"
        }
    }
    filter {
        #           grok            
        if [type] == "access"{
            grok {
                match => {
                    #            
                    "message" => "^%{IPV4:remote_addr} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{INT:status} %{INT:body_bytes_sent} \"%{NOTSPACE:http_referer}\" %{NUMBER:request_time} \"%{IPV4:upstream_addr}:%{POSINT:upstream_port}\" %{NUMBER:upstream_response_time} \"%{DATA:http_user_agent}\" \"%{NOTSPACE:http_x_forwarded_for}\""
                }
            }
            #  GeoIP      ip
            geoip {
                source => "remote_addr"
            }   
        }
    }
    output {
        #             
        if "_grokparsefailure" not in [tags] {
            #     elasticsearch
            elasticsearch {
                hosts => ["127.0.0.1:9200"]
                index => "logstash-nginx-%{type}-%{+YYYY-MM}"
            }
        }
        #  
        stdout{codec => rubydebug}
    }
    
    NFinxAccessログフォーマット:
    log_format  main  '$remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" $request_time "$upstream_addr" $upstream_response_time "$http_user_agent" "$http_x_forwarded_for"';
    
    ログの例:
    69.126.145.85 [25/Jun/2018:07:31:27 +0000] "POST /api/userInfoRongCloud HTTP/1.1" 200 197 "-" 0.191 "18.191.5.101:9000" 0.191 "dating/1.0.5 (iPhone; iOS 12.0; Scale/3.00)" "-"
    
    このステップのgrok文法は自分でデバッグする必要があります。オンラインデバッグアドレス:
    https://grokdebug.herokuapp.com/
    
    ここでは多くの書き上げられたパターン変数が使用できます。参照してください。
    https://github.com/elastic/logstash/blob/1.4/patterns/grok-patterns
    
  • -fパラメータでプロファイルを指定し、解析結果が正しいかどうか
  • をテストします。
  • 保護プロセスに追加して実行します。(正式な環境は設定ファイルの中のデバッグ出力を削除してください。そうでないとエラーが発生します。):
  • [program:logstash-worker]
    process_name=%(program_name)s_%(process_num)02d
    command=/usr/local/logstash-6.3.0/bin/logstash -f /usr/local/logstash-6.3.0/config/nginx-access.conf
    autostart=true
    autorestart=true
    user=root
    numprocs=1
    redirect_stderr=true
    stdout_logfile=/var/log/logstash-worker.log
    
    supervisorctl reread
    supervisorctl update