‘Analog’ でアクセスログ解析tips|ホストレポートのIPから ‘ipinfo.io’ で情報を取得する

みんなだいすき ‘Analog’ で ‘Apache’ の生ログのアクセスログ解析(本家? ‘Analog 6.0: Introduction’ は2004.12が最終更新。 ‘Analog CE’ ってのは2021.07時点で継続中)。でも「ホストレポート」のIPの104.198.89.53とかってながめてみても,何のこっちゃですよね。そこで ‘ipinfo.io’ を使ってすこしわかりやすくしてみました。

まず ‘analog.cfg’ にtxtファイルからjsを読んでもらう

‘Analog’ の書き出す ‘ウェブサーバの統計 [my organisation]’ にjsを読み込むため下記のtxtファイルのパスを ‘analog.cfg’ に記入。 ‘FOOTERFILE'で出力ファイルの ‘<div class="footer">’ のあとにこのファイルの内容を付け加えられる?のでtxtファイルを読ませるとイイみたい。パスは適当に…。

analog.cfg
FOOTERFILE C:\Users\[UserName]\Documents\js\analog_ipinfo_js.txt

指定した ‘analog_ipinfo_js.txt’ に ‘jQuery’ と読み込みたいjsファイルを指定

‘jQuery’ はGoogleのCDN経由で読み込み。jsファイルはデフォルトの出力場所 ‘OUTFILE Report.html’ と同じ階層につくるときのパスの例。

analog_ipinfo_js.txt
<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js'></script>
<script src='analog_ipinfo.js'></script>

今回のメインのつくった ‘analog_ipinfo.js’ で ‘ipinfo.io’ からIP情報を取得して書き換える

‘div.host table tbody tr’ とか ‘<td class="xl">’ は ‘Analog 6.0’ がベース。 ‘Analog’ のバージョンによって違うときは適当に…。 ‘cityがわからないとき’ は中継のプロキシサーバーを使ってたりするとわからなくなる。とりたい値は ‘ip, hostname, city, region, country, loc, org, postal, timezone’ とかあって有料版だと ‘company’ とかも取得できるので見たいものを適当に…。

analog_ipinfo.js
jQuery(function () {//jQuery予約
//==================================================
function host_list() {
    let hol_length = $('div.host table tbody tr').length;//リストを数える
    let hol_html_org = $('div.host table tbody').html();//htmlを取得
    let hol_list = hol_html_org.split('<tr>');//<tr>で区切って配列に
        for (let i = 1; i < hol_length; i++) {//0番目は円グラフとその色分けなのでとばす
            let hol_IP_org = hol_list[i];//順に取得
            let hol_class_xl = hol_IP_org.split('<td class="xl">')[1];//<td class="xl">の後ろ
            let hol_class_xl_IP = hol_class_xl.split('</td></tr>')[0];//</td></tr>の前→104.198.89.53とか
            $.ajax({
                url: 'https://ipinfo.io/' + hol_class_xl_IP,//ipinfo.ioにたずねる
                dataType: 'json',
                async: false
            })
            .then(function (res) {
                if (res.city != undefined) {//cityがわからないとき以外
                var hol_res_list = res.region + '&nbsp;' + res.country + '&nbsp;' + res.hostname + '&nbsp;' + res.org + '&nbsp;' + hol_class_xl_IP;//とりたい値
            } else {//cityがわからないときはIPのまま
                hol_res_list = hol_class_xl_IP;
            };
            let hol_fix_IP = new RegExp(hol_class_xl_IP, 'g');//正規表現にいれてIPと'とりたい値'をグラフ下と表の全部でおきかえ
            var hol_org = $('div.host').html().replace(hol_fix_IP, hol_res_list);
            $('div.host').html(hol_org);
            },
            function () {//エラーのときhost_list_IP_error&nbsp;をつけてIPのまま表示
                let hol_fix_IP = new RegExp(hol_class_xl_IP, 'g');
                var hol_org = $('div.host').html().replace(hol_fix_IP, 'host_list_IP_error&nbsp;' + hol_class_xl_IP);
                $('div.host').html(hol_org);
            });
        };
};
//フリーのipinfo.ioは1日あたり1,000リクエストの制限があるので,再読み込みで何度もリクエストしないようにボタンで実行するようにする
$('div.host').append('<button id='host_IP'>host_IP ipinfo.io</button>');
$('#host_IP').on('click', function () {
    host_list();
});
//==================================================
});

結果はこんなかんじ

analog_host_org analog_host_analyze

←ボタン押す前・ボタン押した後→
いつかのこのサイトの集計。HatenaがAmazon使ってたり…。ってかほとんどbotじゃん(>_<);。htmlのコードを整形しちゃうとタブとかスペースが入ってうまくいかないことがあるのでご注意を…。
‘Analog’ でアクセスログ解析tips|ブラウザレポートを ‘platform.js’ でみやすくするも使うとイイかも。→ ‘Analog’ は ‘FOOTERFILE’ をひとつしか書き出さないみたいなので ‘analog_ipinfo_js.txt’ と ‘analog_platform_js.txt’ の内容をまとめたtxtファイルにしてね