俺の備忘録

技術系を中心に日々忘れていく事柄を記録したい。。。

fluentを使ったログ集約

アプリケーションサーバのログを集約するのにfluentを利用してみたのでその備忘録。
構築手順を以下にまとめてみます。

構成

アプリケーションサーバから、各種のログをログ集約サーバへ送信する。
対象となるOSは、AmazonLinux

リポジトリの追加
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
ユーザの作成

fludentのユーザを作成します。ユーザ名は、td-agent

# groupadd -g xxx td-agent
# useradd -u xxx -g td-agent -s /sbin/nologin td-agent

udi,gidは各サーバで同一のものを設定する

fluentのインストール

yum .confにプロキシの設定があることを確認
※普通に外へ出れるのなら必要なし。
インストールバージョンは、1.1.13でした。
ltsvを使用したいので、対応したバージョンを導入しました。

# yum install td-agent
プラグインをコンパイルするためのgcc,makeをインストール
# yum install make gcc
fluentdプラグインのインストール
# /usr/lib64/fluent/ruby/bin/fluent-gem update -p http://xxxx.xxx.xxx.xx:yyyy
# /usr/lib64/fluent/ruby/bin/fluent-gem install -p http://xxx.xxx.xxx.xxx:yyyy fluent-plugin-forest
# /usr/lib64/fluent/ruby/bin/fluent-gem install -p http://xxx.xxx.xxx.xxx:yyyy fluent-plugin-config-expander
# /usr/lib64/fluent/ruby/bin/fluent-gem install -p http://xxx.xxx.xxx.xxx:yyyy fluent-plugin-file-alternative
POSファイル用のディレクトリ作成
# mkdir /var/log/td-agent/pos
# chown td-agent:td-agent /varlog/td-agent/pos
ログを読めるように権限設定を変更
# chgrp td-agent /var/log/messages
# chgrp td-agent /var/log/secure
# chgrp td-agent /var/log/cron
# chgrp td-agent /var/log/tomcat/
# chgrp td-agent /var/log/nginx/

# chmod g+rx /var/log/messages
# chmod g+rx /var/log/secure
# chmod g+rx /var/log/cron
# chmod g+rx /var/log/tomcat/
# chmod g+rx /var/log/nginx/
nginxの設定追加

nginxのログをltsv形式で出力するためにログフォーマットに以下を追加

log_format ltsv    'hostname:$hostname'
                   '\ttime:"$time_local"'
                   '\thost:$remote_addr'
                   '\tforwardedfor:"$http_x_forwarded_for"'
                   '\treq:$request'
                   '\tstatus:$status'
                   '\tsize:$body_bytes_sent'
                   '\treferer:$http_referer'
                   '\tua:"$http_user_agent"'
                   '\treqtime:$request_time'
                   '\tcache:$upstream_http_x_cache'
                   '\truntime:$upstream_http_x_runtime'
                   '\tvhost:$host'
                   '\tcookie:"$http_cookie"'
                   '\tut:$upstream_response_time'
                   '\tcs:$upstream_cache_status';
アプリケーションのログを出力する設定

アプリケーション側には、fluent-logger-0.2.6を使用してfluentへ出力する。
ただし、これだけだと使いずらいのでfluent-appenderを使用してlog4jの設定で出力をできるようにしました。

fluent-appenderも以下のように多少手を加えた。
- stackTraceを出力できるようにした。
- ホスト名をログに含めるようにした。
- ミリ秒単位の日時をログへ追加した。

fluentdの設定

送信側の設定の設定は、大体こんな感じ。
サーバ設定

<source>
  type forward
  port 24224   # default
</source>
<match *.**>
  type forward
  retry_limit 5
  flush_interval 5s
  <server>
    host 111.111.111.111
    port 123123
  </server>
</match>

個別の設定
syslogの送信設定

<source>
  type config_expander
  <config>
    type tail
    format syslog
    path /var/log/messages
    pos_file /var/log/pos/messages.pos
    tag ${hostname}/syslog.messages
  </config>
</source>

nginxのアクセスログの設定

<source>
  type config_expander
  <config>
    type tail
    format ltsv
    time_format "%Y/%m/%d:%H:%M:%S %z"
    path /var/log/nginx/vhost.access.ltsv.log
    pos_file /var/log/nginx/vhost.access.ltsv.log.pos
    tag nginx.access.vhost.${hostname}
  </config>
</source>

catalina.outのログ設定

<source>
  type config_expander
  <config>
    type tail
    path /var/log/tomcat/logs/catalina.out
    pos_file /var/log/tomcat/logs/catalina.out.pos
    tag ${hostname}/catalina.out
    format /^(?<message>.*$)/
    time_format "%Y-%m-%d %H:%M:%S %z"
  </config>
</source>


受信側の設定は、こんな感じでやって見ました。まだ工夫の余地があるかも。
syslogの受信設定

<match */syslog.messages>
  type forest
  subtype file_alternative
  <template>
    path /var/log/syslog/messages.%Y%m%d.log
    output_include_time true
    output_include_tag  true
    output_data_type attr:host,ident,pid,message
    add_newline true
    field_separator SPACE
    localtime
    flush_interval 1s
  </template>
</source>

nginxのアクセスログの設定

<match nginx.access.vhost.*>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type forest
    subtype file_alternative
    <template>
      path /var/log/nginx/nginx-vhost-access.%Y%m%d%H.log
      flush_interval 1s
      field_separator SPACE
      localtime
    </template>
  </store>
</match>

tomcatのログの設定

# 追加のアペンダーを出力
<match log4j-appender.*>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type forest
    subtype file_alternative
    <template>
      path /var/log/tomcat/logs/app-common.%Y%m%d%H.log
      output_data_type attr:time,hostname,thread,level,loggerName,message
      add_newline true
      field_separator SPACE
      flush_interval 1s
      time_format "%Y-%m-%d %H:%M:%S.%3N"
      localtime
    </template>
  </store>
</match>
#catalina.out
<match */catalina.out>
  type copy
  <store>
     type stdout
  </store>
  <store>
    type forest
    subtype file_alternative
    <template>
      path /var/log/tomcat/logs/catalina.%Y%m%d.out
      output_include_time true
      output_include_tag true
      output_data_type attr:message
      add_newline true
      field_separator SPACE
      flush_interval 1s
      localtime
    </template>
  </store>
</match>

ひとまず、こんな設定で運用をしてみて様子見です。