Database JUNKY

MySQL,MariaDBを中心としたブログです

いまさらだけど、ltsvが超便利!

f:id:hit10231023:20180918181949p:plain

はじめltsvってapacheのモジュールかと思ってましたら・・そうじゃなくって、単純にLogFormatをラベル付きのログを出力する形式ってだけなんです。 でも、また、これが便利、たとえば、access.log等は、標準ではラベルが入っていないため、大量にある場合、若干みづらいですよね。これがltsvであれば、ぐっと見やすくなります。

ltsv.org

実際に試して見ましたが、ltsvってとっても便利!っていう話と、例として、apacheでの設定を中心で、おまけでnginxではどのように設定するのかなんていうのを書いていきます

apacheでの設定例

ltsvを利用するにあたってapache httpd.confに以下の通り設定されているか確認してください。yumでインストールとかした場合は、基本的に入っているので、あまりきにしなくて良いかもしれません。

/etc/httpd/conf/httpd.conf

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

もちろん、一般的なapacheaccess_logもできないわけではないですが、正規表現とか考えると、ちょっとめんどくさいですよね。私自身覚えるのが面倒な人なんであんまし書きたくはないです。

td-agentでの設定がやりやすい!!

もちろん、apacheのログを直接に格納するプラグインもあるのですが、apacheでカスタムログとか定義すると、formatとかも併せて加工する必要があるので使いづらいですよね。 ltsvであれば、ログに出力するカラムが追加されようが、順番が変更されようが、気にする必要はありません。

Treasure Dataに格納するtd-agent.confの設定例

今回の例では、Treasure Dataにしておりますが、この出力先は、MySQLでも構いません

hit.hateblo.jp

/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

f:id:hit10231023:20180308234003p:plain