読者です 読者をやめる 読者になる 読者になる

複数サーバのログを一気に表示

職場で、アプリケーションサーバなりWEBサーバなりの定期的なログ監視をしましょうという話が出ているのですが、これがまあ面倒なこと、面倒なこと。
いや、必要だってことは分かってますよ。
ただ、何が面倒って、一回踏み台のサーバにsshして、そこからさらにアプリケーションサーバかWEBサーバにsshして、でもってログをtailしたり、lessしてShift + fしり、grepしたりするわけです。おまけに、どいつもこいつも複数台構成なので、こんなの毎回やってられないなと思ったわけです。
で、
コマンド一発でこれが全部見られたらいいなあと思いまして、screenのウィンドウ分割機能を使い、複数サーバのログをまとめて出力するシェルスクリプトを書いてみました。
時代は最早tmuxと思いますが、ウチのサーバの場合新しくインストールする必要があったので、まあこれでいいか、と。
以下は、2台構成のJBossクラスタのログを出力する例です。
ただしssh-keygen済みで、パスワード入力なしにsshできることが前提となっています。

#!/bin/bash

JBOSS_PATH=/usr/local/jboss/server

JBOSS_CLUSTER=cluster-A
SERVERS=(server-1 server-2)

LOG_CMD="tail -f ${JBOSS_PATH}/${JBOSS_CLUSTER}/log/server.log"

SERVER_NUM=${#SERVERS[@]}
i=0
while [ $i -lt ${SERVER_NUM} ];                                                                                                                       
do
        server=${SERVERS[$i]}
        next=$(($i + 1))
        if [ $i$ -eq 0 ];                                                                                                                             
        then
                screen -t ${server} ssh ${server} "${LOG_CMD}"; screen -X eval focus;                                                                 
        else
                screen -t ${server} ssh ${server} "${LOG_CMD}"; screen -X eval split focus "select ${next}";                                          
        fi
        i=${next}
done

とりあえずsweep_logs.shなどとテキトウな名前をつけておきます。
クラスタの名前やサーバ名(の配列)は、外から与えられるようにしておくとよいでしょう。これを格好良くしていくのは難しい話ではないと思いますし。
さて、実行!

$ ./sweep_logs.sh

あ、あれ?
screenが立ち上がってログも表示されましたが、ウィンドウは分割されないし何かが変です。
そこで試しに

$ screen ./sween_logs.sh

と、screen起動後に実行してみたところ大成功。
うーん、何かカッコ悪いですね。。。
まあとりあえず実用レベルまでは来たのでよしとしましょう。