データベースでログを管理する時の要点

とあるシステムを作っているときに、「ログ処理をどうするか?」という問題点にぶち当たりました。

単純にファイルに記述していく、というのもありですが、それだと

  • ログファイルが大きくなると閲覧の処理に時間がかかるようになる
  • 検索条件の設定が行いづらい、検索処理に時間がかかる

という微妙な点が出てきます。

それを解消するためにデータベース処理を使ってログを管理する、という考えが登場します。

MySQLを使ってログを管理する

MySQLを使う場合は以下のことに注意すれば大丈夫だと思います。

  • テーブル種別はMyISAMを使用すること(InnoDBだと速度に問題あり。たとえforeign key制約が欲しくても使わないようにする)
  • ログが肥大化してきたときのローテーション処理をうまく行うこと

MySQLの場合はちゃんとしたデータベースシステムなのでデータの管理でそれほど問題になることがないと思います。

が、単一のデータベース上にずっとログを書き続けると件数がとんでもないことになりますのでそれには注意が必要です。

あと、MySQLのような「接続を行う」タイプのデータベースでログを管理しようとすると「そもそも接続できない」ということが起こりえますのでそれはどうするか考えてください。

SQLiteを使ってログを管理する

うまく使うと意外と有用なのがSQLiteを使ったログ管理です。Apacheのログ管理でもSQLiteを使う、ということもできるようです。

ちょっとした問題点をクリアできればこれはこれでいいと思います。

  • SQLiteの初期テーブルを作成するときはバージョン状態を間違えないようにすること(php+pdoで処理するときなどは初期テーブル作成もphp+pdoで行うこと)
  • SQLiteのデータベースは単一のファイルなのでログが肥大化するならlogrotateを併用してローテーションさせること
  • 肝心のログ日時はdatetime型などが使用できないので日付情報のデータ型はtextにして文字列保存すること

今日いろいろとテストをやっていた中で最後の項目に長い間引っかかってテストが進まなくなる、という現象をやってしまいました。

ログのテーブル形式をMySQLのSQL文と共通になるようにしていたためにdatetime型を使用できない、ということが抜けていたわけでして。

これのためにphpの処理エラーでprepare構文の処理でnon-objectエラーが発生しまくったわけですね。CREATE TABLEではエラーがわからなかったのに・・・。

コメントを残す

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

この記事のトラックバック用URL