logwatchのhttpログ監視の出力項目をカスタマイズ(アクセス元IPを出力してみる)

logwatchを使って定期的にapacheへのアクセスlog内容のサマリをメール送付する運用をしているのですが、
その内容を見ると、以下のような感じで不正なアクセスがあったことはわかりますが、
それがどこから来ているのかなどの情報は結局ログファイルをチェックしないとわからないようになっています。

# logwatch --detail 10 --print --service http

 ################### Logwatch 7.3 (03/24/06) #################### 
        Processing Initiated: Tue Oct 18 19:20:53 2011
        Date Range Processed: yesterday
                              ( 2011-Oct-17 )
                              Period is day.
      Detail Level of Output: 10
              Type of Output: unformatted
           Logfiles for Host: logserver.co.jp
  ################################################################## 
 
 --------------------- httpd Begin ------------------------ 

 25.40 MB transferred in 3745 responses  (1xx 0, 2xx 1369, 3xx 2343, 4xx 33, 5xx 0) 
     787 Images (8.08 MB),
       9 Documents (0.04 MB),
    2801 Content pages (17.28 MB),
     148 Other (0.00 MB) 
 
 Requests with error response codes
    404 Not Found
       /%5C%22http://localhost/assets_c/2011 ... 3-230.jpg%5C%22: 1 Time(s)
       /%5C%22http://localhost/assets_c/2011 ... 4-233.jpg%5C%22: 1 Time(s)
       /2: 1 Time(s)
       /2011/07/favicon.ico: 1 Time(s)
       /2011/09/favicon.ico: 8 Time(s)
       /2011/09xxxaaa.html: 1 Time(s)
       /2011/10/favicon.ico: 3 Time(s)
       /aafafa: 12 Time(s)
       /cat2/favicon.ico: 2 Time(s)
       /pppp: 1 Time(s)
       /xxxxx: 1 Time(s)
       /abcde: 1 Time(s)
 
 ---------------------- httpd End ------------------------- 

 
 ###################### Logwatch End ######################### 

そこで、logwatchのhttpログチェック用のperlスクリプトの内容をカスタマイズしてアクセス元IPアドレスも併せて表示するようにしてみます。
/usr/share/logwatch/scripts/services/http
このファイルがログチェック実施時に実行されるperlスクリプトなので、ここの中身を変更します。
このファイルとは違うスクリプトファイルを実行するように変更されている場合はそちらの中身を変更して下さい。
下記のパッチを適用し、perlスクリプトを変更します。

138d137
< my %ip_list =();
560d558
<       $ip_list{$fmt_url} = $ip_list{$fmt_url}.$field{client_ip}."\n";
709,710c707
< #            print "      $url: $needs_exam{$code}{$url} Time(s)\n";
<             print "\n     $url: $needs_exam{$code}{$url} Time(s)\n$ip_list{$url}" ;
    • -
> print " $url: $needs_exam{$code}{$url} Time(s)\n";

ip_listという連想配列を1つ追加で作成し、そこに連想配列のキーとしてURLの値を設定し、バリューとしてアクセス元IPアドレスを設定していきmす。
こうしてIPアドレスを配列に格納しておくことで、表示部分で、該当URLのIPアドレスが表示可能になります。

カスタマイズ後の表示は以下のようになります。

# logwatch --detail 10 --print --service http

 ################### Logwatch 7.3 (03/24/06) #################### 
        Processing Initiated: Tue Oct 18 13:23:46 2011
        Date Range Processed: yesterday
                              ( 2011-Oct-17 )
                              Period is day.
      Detail Level of Output: 10
              Type of Output: unformatted
           Logfiles for Host: tcblog.valid.tis.co.jp
  ################################################################## 
 
 --------------------- httpd Begin ------------------------ 

 25.40 MB transferred in 3745 responses  (1xx 0, 2xx 1369, 3xx 2343, 4xx 33, 5xx 0) 
     787 Images (8.08 MB),
       9 Documents (0.04 MB),
    2801 Content pages (17.28 MB),
     148 Other (0.00 MB) 
 
 Requests with error response codes
    404 Not Found
 
      /%5C%22http://xxx.xxx.xx.xxx/assets_c/2011 ... 3-230.jpg%5C%22: 1 Time(s)
 yyy.yyy.yyy.yyy
 
      /%5C%22http://xxx.xxx.xx.xxx/assets_c/2011 ... 4-233.jpg%5C%22: 1 Time(s)
 yyy.yyy.yyy.yyy
 
      /2: 1 Time(s)
 yyy.yyy.yyy.yyy
 
      /2011/07/favicon.ico: 1 Time(s)
 zzz.zzz.zzz.zzz
 
      /2011/09/favicon.ico: 8 Time(s)
 yyy.yyy.yyy.yyy
 yyy.yyy.yyy.yyy
 yyy.yyy.yyy.yyy
 yyy.yyy.yyy.yyy
 yyy.yyy.yyy.yyy
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 
      /2011/09xxxaaa.html: 1 Time(s)
 yyy.yyy.yyy.yyy
 
      /2011/10/favicon.ico: 3 Time(s)
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 yyy.yyy.yyy.yyy
 
      /aafafa: 12 Time(s)
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 
      /cat2/favicon.ico: 2 Time(s)
 zzz.zzz.zzz.zzz
 zzz.zzz.zzz.zzz
 
      /pppp: 1 Time(s)
 yyy.yyy.yyy.yyy
 
      /xxxxx: 1 Time(s)
 zzz.zzz.zzz.zzz
 
      /abcde: 1 Time(s)
 zzz.zzz.zzz.zzz
 
 ---------------------- httpd End ------------------------- 

 
 ###################### Logwatch End ######################### 

これで、それぞれのURLへのアクセスに失敗したアクセス元IPアドレスを列挙できました。
こういった具合にlogwatchの出力内容をカスタマイズ可能です。
今回はアクセス元IPアドレスを出力するようにしましたが、その他にもリファラ情報だったり、通信パケットサイズだったりをカスタマイズして出力することもできます。