弊社ではMagentoに関する様々なご相談をお受けしておりますが、サーバーの引っ越しや、アプリケーションの不具合調査などの際に、データベースの状態をチェックすることが多々あります。
その際によく見かけるのが、ログデータの異常なまでの肥大化です。

このエントリでは、Magentoが訪問者のログをどこに記録しているか、何に使っているか。
そして、ログをどうすれば適切にクリーニングできるかを説明します。 

Magentoのアクセスログ

Magentoは訪問者が1回アクセスするごとに、データベース上にその訪問先URLや顧客IDなどを記録しています。
アクセス1回毎、というのがクセモノで、1,000ページビュー/日のサイトでは大した問題にはなりませんが、 100,000ページビュー/日のサイトでは問題になってきます。

というのも、MagentoのデータベースはMySQLの上に設置する仕様になっているため、書き込み(つまりは更新処理)を行うデータベースサーバーは1台であることが多く、処理の分散を行うことが難しい作りだからです。

物理サーバーを利用していた時代から、クラウドを筆頭とする仮想サーバーの時代になり、100GBのメモリや30コアを超えるCPUを搭載したサーバーを手に入れることができるようになりましたが、やはり1台のコンピューターでは限界があります。
そのため、アクセスの多いサイトではログの記録というのはかなり深刻な問題になるケースが多く見られます。

ログの使用目的

Magentoはこのログを基本的には以下の用途に使っています。

  • よく見られている商品の統計作成
  • オンライン状態(=ログインしている)の顧客の判定
  • 「最近見た商品」の表示

オンライン状態の判定以外は外部サービス(レコメンデーションエンジンなど)を使うことで補完できるもので、負荷の高いサイトではログの記録を停止して、外部サービスを利用するほうが効率的であることがあります。

ログの肥大化

当然のことながら、ログは毎日記録されていきます。
サイトのアクセス数に比例してこのデータ量は増えていくため、アクセスの多いサイトではわずか半年程度でかなりのデータサイズになります。
以下の例を見てください。

ログクリーニング前

これはあるサイトのログデータの統計情報です。
運営開始から1年近く経過して、その間1回もログクリーニングされていませんでした。
データ件数が4,000万行近くあり、データサイズとしては3.68GBもあります。
データベースを圧迫してしまうので、こうなるまえに定期的にクリーニングする必要があります。 

ログの状態を見るには

ログの状態は、Magentoに付属しているコマンドラインツールで確認することができます。
Magentoのドキュメントルートには、「shell」ディレクトリがあります。ここに入っている「log.php」 を以下のようにターミナルから実行することで、ログの状態を知ることができます。

php shell/log.php status

サーバーの引越し前などにはチェックしておくとよいでしょう。
データベースをダンプする際にこのデータをクリーニングすることで、ダンプサイズを減らすことができます。 

ログをクリーニングをするには

さて、肥大化したログはクリーニングする必要があります。
これには先程の「log.php」を使います。

php shell/log.php clean --days <ログを残したい日数>

とすることでログをクリーンアップすることができます。
ログのサイズが大きければ大きいほど、この処理は時間がかかります。
先ほどのサイトでは、クリーンアップ後は以下のようになりました。

ログクリーニング後

データサイズとしてかなりの削減ができています。
この作業を手動で実行するのは大変手間なので、自動化したくなります。

ログクリーニングの設定

ログクリーニングを自動化するには、Magentoの管理画面で設定をする必要があります。
この設定は、「システム>設定>システム」の「ログクリーニング」にあります。
標準状態ではオフになっているので、有効にし、保持したい日数を指定します。

ログクリーニング設定 

あとはcron.phpまたはcron.shを定期的に実行するようにしさえしておけば、Magentoが毎日ログを掃除してくれます。