序章

これで、本番アプリケーションのセットアップ用に集中ログを設定する準備が整いました。 一元化されたロギングは、サーバーのログを収集して視覚化するための優れた方法です。 一般に、複雑なログシステムを設定することは、確実なバックアップと監視を設定することほど重要ではありませんが、アプリケーションの傾向や問題を特定する場合に非常に役立ちます。

このチュートリアルでは、ELKスタック(Elasticsearch、Logstash、およびKibana)をセットアップし、関連するログをログサーバーに送信するようにアプリケーションを構成するサーバーを構成します。 また、ログを解析および構造化する Logstashフィルターをセットアップして、ログを簡単に検索およびフィルター処理し、Kibanaの視覚化で使用できるようにします。

前提条件

ドメイン名を介してログダッシュボードにアクセスする場合は、[X118X]loggingを指す「logging.example.com 」のように、ドメインの下に ARecordを作成します。 サーバーのパブリックIPアドレス。 または、パブリックIPアドレスを介して監視ダッシュボードにアクセスすることもできます。 HTTPSを使用するようにロギングWebサーバーを設定し、VPNの背後に配置してアクセスを制限することをお勧めします。

ロギングサーバーにELKをインストールする

次のチュートリアルに従って、 logging サーバーにELKをセットアップします: Ubuntu 14.04 にElasticsearch、Logstash、およびKibana4をインストールする方法。

名前解決にプライベートDNSを使用している場合は、[SSL証明書の生成]セクションオプション2に従ってください。

Logstash Forwarderのセットアップセクションに到達したら、停止します。

クライアントにLogstashForwarderを設定する

クライアントサーバー上にログシッパーであるLogstashForwarderをセットアップします。 ELKチュートリアルのLogstashForwarderのセットアップセクションに従って、db1、app1、app2、およびlb1を実行します。

終了すると、 logging サーバーのパブリックネットワークアドレスを介してKibanaにログインし、各サーバーのsyslogを表示できるようになります。

収集するログを特定する

正確なアプリケーションと設定に応じて、さまざまなログをELKスタックに収集できます。 この場合、次のログを収集します。

  • MySQLの低速クエリログ(db1)
  • Apacheアクセスおよびエラーログ(app1およびapp2)
  • HAProxyログ(lb1)

これらのログを選択したのは、トラブルシューティングや傾向の特定を試みるときに役立つ情報を提供できるためです。 サーバーには、収集したい他のログがある場合がありますが、これは開始に役立ちます。

MySQLログを設定する

MySQLの遅いクエリログは通常、次の場所にあります。 /var/log/mysql/mysql-slow. これは、「遅いクエリ」と見なされるのに十分な時間実行されるログで構成されているため、これらのクエリを特定すると、アプリケーションの最適化またはトラブルシューティングに役立ちます。

MySQLの低速クエリログを有効にする

遅いクエリログはデフォルトで有効になっていないので、これらのタイプのクエリをログに記録するようにMySQLを設定しましょう。

MySQL構成ファイルを開きます。

  1. sudo vi /etc/mysql/my.cnf

コメント付きの「log_slow_queries」行を見つけてコメントを外し、次のようにします。

/etc/mysql/my.cnf
log_slow_queries        = /var/log/mysql/mysql-slow.log

保存して終了。

変更を有効にするには、MySQLを再起動する必要があります。

  1. sudo service mysql restart

これで、MySQLは実行時間の長いクエリを構成で指定されたログファイルに記録します。

MySQLログファイルを出荷する

MySQLの低速クエリログをログサーバーに送信するようにLogstashForwarderを構成する必要があります。

データベースサーバーdb1で、LogstashForwarder構成ファイルを開きます。

  1. sudo vi /etc/logstash-forwarder.conf

既存のエントリの下の「ファイル」セクションに以下を追加して、MySQLの低速クエリログを「mysql-slow」タイプとしてLogstashサーバーに送信します。

logstash-forwarder.conf —MySQLの遅いクエリ
,
    {
      "paths": [
        "/var/log/mysql/mysql-slow.log"
       ],
      "fields": { "type": "mysql-slow" }
    }

保存して終了。 これにより、Logstash ForwarderがMySQLの低速クエリログを送信し、後でフィルタリングに使用される「mysql-slow」タイプのログをマークするように構成されます。

Logstash Forwarderを再起動して、ログの送信を開始します。

  1. sudo service logstash-forwarder restart

マルチライン入力コーデック

MySQLの低速クエリログは複数行形式です(つまり、 各エントリは複数行にまたがっています)。したがって、このタイプのログを処理できるようにするには、Logstashの複数行コーデックを有効にする必要があります。

ELKサーバーのloggingで、Lumberjack入力が定義されている構成ファイルを開きます。

  1. sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf

以内 lumberjack 定義を入力し、次の行を追加します。

    codec => multiline {
      pattern => "^# User@Host:"
      negate => true
      what => previous
    }

保存して終了。 これにより、Logstashは、指定されたパターンを含むログに遭遇したときに複数行のログプロセッサを使用するように構成されます(つまり、 「#User @Host :」で始まります)。

次に、MySQLログのLogstashフィルターを設定します。

MySQLログフィルター

ELKサーバーのloggingで、新しいファイルを開いて、MySQLログフィルターをLogstashに追加します。 名前を付けます 11-mysql.conf、したがって、Logstash入力構成の後に読み取られます( 01-lumberjack-input.conf ファイル):

  1. sudo vi /etc/logstash/conf.d/11-mysql.conf

次のフィルター定義を追加します。

11-mysql.conf
filter {
  # Capture user, optional host and optional ip fields
  # sample log file lines:
  if [type] == "mysql-slow" {
    grok {
      match => [ "message", "^# User@Host: %{USER:user}(?:\[[^\]]+\])?\s+@\s+%{HOST:host}?\s+\[%{IP:ip}?\]" ]
    }
    # Capture query time, lock time, rows returned and rows examined
    grok {
      match => [ "message", "^# Query_time: %{NUMBER:duration:float}\s+Lock_time: %{NUMBER:lock_wait:float} Rows_sent: %{NUMBER:results:int} \s*Rows_examined: %{NUMBER:scanned:int}"]
    }
    # Capture the time the query happened
    grok {
      match => [ "message", "^SET timestamp=%{NUMBER:timestamp};" ]
    }
    # Extract the time based on the time of the query and not the time the item got logged
    date {
      match => [ "timestamp", "UNIX" ]
    }
    # Drop the captured timestamp field since it has been moved to the time of the event
    mutate {
      remove_field => "timestamp"
    }
  }
}

保存して終了。 これにより、Logstashがフィルタリングするように構成されます mysql-slow で指定されたGrokパターンでログを入力します match ディレクティブ。 The apache-access タイプログは、デフォルトのApacheログメッセージ形式と一致するLogstash提供のGrokパターンによって解析されますが、 apache-error タイプログは、デフォルトのエラーログ形式に一致するように作成されたGrokフィルターによって解析されています。

これらのフィルターを機能させるために、Logstashを再起動しましょう。

  1. sudo service logstash restart

この時点で、構成エラーによってLogstashが失敗するため、Logstashが正しく実行されていることを確認する必要があります。

また、KibanaがフィルタリングされたApacheログを表示できることを確認する必要があります。

Apacheログ

Apacheのログは通常、次の場所にあります。 /var/log/apache2、「access.log」および「error.log」という名前。 これらのログを収集すると、Apacheが報告しているエラーメッセージに加えて、サーバーにアクセスしているユーザー、サーバーが要求しているもの、使用しているOSおよびWebブラウザーのIPアドレスを確認できます。

Apacheログファイルを出荷する

Apacheアクセスログとエラーログをログサーバーに送信するようにLogstashForwarderを構成する必要があります。

アプリケーションサーバーapp1およびapp2で、LogstashForwarder構成ファイルを開きます。

  1. sudo vi /etc/logstash-forwarder.conf

既存のエントリの下の「ファイル」セクションに以下を追加して、Apacheログを適切なタイプとしてLogstashサーバーに送信します。

logstash-forwarder.conf —Apacheアクセスおよびエラーログ
,
    {
      "paths": [
        "/var/log/apache2/access.log"
       ],
      "fields": { "type": "apache-access" }
    },
    {
      "paths": [
        "/var/log/apache2/error.log"
       ],
      "fields": { "type": "apache-error" }
    }

保存して終了。 これにより、Logstash ForwarderがApacheアクセスログとエラーログを送信し、ログのフィルタリングに使用されるそれぞれのタイプとしてマークするように構成されます。

Logstash Forwarderを再起動して、ログの送信を開始します。

sudo service logstash-forwarder restart

現在、HAProxyリバースプロキシはインターネットからアプリケーションサーバーにアクセスする唯一の方法であるため、すべてのApacheログにはHAProxyサーバーのプライベートIPアドレスと一致するクライアントソースIPアドレスが含まれます。 これを変更して、サイトにアクセスしている実際のユーザーのソースIPを表示するには、デフォルトのApacheログ形式を変更して X-Forwarded-For HAProxyが送信しているヘッダー。

Apache構成ファイル(apache2.conf)を開きます。

  1. sudo vi /etc/apache2/apache2.conf

次のような行を見つけます。

[Label apache2.conf — Original "combined" LogFormat]
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

%h %{X-Forwarded-For} i に置き換えると、次のようになります。

[Label apache2.conf — Updated "combined" LogFormat]
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

保存して終了。 これにより、HAProxyサーバーのプライベートIPアドレスではなく、実際のユーザーの送信元IPアドレスが含まれるようにApacheアクセスログが構成されます。

Apacheを再起動して、ログの変更を有効にします。

  1. sudo service apache2 restart

これで、ApacheログフィルターをLogstashに追加する準備が整いました。

Apacheログフィルター

ELKサーバーのloggingで、新しいファイルを開いて、ApacheログフィルターをLogstashに追加します。 名前を付けます 12-apache.conf、したがって、Logstash入力構成の後に読み取られます( 01-lumberjack-input.conf ファイル):

  1. sudo vi /etc/logstash/conf.d/12-apache.conf

次のフィルター定義を追加します。

12-apache.conf
filter {
  if [type] == "apache-access" {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
  }
}
filter {
  if [type] == "apache-error" {
    grok {
      match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{DATA:severity}\] \[pid %{NUMBER:pid}\] \[client %{IPORHOST:clientip}:%{POSINT:clientport}] %{GREEDYDATA:error_message}" }
    }
  }
}

