いわゆる生ログからIPを抽出したり、ログを特定したりするときの方法を備忘録的に書きます。
- 最もアクセスの多いIPを抽出
- 最もアクセスの多いIPを10位まで抽出
- 特定URLを除いた最もアクセスの多いIPを抽出
- 特定URLを除いた最もアクセスの多いIPを10位まで抽出
- 指定IPのログ抽出
- 指定IPの特定URLを除いたログ抽出
合計で6つのシナリオを順次に説明していきます。
最もアクセスの多いIPを抽出
うちは管理画面でも簡易なアクセス数を表示しているのですが、異様に多い日は、まず最もアクセスの多いIPを特定し抽出します。
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 1
これで最もアクセスの多いIPを抽出できるのですが、どうも悪さをしているのは1つではないという時は、10位まで抽出します。
最もアクセスの多いIPを10位まで抽出
10位まで抽出するには
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
head -n 1 を head -n 10 にするだけです。
同じ要領で30位までとかもできます。
特定URLを除いた最もアクセスの多いIPを抽出
一方で、うちのサイトの構造上、ユーザが「メッセージ画面」を開いたままにすると、メッセージ画面というログが大量に生まれますので、そのページを除く必要があります。
grep -v '除外URL' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 1
こうすれば、除外URLへのアクセスを除いて、最もアクセスの多いIPだけを抽出することができます。
特定URLを除いた最もアクセスの多いIPを10位まで抽出
先ほど同じ要領で、
grep -v '除外URL' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10
head -n 10 にすれば、10位まで特定することができます。
指定IPのログ抽出
問題児を特定したところで、今度は、「一体どこにアクセスしているのか」を特定するために、
grep '指定IP' /var/log/nginx/access.log |more
で当該IPをアクセスログを全部抽出します。
指定IPの特定URLを除いたログ抽出
しかし、先ほども伝えたように、ユーザが「メッセージ画面」を開いたままにすると、メッセージ画面というログが大量に生まれますので、
grep '指定IP' /var/log/nginx/access.log | grep -v '除外URL' |more
このように除外して、「一体どこにアクセスしているのか」を特定します。
これを3位ないし5位まで行えれば、状況の把握とともに問題を特定することができます。

