いまさらだけど、ltsvが超便利!
はじめltsvってapacheのモジュールかと思ってましたら・・そうじゃなくって、単純にLogFormatをラベル付きのログを出力する形式ってだけなんです。 でも、また、これが便利、たとえば、access.log等は、標準ではラベルが入っていないため、大量にある場合、若干みづらいですよね。これがltsvであれば、ぐっと見やすくなります。
実際に試して見ましたが、ltsvってとっても便利!っていう話と、例として、apacheでの設定を中心で、おまけでnginxではどのように設定するのかなんていうのを書いていきます
apacheでの設定例
ltsvを利用するにあたってapache httpd.confに以下の通り設定されているか確認してください。yumでインストールとかした場合は、基本的に入っているので、あまりきにしなくて良いかもしれません。
LoadModule log_config_module modules/mod_log_config.so
log_config_moduleのカスタム変数については、こちらを参照してください。
http://httpd.apache.org/docs/current/mod/mod_log_config.html
でも、個人的にやってほいたほうが良さそうなのが、
time列を、行の先頭にもってくる
という部分だけです。(後のtreasure-dataに関係してきます)
というわけでこんなltsvログフォーマットを作成してみました。ltvsのフォーマットは、
[ラベル名]:[変数名]TAB
という形式で書きます。 そしてTABは、\t になります。ログフォーマット(テンプレート名)名は、"apache_ltsv"としました。
以下のように作成してみました。
httpd.conf
LogFormat "time:%{%d/%b/%Y:%H:%M:%S %z}t\tx_forwarded_for:%{X-Forwarded-For}i\tremote_host:%h\trequest:%r\tlast_status:%s\tsize:%b\treferer:%{Referer}i\tuser_agent:%{User-Agent}i\tv_host:%{Host}i" apache_ltsv
ちょっと見づらいですかね?^^; タブで改行してみました。すこし見やすくなったかな? ※http.confの設定上は、改行なしで記載してください
LogFormat "time:%{%d/%b/%Y:%H:%M:%S %z}t\t x_forwarded_for:%{X-Forwarded-For}i\t remote_host:%h\t request:%r\t last_status:%s\t size:%b\t referer:%{Referer}i\t user_agent:%{User-Agent}i\t v_host:%{Host}i" apache_ltsv
併せて、logの出力設定に以下の項目を追記します。二行目の、CustomLog logs/access_log_ltsv apache_ltsv が今回新規に追加した分になります。
# # For a single logfile with access, agent, and referer information # (Combined Logfile Format), use the following directive: # CustomLog logs/access_log combined CustomLog logs/access_log_ltsv apache_ltsv
・httpd.confの設定が終わりましたら。apacheを再起動します
# /etc/init.d/httpd restart
ログの出力確認
# head /var/log/httpd/access_log_ltsv time:[22/Jul/2013:16:40:33 +0900] x_forwarded_for:- remote_host:66.249.XXX.YYY request:GET /wordpress/?p=1548 HTTP/1.1 last_status:200 size:42160 referer:- user_agent:Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html) v_host:www.s-quad.com time:[22/Jul/2013:16:40:36 +0900] x_forwarded_for:- remote_host:202.XXX.XXX.YYY request:GET /wordpress/wp-content/uploads/2011/07/2011-07-01_213004.jpg HTTP/1.0 last_status:200 size:87346 referer:http://www.s-quad.com/wordpress/?p=987 user_agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) v_host:www.s-quad.com time:[22/Jul/2013:16:40:36 +0900] x_forwarded_for:- remote_host:202.XXX.XXX.YYY request:GET /favicon.ico HTTP/1.0 last_status:404 size:289 referer:- user_agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) v_host:www.s-quad.com
tab区切りになっていて、且つ、設定したラベルが表示されているのが確認できるかと思います。わかりやすいですね。
nginxでの設定例
nginx側では、以下のような設定になります
cat /etc/nginx/nginx.conf ------ log_format response_ltsv 'time:$time_local\t' 'server:$server_name\t' 'time_local:$msec\t' 'scheme:$scheme\t' 'request_uri:$request_uri\t' 'request_filename:$request_filename\t' 'status:$status\t' 'remote_addr:$remote_addr\t' 'user_agent:$http_user_agent\t' 'bytes_sent:$bytes_sent\t' 'body_bytes_sent:$body_bytes_sent\t' 'request_time:$request_time\t' 'upstream_response_time:$upstream_response_time'; server { listen 443; server_name test.test.test; ssl on; charset UTF-8; access_log /var/log/nginx/seek.access.log response_ltsv;
どんな時に便利なの?
ワンライナーで加工しやすい!!
例えば、accessログのウチもっとも、アクセス回数の多いリモートホストを降順に表示する、なんていった場合は、こんな感じで書きます。
cut/sort/uniq を利用して回数を表示する
# cut -f3 /var/log/httpd/access_log_ltsv | sort | uniq -c | sort -r 35 remote_host:163.XXX.17.43 20 remote_host:202.XXX.2.102 16 remote_host:XXX.19.58.156 16 remote_host:XXX.179.35.3 15 remote_host:XXX.101.164.209 15 remote_host:XXX.160.194.73 14 remote_host:XXX.118.185.164 14 remote_host:XXX.232.30.232 13 remote_host:XXX.16.89.141 8 remote_host:::1 8 remote_host:XXX.138.98.193 8 remote_host:202.XXX.245.194 8 remote_host:114.180.XXX.245
もちろん、一般的なapacheのaccess_logもできないわけではないですが、正規表現とか考えると、ちょっとめんどくさいですよね。私自身覚えるのが面倒な人なんであんまし書きたくはないです。
td-agentでの設定がやりやすい!!
もちろん、apacheのログを直接に格納するプラグインもあるのですが、apacheでカスタムログとか定義すると、formatとかも併せて加工する必要があるので使いづらいですよね。 ltsvであれば、ログに出力するカラムが追加されようが、順番が変更されようが、気にする必要はありません。
Treasure Dataに格納するtd-agent.confの設定例
今回の例では、Treasure Dataにしておりますが、この出力先は、MySQLでも構いません
/etc/td-agent/td-agent.conf
# cat /etc/td-agent/td-agent.conf source type tail path /var/log/httpd/access_log_ltsv format ltsv time_key time time_format %d/%b/%Y:%H:%M:%S %z tag td.apache.access pos_file /var/log/td-agent/apache_access.pos /source match td.apache.access type copy store type tdlog apikey c77c321a5510f0fbbb294222dad62732eec2dd0d8 auto_create_table buffer_type file buffer_path /var/log/td-agent/buffer/td /store store type file path /var/log/td-agent/access_ltsv.log /store /match