Auto Scalingで起動しているEC2インスタンスは、自動的にターミネートするので、ログはEC2インスタンスではなく、他の場所に出力する必要があります。

出力場所はSimpleDBに出力し、ログのフォーマットをSyslogのようにして、Syslogラッパーにもつなげたいと考えています。

尚、Syslogのフォーマットは、

timestamp, facility, priority, tag, message

上記のように、さらにインスタンスIDも出力するようにしています。

だいぶ肥大化してしまいましたが、いつもの共通部分です。
EC2起動時に設定できるUser DataをPHPで利用するで紹介したやり方を応用してインスタンスIDを取得し、定義したログ出力用の関数(logger)を、SmpleDBに出力するようにしています。

▼ common.php

define("AWS_KEY"              , "AAAAAAAA");
define("AWS_SECRET_KEY"       , "SSSSSSSS");
define("CP_SQS_URL_CRAWL"     , "https://sqs.ap-northeast-1.amazonaws.com/00000000/crawl");
define("CP_AS_NAME"           , "crawl");
define("CP_SDB_DOMAIN_MESSAGE", "message");
define("CP_SDB_DOMAIN_LOG"    , "log");
date_default_timezone_set("Asia/Tokyo");

// インスタンスIDを取得
$curl = curl_init("http://169.254.169.254/1.0/meta-data/instance-id");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
define("CP_EC2_INSTANCE", curl_exec($curl));
curl_close($curl);

// ログ出力関数
function logger($sdb, $facility, $priority, $tag, $message) {
    $time = time();
    $response = $sdb->put_attributes(CP_SDB_DOMAIN_LOG, CP_EC2_INSTANCE . "-" . $time . "-" . rand(), array(
        "instance"  => CP_EC2_INSTANCE,
        "timestamp" => $time,
        "facility"  => $facility,
        "priority"  => $priority,
        "tag"       => $tag,
        "message"   => $message
    ));
}

実際のログの出力と表示のコードは、下記のようになります。

▼ put-and-get-log

require_once("/opt/cloudpack/bin/common.php");
require_once("/opt/aws/php/sdk.class.php");
$sdb = new AmazonSDB();
$sdb->set_region(AmazonSDB::REGION_APAC_NE1);

// ログの出力
logger($sdb, "facility", "priority", "tag", "message");

// ログを取得するクエリー
$query = select($query);
$items = $response->body->SelectResult->Item;
foreach($items as $item) {
    foreach($item->Attribute as $attribute) {
        switch($attribute->Name) {
            case "instance":
                $instance  = $attribute->Value;
                break;
            case "timestamp":
                $timestamp = date("c", intval($attribute->Value));
                break;
            case "facility":
                $facility  = $attribute->Value;
                break;
            case "priority":
                $priority  = $attribute->Value;
                break;
            case "tag":
                $tag       = $attribute->Value;
                break;
            case "message":
                $message   = $attribute->Value;
                break;
        }
    }
    print("$instance $timestamp $facility $priority $tag $messagen");
}

実行すると、下記のようになります。

# ./put-and-get-log
i-f4ed9ff5 2011-06-28T21:53:51+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:13+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:11+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:09+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:07+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:04+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:00+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:25:59+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:25:57+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:25:56+09:00 facility priority tag message

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら