fluentdによるログ収集システムの構築~基本編

fluentdによるログ収集システムの構築~基本編

はじめに

 大規模サービスのサーバ群を管理している人たちにとって、クラウド化や仮想化によってハードウェア障害等の物理的な問題からは解放されました。サービス提供者にとってハードウェアの問題をソフトウェアで解決出来る点、物理マシンのことを考えなくて良い点は自分たちの仕事の種類を大きく減らし、サービスに専念する良い環境を提供してくれました。

でも、ハードウェアが自分たちの手を離れても、サービスを提供するソフトウェアやミドルウェアの管理すべきログが多様化していることに変わりはありません。今回はこのログ管理の仕組みを少しでも効率よくするためのシステムである、fluentdによるログ収集システムの構築を紹介します。

以前の記事では、Swatchを用いたリアルタイムログ監視システムの構築方法を解説しました。Swatchでは検出したログをメールなどを利用してアラートを送信できますが、検出したログを一箇所に集約するためには、少し工夫が必要になります。そこで今回は、fluentdによるログ収集システムの構築方法を基本編、応用編の二回に分けて解説します。

基本編では、ログ収集サーバーの設定とクライアントの設定を解説し、応用編では、収集したログをデータベースに集積する方法を解説します。

fluentdのアーキテクチャ

fluentdのアーキテクチャ

前提条件

構築に必要なサーバー要件および、パッケージは下記のとおりです。

  1. サーバー要件サーバー要件は、次のとおりです。
    サーバー fluentdサーバー fluentdクライアント
    ホスト名 fluentd-server fluentd-client
    IPアドレス 192.168.0.50(eth1) 192.168.0.20(eth1)
    OS CentOS 5.5 i386
    インストールタイプ minimal
    HDD 8GB(SCSI)
    RAM 512MB
    Apache 2.2.15
    OpenJDK 1.7.0 n/a
  2. ダウンロードまたは、インストールするパッケージダウンロードまたは、インストールするパッケージは、次のとおりです。
    パッケージ fluentdサーバー fluentdクライアント
    td-agent 1.1.18
    mongo-10gen-server 2.4.9 n/a
    mongo-10gen 2.4.9 n/a
    mViewer 0.9.1 n/a