保存して終了。 これにより、Logstashがフィルタリングするように構成されます apache-accessapache-error それぞれで指定されたGrokパターンでログを入力します match ディレクティブ。 The apache-access タイプログは、デフォルトのApacheログメッセージ形式と一致するLogstash提供のGrokパターンによって解析されますが、 apache-error タイプログは、デフォルトのエラーログ形式に一致するように作成されたGrokフィルターによって解析されています。

これらのフィルターを機能させるために、Logstashを再起動しましょう。

  1. sudo service logstash restart

この時点で、構成エラーによってLogstashが失敗するため、Logstashが正しく実行されていることを確認する必要があります。 また、KibanaがフィルタリングされたApacheログを表示できることを確認する必要があります。

HAProxyログ

HAProxyのログは通常次の場所にあります /var/log/haproxy.log. これらのログを収集すると、ロードバランサーにアクセスしているユーザーのIPアドレス、ユーザーがリクエストしているもの、リクエストを処理しているアプリケーションサーバー、および接続に関するその他のさまざまな詳細を確認できます。

HAProxyログファイルを出荷する

HAProxyログを送信するようにLogstashForwarderを構成する必要があります。

HAProxyサーバーlb1で、LogstashForwarder構成ファイルを開きます。

sudo vi /etc/logstash-forwarder.conf

既存のエントリの下の「ファイル」セクションに以下を追加して、HAProxyログをタイプ「haproxy-log」としてLogstashサーバーに送信します。

logstash-forwarder.conf —HAProxyログ
,
    {
      "paths": [
        "/var/log/haproxy.log"
       ],
      "fields": { "type": "haproxy-log" }
    }

保存して終了。 これにより、Logstash ForwarderがHAProxyログを送信し、それらを次のようにマークするように構成されます。 haproxy-log、ログのフィルタリングに使用されます。

Logstash Forwarderを再起動して、ログの送信を開始します。

sudo service logstash-forwarder restart

HAProxyログフィルター

ELKサーバーのloggingで、新しいファイルを開いて、HAProxyログフィルターをLogstashに追加します。 名前を付けます 13-haproxy.conf、したがって、Logstash入力構成の後に読み取られます( 01-lumberjack-input.conf ファイル):

sudo vi /etc/logstash/conf.d/13-haproxy.conf

次のフィルター定義を追加します。

filter {
  if [type] == "haproxy-log" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{SYSLOGPROG}: %{IPORHOST:clientip}:%{POSINT:clientport} \[%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}:%{TIME}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} "(%{WORD:http_verb} %{URIPATHPARAM:http_request} HTTP/%{NUMBER:http_version})|<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://))" }
    }
  }
}

保存して終了。 これにより、Logstashがフィルタリングするように構成されます haproxy-log それぞれで指定されたGrokパターンでログを入力します match 指令。 The haproxy-log タイプログは、デフォルトのHAProxyログメッセージ形式と一致するLogstash提供のGrokパターンによって解析されています。

これらのフィルターを機能させるために、Logstashを再起動しましょう。

  1. sudo service logstash restart

この時点で、構成エラーによってLogstashが失敗するため、Logstashが正しく実行されていることを確認する必要があります。

Kibanaビジュアライゼーションを設定する

中央の場所でログを収集しているので、Kibanaを使用してログを視覚化することができます。 このチュートリアルは、それを始めるのに役立ちます:Kibanaダッシュボードとビジュアライゼーションの使用方法

Kibanaにある程度慣れたら、このチュートリアルを試して、ユーザーを興味深い方法で視覚化してください。GeoIPとELKを使用してユーザーの場所をマッピングする方法

結論

おめでとう! これで、本番Webアプリケーションのセットアップチュートリアルシリーズが完了しました。 すべてのチュートリアルに従った場合は、概要チュートリアルで説明したようなセットアップ(プライベートDNSとリモートバックアップを使用)が必要です。

つまり、バックアップ、監視、および集中ログコンポーネントによってサポートされる、分離されたコンポーネントを備えた動作中のアプリケーションが必要です。 必ずアプリケーションをテストし、すべてのコンポーネントが期待どおりに機能することを確認してください。