apacheのログファイルは見づらいと感じることも多いですが、
とあるコマンドを使うことで自分の意のままに出力結果を操ることが可能です。
今回は、Linux標準搭載のコマンドで出力結果を見やすくしてゆきます。
apacheの設定
今回コマンドの使い方を紹介するにあたり、
下記のようなログフォーマットを設定している前提で進めます。
1 |
LogFormat "%{X-Forwarded-For}i %h %l %u %t \\"%r\\" %>s %b \\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined |
一般的なapacheのログフォーマットだとX-Forwarded-Forは設定に入ってないはずですので、
その点も考慮して読み進めていただければと思います。
使えるコマンド
grep
grepコマンドは文字列を検索するためのコマンドです。
ログファイルで使うときは、特定の文字列があるかを確認するために用います。
また、正規表現が使用できるので複雑なコマンド形式でも
検索を行うことが可能です。
使い方
grepコマンドは引数にファイル名を指定して使うこともできますが、
ここではあえてパイプで繋いで出力したものを操作してみます。
※grep以外のコマンド使う際にもパイプは使うので、
慣れて覚えちゃいましょう!
1 2 |
# cat sample.txt | grep "hoge" hogehoge sample1 |
このコマンド例では、hogeという文字がマッチしたらその行全体を出力するようになっています。
実際のログではどのように扱えるのか見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
- 192.168.1.20 - - [12/Mar/2020:21:30:45 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 41419083 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:21:30:57 +0900] "POST /dltools/phn/ HTTP/1.1" 200 21691 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:21:31:27 +0900] "POST /dltools/phn/ HTTP/1.1" 200 38415 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:21:31:53 +0900] "POST /dltools/phn/ HTTP/1.1" 200 39858 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:21:32:41 +0900] "POST /dltools/phn/ HTTP/1.1" 200 25318 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"\n- 192.168.1.20 - - [12/Mar/2020:21:31:17 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 408266580 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:21:32:56 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 515629277 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:21:32:28 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 427973665 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:21:31:42 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 569591699 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:23:40:06 +0900] "POST /dltools/phn/ HTTP/1.1" 200 30560 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:23:40:20 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 11833928 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:23:40:35 +0900] "POST /dltools/phn/ HTTP/1.1" 200 28228 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" - 192.168.1.20 - - [12/Mar/2020:23:40:49 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 4722027 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" |
これは、自宅で作成しているアプリケーションをテストした時のログです。
この中で「2020:23:40:20」に該当する箇所だけをgrepで抽出してみます。
1 2 |
# cat access_log | grep "2020:23:40:20" - 192.168.1.20 - - [12/Mar/2020:23:40:20 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 11833928 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" |
ちゃんと抽出できましたね。
grepは特定の文字列が存在する行をまるごと出力できるので、
1行にどのような情報があるのかを見ることもできますね。
sed
文字列の中から特定箇所の文字を抽出可能で、
抽出された文字列を別の文字列に置換することが可能です。
ログファイルに使うときは、特定のIPアドレスを一括で「sample」といった
任意の文字に変えたいときに使えます。
試しに先ほどのログの出力を書き換えてみましょう。
1 2 3 4 |
# cat access_log | grep "2020:23:40:20" - 192.168.1.20 - - [12/Mar/2020:23:40:20 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 11833928 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" # cat access_log | grep "2020:23:40:20" | sed -e \'s/192.168.1.20/sample/g\' - sample - - [12/Mar/2020:23:40:20 +0900] "POST /dltools/phn/download.php HTTP/1.1" 200 11833928 "http://192.168.1.80/dltools/phn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" |
左側にあったIPアドレスがsampleという文字に置きかわりました。
このsedというコマンドは文字列を置換するときに重宝するコマンドです。
sed -e で正規表現を使った置換が可能になります。
\'\'(シングルクォート)で囲まれている部分が置換対象になり、
s//の中にある部分が対象文字列です。
//gの中にある部分が置換後の文字列なので、
任意の文字に変えることが可能になります。
ここではIPアドレスを変えてみましたが、
もちろん他の文字も置換することができますよ。
awk
awkコマンドは奥が深いコマンドで、できることは多岐にわたります。
列の概念があるので出力したい列を指定することができます。
例えば、Apacheのようなサーバログではスペースが空いている個所がたくさんありますが、
「スペースで区切られた○列目を表示」といった出力の指定方法があります。
使い方
1 2 3 4 5 6 7 8 |
# cat access_log | awk \'{print $2,$5,$6,$7,$8}\' 192.168.1.20 [12/Mar/2020:21:32:56 +0900] "POST /dltools/phn/download.php 192.168.1.20 [12/Mar/2020:21:32:28 +0900] "POST /dltools/phn/download.php 192.168.1.20 [12/Mar/2020:21:31:42 +0900] "POST /dltools/phn/download.php 192.168.1.20 [12/Mar/2020:23:40:06 +0900] "POST /dltools/phn/ 192.168.1.20 [12/Mar/2020:23:40:20 +0900] "POST /dltools/phn/download.php 192.168.1.20 [12/Mar/2020:23:40:35 +0900] "POST /dltools/phn/ 192.168.1.20 [12/Mar/2020:23:40:49 +0900] "POST /dltools/phn/download.php |
awk \'{print $?}\'とすることで、入力された文字列の
スペース区切りを識別して?列目の文字だけを出力することが可能です。
今回の例では、2列目・5列目・6列目・7列目・8列目を出力させるようにしてます。
こうやって整形することで、少し分かりやすくなったと思います。
awk \'{print $2,$5,$6,$7,$8}\'のようにカンマ区切りで指定すると、
スペースを空けたままで出力できます。
カンマ区切りを無くせばスペースを消して結合した状態にできます。