log

Log::DBI を使って tiarra のログを DB に保存する

http://d.hatena.ne.jp/woremacx/20080404/1207260356 を使って tiarra のログを DB に保存するようにしたので記録。

http://d.hatena.ne.jp/h_kenan/20090716 を参考にさせていただきました。

モジュールを配置

/locate/to/tiarra/module/Log に DBI.pm を配置します。

そのままだと動かない箇所があったので、一部ソースを修正しました。

% diff -c DBI.pm.orig DBI.pm 
*** DBI.pm.orig	2011-07-31 23:36:26.000000000 +0900
--- DBI.pm	2011-07-31 23:36:02.000000000 +0900
***************
*** 65,73 ****
      my $self = shift;
  
      my $param;
!     for (qw/source user pass/) {
!         $param->{$_} = $self->config->DBI->get($_);
!     }
  
      my $dbh = DBI->connect($param->{source}, $param->{user}, $param->{pass},
                         { RaiseError => 1, AutoCommit => 1 })
--- 65,74 ----
      my $self = shift;
  
      my $param;
!     $param->{source} = $self->config->source;
!     $param->{user} = $self->config->user;
!     $param->{pass} = $self->config->pass;
! 
  
      my $dbh = DBI->connect($param->{source}, $param->{user}, $param->{pass},
                         { RaiseError => 1, AutoCommit => 1 })
***************
*** 122,128 ****
      $param->{nick_id} = $self->_resolve_id('Nick', delete($param->{nick}));
  
      my @key = keys(%$param);
!     my @val = @{%$param}{@key};
  
      (my $str = ('?,' x @key)) =~ s/,$//;
      my $sql = sprintf("insert into log (%s) values (%s)",
--- 123,132 ----
      $param->{nick_id} = $self->_resolve_id('Nick', delete($param->{nick}));
  
      my @key = keys(%$param);
!     my @val = ();
!     foreach my $value (@key) {
!       push(@val, $param->{$value});
!     }
  
      (my $str = ('?,' x @key)) =~ s/,$//;
      my $sql = sprintf("insert into log (%s) values (%s)",
***************
*** 249,252 ****
      %{$this->{writer_cache}} = ();
  }
  
! 1; 
--- 253,256 ----
      %{$this->{writer_cache}} = ();
  }
  
! 1;

その他

で、配置したら http://d.hatena.ne.jp/h_kenan/20090716 にあるように設定ファイルの編集と DB + テーブル作成。

この辺りは特に変更点もないので割愛します。

ひと通り終わったら tiarra 再起動で、エラーがでなければok。

これでとりあえずログをDBに保存できるようになったんですが、過去一年分のテキストデータのログをどうしようかなってことで、今度は tiarra のテキストログを DB へインポートするスクリプトを作成しました。とりあえず今日はここまで。