サーバーのセットアップ

    1. fluentdのインストール公式ドキュメントのとおり、インストーラーを実行してインストールします。
      $ curl -s http://toolbelt.treasuredata.com/sh/install-redhat.sh | sudo bash

      実行すると、TresureDataのリポジトリ(/etc/yum.repo.d/td.repo)が作成され、RPMパッケージがインストールされます。

      [vagrant@fluentd-server ~]$ curl -s http://toolbelt.treasuredata.com/sh/install-redhat.sh | sudo bash
      This script requires superuser access to install rpm packages.
      You will be prompted for your password by sudo.
      Loaded plugins: fastestmirror
      Loading mirror speeds from cached hostfile
      Including mirror: ftp.iij.ad.jp
      Including mirror: ftp.tsukuba.wide.ad.jp
      Including mirror: www.ftp.ne.jp
      Including mirror: ftp.jaist.ac.jp
      Including mirror: ftp.riken.jp
      Including mirror: mirror.fairway.ne.jp
      Including mirror: ftp.nara.wide.ad.jp
       * base: ftp.iij.ad.jp
      Including mirror: ftp.iij.ad.jp
      Including mirror: ftp.tsukuba.wide.ad.jp
      Including mirror: www.ftp.ne.jp
      Including mirror: ftp.jaist.ac.jp
      Including mirror: ftp.riken.jp
      Including mirror: mirror.fairway.ne.jp
      
      Configure td-agent to start, when booting up the OS...
        Verifying  : td-agent-1.1.18-0.i386                                       1/6
        Verifying  : compat-libtermcap-2.0.8-49.el6.i686                          2/6
        Verifying  : openssl098e-0.9.8e-17.el6.centos.2.i686                      3/6
        Verifying  : libxslt-1.1.26-2.el6_3.1.i686                                4/6
        Verifying  : compat-readline5-5.2-17.1.el6.i686                           5/6
        Verifying  : td-libyaml-0.1.4-1.i386                                      6/6
      
      Installed:
        td-agent.i386 0:1.1.18-0
      
      Dependency Installed:
        compat-libtermcap.i686 0:2.0.8-49.el6
        compat-readline5.i686 0:5.2-17.1.el6
        libxslt.i686 0:1.1.26-2.el6_3.1
        openssl098e.i686 0:0.9.8e-17.el6.centos.2
        td-libyaml.i386 0:0.1.4-1
      
      Complete!
    2. インストール確認
      $ td-agent --version

      4016-03

    3. サービス起動ユーザーの設定fluentdをインストールすると、サービス起動ユーザー名、グループ名が作成されますが、作成されたtd-agentユーザーは、rootユーザーが所有するログファイルには、アクセスできません。

      このため、サービス起動スクリプト/etc/init.d/td-agentでは、/etc/sysconfig/td-agentファイルを読み込むようになっているため、/etc/sysconfig/td-agentファイルを作成し、サービス起動ユーザーを変更します。

      これにより、サービスの起動ユーザーは、rootとなり全てのファイルにアクセスできるようになります。

      なお、今回は設定例として、/var/log/secureログにアクセスするため、rootユーザーでサービスを起動できるように変更していますが、td-agentユーザーがアクセス可能なログファイルのみを収集する場合は、本設定は必要ありません。

      $ sudo vi /etc/sysconfig/td-agent
      
      DAEMON_ARGS="--user root"
      TD_AGENT_ARGS="/usr/sbin/td-agent --user root --group td-agent --log /var/log/td-agent/td-agent.log"

      4016-04

    4. サービスの起動と自動起動設定
      $ sudo service td-agent start
      $ sudo chkconfig td-agent on

      4016-05

    5. ログ収集設定fluentdの設定は、source/match/includeの三種類のディレクティブから構成されており、設定は/etc/td-agent/td-agent.confファイルに記述します。

      ディレクティブの主な機能は、次のとおりです。

      ディレクティブ 機能
      source ログの収集方法を定義する。
      match 条件にマッチしたログの処理方法を定義する。
      include 他の設定ファイルを読み込む。

      各ディレクティブは、次の構文形式となっています。

      <source>
      type 入力プラグイン
      
      設定項目1 設定値1
      設定項目2 設定値2
         :         :
         :         :
      </source>

      条件には、「*」「**」といったワイルドカードや、{}で条件を括る事によって、OR条件を指定できます。

      <match 条件>
      type 入力プラグイン
      
      設定項目1 設定値1
      設定項目2 設定値2
         :         :
         :         :
      </match>

      ディレクティブや設定項目の詳細については、設定ファイルを参照して下さい。また、プラグインについては、入力プラグインおよび、出力プラグインを参照して下さい。

      ここでは、/var/log/secureログをtailプラグインで収集し、別ファイルに書き込む設定を行います。

      $ sudo vi /etc/td-agent/td-agent.conf
      
      # /var/log/secureを入力イベントとして定義
      <source>
        type tail
        path /var/log/secure                       # 入力ファイル名
        pos_file /var/log/td-agent/secure.pos      # 読み込み位置保存ファイル
        tag log_secure                             # イベントタグ
        format none                                # メッセージ形式(無し)
      </source>
      
      # マッチしたログをファイルに出力する
      <match **>
        type file                                  # ファイル出力
        path /var/log/td-agent/secure/secure.log   # 出力ファイル名
        time_slice_format %Y%m%d                   # 出力ファイル拡張子
        time_slice_wait 1m                         # 出力遅延時間
      </match>

      設定が終了したら、設定をリロードします。

      4016-06

      $ sudo service td-agent reload

      4016-07

      secureログを収集する設定となっていますので、サーバー上でsuコマンドやsudoコマンドを実行すると、secure.logにマッチしたログが書き込まれます。

      4016-08

    6. ログ受信設定fluentdが、各クライアントから入力イベントを受信する設定を行います。

      td-agent.confに、下記の内容を追記し、設定をリロードします。

      $ sudo vi /etc/td-agent/td-agent.conf
      
      # クライアントからのイベント受信設定
      <source>
        type forward                               # 転送
        port 24224                                 # サーバー待ち受けポート
      </source>

      4016-09

      $ sudo service td-agent reload

      4016-10

以上で、サーバーのセットアップは終了です。

クライアントのセットアップ

