:>/dev/null

ラガードエンジニアの不撓不屈の精神

apacheのaccess_logをjson化しtd-agentで集約サーバへ収集する

apacheaccess_logを構築した集約サーバへ収集する必要があり、そのついでに解析しやすいようjson化設定したのでメモ。
apacheログをjson化する要件が発生した場合汎用性がありそうなので、調査・対応を下記へ記載しておく。

  • 以下構築要件
    • apacheaccess_logを集約サーバへ収集する
    • 集約サーバで解析しやすいようjson形式で送信
    • td-agentを使用し、送信時でのformatで正規表現指定しない

apacheのconfファイルにjsonフォーマット指定追加

# vi http.conf
// フォーマット指定
LogFormat "{\"timestamp\":\"%{%Y-%m-%dT%H:%M:%S}t.%{msec_frac}t%{%z}t\", \"remote_ip\":\"%a\", \"port\":%{local}p, \"local_ip\":\"%A\", \"httpHost\":\"%v\", \"reqTime\":\"%T\", \"reqStatus\":%>s, \"protocol\":\"%H\", \"bytes_sent\":%O, \"bytes_received\":%I, \"reqTime\":%D, \"file_path\":\"%f\", \"query\":\"%q\", \"method\":\"%m\", \"reqURL\":\"%U\", \"request\":\"%r\", \"ua\":\"%{User-Agent}i\", \"referrer\":\"%{Referer}i\"}" json

//カスタムログにてログ出力
CustomLog /usr/local/apache2/logs/test.com_ssl_access.443.json.log json

以下td-agent2環境fluentd v0.12以降のバージョン向けの設定例

# vi apache.access.conf
<source>
  @id in_apache_http_com_json
  @type   config_expander
   <config>
    @type tail
    path /usr/local/apache2/logs/test.com_ssl_access.443.json.log
    pos_file /var/log/td-agent/in.apache.com.access.443.json.pos

    read_from_head true
    keep_time_key true
    refresh_interval 1s
    format json
    time_key  time
    time_format %Y-%m-%dT%H:%M:%S
    keep_time_key true

    tag test.apache.access
    @label @testserver
  </config>
</source>

後は、上記ファイルをtd-agent.confで@includeし、送信設定(forward)すれば送信される。
※必要に応じてローテート設定行う

# vi /etc/logrotate.d/apache
/usr/local/apache2/logs/*.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        /usr/local/apache2/bin/apachectl graceful > /dev/null 2>/dev/null || true
    endscript
}

ref)

System 5 Admins 0: Apache Access Logs to JSON

カスタムログ形式 - ログのストリーム配信 | Fastly Help Guides