2007-09-08  さくらインターネットの生ログを定期的にダウンロードする

あらまし

さくらインターネットの共有サーバでは,Apacheの生ログファイルを出力させることができます。サーバ上のログファイルは一定期間を過ぎると消えてしまいます。ログファイルをローカルホストにコピーして,バックアップを取ることにしました。作成したスクリプトを公開します。

動作概要

  • ローカルホストのOSはWindows 2000以降に対応
  • ログファイルのダウンロードにはlftpを使う
  • ログファイルは「c:\log\username\2007\01」のようにYYYY\MMのフォルダに保存する
  • スクリプトを「タスク」に登録して毎朝,自動実行させる
  • 説明文は,さくらインターネットの「ライトプラン」「スタンダードプラン」「プレミアムプラン」に対応

注意事項

このスクリプトは無保証です。使用した結果生じた損害の責任は一切負いません。エラーに対する耐性はあまりありません。例えば「ディスクフル状態における動作」「スクリプトを複数,同時に実行した場合」などは検証していません。検証されていない動作の結果は未知であり,ローカルホストならびにリモートホストに何らかの危害(ファイルの消失,意図しないファイル生成など)を与える可能性があります。不明な点がある方は使わないでください

設置手順

(1) ユーティリティの準備

lftp.exeとgzip.exeを用意してください。どちらもCygwinをフルインストールすれば入るはずです。申し訳ありませんが,この場ではCygwinのインストール方法は説明しません。

(2) ログファイルフォルダの準備

ローカルディスクのどこにログファイルを保存するか決めておきます。この例では「C:\log\username」にログファイルを作ることにします。「C:\log\username」はフォルダです。フォルダはあらかじめ作っておきます。フォルダ名には空白を入れないように注意してください。このスクリプトは空白入りのフォルダ名を想定していません。

(3) log_sync.cmdの作成

メモ帳を開き,下記のスクリプトをコピー・アンド・ペーストします。ファイル名を「log_sync.cmd」として,「C:\log\username」にファイル保存します。(スクリプトの置き場所はどこでも構いませんが,迷子にならない場所をお勧めします。)

@ECHO OFF
setlocal

REM ========== 設定項目ここから ==========

SET FTP_HOST=username.sakura.ne.jp
SET FTP_USER=username
SET FTP_PASSWD=**********
SET FTP_CDIR=/home/username/log
SET LOCALDIR=C:\log\username

SET PATH=%PATH%;C:\cygwin\bin

REM ========== 設定項目ここまで ==========

:check

IF NOT EXIST %LOCALDIR% (
    ECHO [ERR] %LOCALDIR% が存在しません >con
    GOTO :EOF
)

FOR %%I IN (lftp.exe) DO IF "%%~$PATH:I" == "" (
    ECHO [ERR] lftp.exe が見つかりません >con
    GOTO :EOF
)

FOR %%I IN (gzip.exe) DO IF "%%~$PATH:I" == "" (
    ECHO [ERR] gzip.exe が見つかりません >con
    GOTO :EOF
)

:prepare

SET WORK_DIR=%LOCALDIR%\_temp
IF NOT EXIST %WORK_DIR% mkdir %WORK_DIR%
CD %LOCALDIR%

:ftp

lftp -c "open -u %FTP_USER%,%FTP_PASSWD% ftp://%FTP_HOST% && lcd %WORK_DIR%
&& cd %FTP_CDIR% && mirror --delete --no-recursion -I 'access_log_*' && exit"
|| ECHO [ERR] FTPでエラーが発生しました >con && GOTO :EOF :mkdircopy FOR %%I in (%WORK_DIR%\access_log_*) DO (     CALL :mkdir_and_copy %%I %%~nI %%~xI ) :final GOTO :EOF :mkdir_and_copy     setlocal     SET INPUT=%1     SET FILENAME=%2     SET EXT=%3     SET YYYY=%FILENAME:~11,4%     SET MM=%FILENAME:~15,2%     SET OUTPUT=%YYYY%\%MM%\%FILENAME%     IF NOT EXIST %YYYY%\%MM% mkdir %YYYY%\%MM%     IF NOT EXIST %OUTPUT% (         IF "%EXT%" == ".gz" (             gzip -d %INPUT% -c > %OUTPUT%         ) ELSE (             copy %INPUT% %OUTPUT% >nul         )     )     endlocal     GOTO :EOF REM [EOF]

(4) log_sync.cmdの設定

利用者に合わせて環境変数を設定します。なお“「」”は引用符です。設定値に含めてはいけません。

  • FTP_HOST ― ホスト名。例:「username.sakura.ne.jp」
  • FTP_USER ― ユーザ名。例:「username」
  • FTP_PASSWD ― パスワード
  • FTP_CDIR ― リモートホストのログファイルの場所。例:「/home/username/log」
  • LOCALDIR ― ローカルホストのログファイルの場所。例:「C:\log\username」
  • PATH ― lftp.exeならびにgzip.exeのある場所。既存のPATH値の末尾に追加するために,変数の値は「%PATH%;C:\cygwin\bin」のような記述をする。すでにパスが通っている場合は設定しなくても動きます

試しに実行してみる

「コマンドプロンプト」を起動し,log_sync.cmdを実行します。エクスプローラから実行することもできますが,スクリプトが終了するとウィンドウが閉じてしまいます。エラーが出た場合に,エラーメッセージを読めなくなってしまいます。

初回実行のときは,スクリプトが完了するまで時間が掛かるかもしれません。2回目以降の実行は,わりと短時間で終わるはずです。このスクリプトはリモートとローカルのフォルダをミラーリングします。ミラーリングは差分を取っており,初回実行では完全なミラーリングをします。

タスクの登録

定期実行させるために,新しいタスクを作成します。タスクを作成するには,「コントロールパネル」→「タスク」→「スケジュールされたタスクの追加」をします。ウィザードが開始されるので,ダイアログの指示に従ってスクリプトを登録します。

「さくらインターネット」の場合,ログファイルは午前4時から午前5時の間に生成されることが多いようです(いつ生成されるかは,利用者によって違います)。この例では毎朝6時にタスクを実行することにしました。タスクを実行するアカウントはadministratorにしました。

タスク スケジュール

<画像の説明>タスクの設定例。

補足説明

  • タスクが実行されなかった場合 ― log_sync.cmdを手動で実行してください。例のとおりに設定した場合,早朝にコンピュータの電源を入れておかないとタスクは実行されません。この場合,ログファイルはダウンロードされません
  • log_sync.cmdにFTPパスワードが直書きされている問題 ― 気になる方はlog_sync.cmdに適切なアクセス権を設定し,ファイルの中身が覗かれないように処置してください
  • タスクの実行アカウント ― 例ではadministrator権限でタスクを実行させています。会社や学校などで使う場合は,タスクを実行するための専用ユーザを作ってタスクを実行させた方がよいでしょう。万一,事故が起きた場合に被害を最小限に食い止めるためです。複数人がホストを管理している(できる)場合は,だれがいつ,どんな変更をするか分かったものではありません
  • ファイル圧縮 ― ログファイルを圧縮しておきたいと思った人がいるかもしれません。NTFSのファイル・フォルダの圧縮機能を使うのが簡単で良いと思います
  • _tempというフォルダ ― スクリプトを実行すると,ローカルホストのログファイルフォルダの直下に_tempというフォルダが自動作成されます。ミラーリングのための一時フォルダですので,不要な場合は削除しても問題ありません