クライアントのセットアップは、サーバーセットアップの手順1~4までは同一ですので、ここでは割愛します。

    1. fluentdのインストール
      $ curl -s http://toolbelt.treasuredata.com/sh/install-redhat.sh | sudo bash
      
      [vagrant@fluentd-client ~]$ curl -s http://toolbelt.treasuredata.com/sh/install-redhat.sh | sudo bash
      This script requires superuser access to install rpm packages.
      You will be prompted for your password by sudo.
      Loaded plugins: fastestmirror
      Determining fastest mirrors
      Including mirror: ftp.tsukuba.wide.ad.jp
      Including mirror: www.ftp.ne.jp
      Including mirror: ftp.iij.ad.jp
      Including mirror: ftp.jaist.ac.jp
      Including mirror: ftp.nara.wide.ad.jp
       * base: ftp.tsukuba.wide.ad.jp
      Including mirror: ftp.tsukuba.wide.ad.jp
      Including mirror: www.ftp.ne.jp
      Including mirror: ftp.iij.ad.jp
      Including mirror: ftp.jaist.ac.jp
      Including mirror: ftp.nara.wide.ad.jp
       * extras: ftp.tsukuba.wide.ad.jp
      Including mirror: ftp.tsukuba.wide.ad.jp
      Including mirror: www.ftp.ne.jp
      
      adding 'td-agent' user...
      Installing default conffile  ...
      Configure td-agent to start, when booting up the OS...
        Verifying  : td-agent-1.1.18-0.i386                                       1/5
        Verifying  : td-libyaml-0.1.4-1.i386                                      2/5
        Verifying  : compat-libtermcap-2.0.8-49.el6.i686                          3/5
        Verifying  : openssl098e-0.9.8e-17.el6.centos.2.i686                      4/5
        Verifying  : compat-readline5-5.2-17.1.el6.i686                           5/5
      
      Installed:
        td-agent.i386 0:1.1.18-0
      
      Dependency Installed:
        compat-libtermcap.i686 0:2.0.8-49.el6
        compat-readline5.i686 0:5.2-17.1.el6
        openssl098e.i686 0:0.9.8e-17.el6.centos.2
        td-libyaml.i386 0:0.1.4-1
      
      Complete!
    2. インストール確認
      $ td-agent --version

      4016-13

    3. サービス起動ユーザーの設定

4016-14

    1. サービスの起動と自動起動設定
      $ sudo service td-agent start
      $ sudo chkconfig td-agent on

      4016-15

    2. ログ収集設定クライアントでは、サーバーと同様にsecureログを収集し、別ファイルにログを集積するとともに、サーバーにログを送信します。
      sudo vi /etc/td-agent/td-agent.conf
      
      # /var/log/secureを入力イベントとして定義
      <source>
        type tail
        path /var/log/secure
        pos_file /var/log/td-agent/secure.pos
        tag log_secure
        format none
      </source>
      
      # マッチしたログをサーバーに送信する
      <match **>
        type forward          # 転送
        send_timeout 60s      # 送信タイムアウト(60秒)
        heartbeat_type udp    # ハートビートプロトコル(udp)
        heartbeat_interval 1s # ハートビート間隔(1秒)
        <server>
          host 192.168.0.50   # 送信先サーバーアドレス
          port 24224          # サーバー待ち受けポート
        </server>
        <secondary>           # 送信エラーの場合、ファイル出力
          type file
          path /var/log/td-agent/forward-failed
        </secondary>
      </match>

      4016-16

      sourceディレクティブは、サーバーセットアップと同一ですが、matchディレクティブでは、ログの送信先の設定および、送信エラーが発生した際のファイル出力を定義しています。

      設定が終了したら、設定をリロードします。

      $ sudo service td-agent reload

      4016-17

      サーバーセットアップと同様に、クライアント上でsu/sudoコマンドを実行すると、サーバー上のログに表示されます。

      4016-18

    3. アクセスログ収集設定Apacheウエブサーバーのアクセスログを収集し、サーバーに送信します。
      <source>
        type tail
        path /var/log/httpd/access_log
        tag apache.access
        pos_file /var/log/td-agent/httpd-access_log.pos
        format apache2
      </source>

      4016-19

      td-agent.confの編集が終了したら、設定をリロードします。

      4016-20

      クライアント上のウエブサーバーにアクセスすると、サーバー上のログに表示されます。

      4016-21

以上で、クライアントのセットアップは終了です。

まとめ

ここまで、収集サーバーおよび、クライアントの設定について解説しました。応用編では、収集したログをデータベースに集積する方法について解説します。

Comments are closed.