さくらのスタンダードでtiarraを入れた話

検索しても軒並み何年もまえのエントリーばかりなので、2017年にもなって今更かと思いつつ。
自分の設定メモもかねて。

TL;DR: さくらのレンタルサーバー(スタンダード)にtiarra(Log::DBIつき)+tiarraMetroを入れたはなし
追記:DBに保存した日本語が化けたので対処した点

Tiarra配布サイトから最新版(現時点で2010年なので多分同じですが)を入れたいディレクトリに解凍。
tiarra.confを書き換えます。

  • generalブロック
    • ユーザー情報…書いた
    • tiarra-password…まあ設定する
    • control-socket-name…tiarraMetroのために適当につけた
    • 文字コード系はutf8に
    • notice-error-messages:1 …自分用なら見えるほうがよかろうと
  • networksブロック
    • multi-server-mode: 0…接続したいサーバーが1つだったので
    • 接続先のhostとportを書いた
  • モジュール類
    • Channel::Join::Connectを有効化、networkに書いたサーバーのチャンネルを
    • Log::Channelで日別logをとる
    • Log::Recentが地味に便利だったので
    • System::Errorを有効に、自分用だし
    • Log::DBIを入れた。
      source: DBI:mysql:データベースの名前:データベースのホスト名:3306
      user: ユーザー名
      pass: パスワード
      と保存するチャンネルの指定。sourceがややわかりにくかったけど、ホスト名のところはさくらの場合つまりmysql番号.db.sakura.ne.jpのことだった。
    • System::SendMessageをtiarraMetroのために

tiarra本体だけならそんな感じ。

ログを検索可能な状態にしたかったので、tiarraMetroを入れた。
これは素直にgitからひっぱってconf.ymlを編集したら問題なく動いた。下準備は大変だった。

まずtiarra本体Log::DBIを入れた。
tiarraMetroに同梱されているDBI.pmを指示通り入れて、mySQLにテーブルも作って、うまくいくようだったけれどしばらくするとデータベースとの接続がタイムアウトするのかMySQL server has gone awayと言われてしまった。
ので、エラーが出る行(91, 134)の直前に強引に

$dbh->{mysql_auto_reconnect} = 1;
$dbh->do("set names utf8");

を放り込んでちゃんとつながってくれーと祈ったら繋がったらしく、以後エラーは出なくなった。
追記:utf8で読み書きしているはずで、テキストログは全く問題なかったのにデータベースでだけ日本語が化けた。
ので、同梱されていたDBI.pmを精査したところ、263行目でjisとあるのが怪しいとふんでutf8に書き換えたところ、以後化けなくなった。
更に追記:日本語が化ける件、auto_reconnectの後にset namesし直すようにしたら今度こそ直ったので、書き足しておきます。

また、これまでLog::Channelがとってくれたtxtログをdbに入れるため、tiarraのテキストログをDBへインポートするを使ってインポートを試みた所、まずSQLにつながらないと言われた。
host指定がないのがまずかったようだったので、lib/model/model.pyにhost指定を付け加えてみた。変更範囲はこのあたり。

            self.con = MySQLdb.connect(host=self.host, user=self.user, passwd=self.passwd, 
                                      db=self.db, charset=self.charset,
                                      use_unicode=True)
            self.cur = self.con.cursor()

    @classmethod
    def read_conf(self):
        conf = ConfigParser.SafeConfigParser()
        conf.read(CONFIG_INI)
        
        self.host = conf.get('db', 'host')
        self.user = conf.get('db', 'username')

config.iniにホストを書き足した
host=データベースのホスト名
ところ、データベースにつながらない問題は解決した。が、走らせてみるとUnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-19: ordinal not in range(128)と止まってしまった。
DBを調べると日本語が含まれる行で止まったらしいと分かった。これは自力では解決できず、pythonがわかる知人の力を借りて最終的に解決した。
lib/model/log.pyの最後の方の.decode(‘utf-8’)を消して、スクリプトを実行する直前に

$ setenv PYTHONENCODING UTF-8

することで強引に解決した。

そんなこんなで2017年にもなってtiarraをインストールしてみた話でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です