AWS&PHPからGCP Stackdriver Logging にlogを書き込んでみる


前提

AWSインスタンスすでにある
ここのチュートリアルを基本に進める

AWSアカウントをStackdriver Monitoring に接続する。

ここを参考に

承認認証情報を作成する

ここを参考に

ログ エージェントをインストールする

AWSにて以下のコマンドをタターン!

curl -sSO https://dl.google.com/cloudagents/install-logging-agent.sh
sha256sum install-logging-agent.sh

チェックサムコマンド(ファイルの同一性を確認するための数値)の出力結果
07ca6e522885b9696013aaddde48bf2675429e57081c70080a9a1364a411b395 install-logging-agent.sh

インストールスクリプト実行
sudo bash install-logging-agent.sh

ログエージェントとは?

ログエージェントは fluentd をベースとしており、Google Compute Engine や Amazon EC2 の仮想マシン(VM)インスタンス上で実行されます。このエージェントは、一般的なサードパーティのアプリケーションやシステム ソフトウェアから Stackdriver Logging にログをストリーミングします。ログ エージェントをすべての VM インスタンスにインストールすることをおすすめします。

logに書き込んでみる

AWSのコマンドラインで
logger "hello my first log"

↓書き込まれている!

PHPで挑戦してみる

Google API を使えるようにする

API Manager-> StackdriverLogging API->認証情報

Google-Cloud-PHPのAPI仕様はここから

<コンポーザをインストル>
curl -sS https://getcomposer.org/installer | php

composer.jsonに以下を書き込む

sample.json
    "require": {
        "monolog/monolog": "1.2.*"
    }

php composer.phar install
composer require google/cloud

こんなエラーがでてきたら
Installation failed, reverting ./composer.json to its original content.
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

↓これで解決
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024

pecl install grpc
composer require google/gax && composer require google/proto-client-php
sudo mv ~/composer.phar /usr/local/bin/composer

記述方法

sample.php
<?php
require 'vendor/autoload.php';

use Google\Cloud\Logging\LoggingClient;

$logging = new LoggingClient([

    'keyFilePath' => '/etc/google/auth/application_default_credentials.json',//←各々のkeyfilePathを設定
    'projectId' => 'XXXXXXX'//←各々のprojectIdを設定
]);


// Get a logger instance.
$logger = $logging->logger('syslog');//←logのインスタンスを生成

// Write a log entry.
$logger->write('my message from php ');//←出力メッセージを記載

//↓ここからはログを取得してコンソールに表示する↓
// List log entries from a specific log.
$entries = $logging->entries([
    'filter' => 'logName = projects/hoge/logs/syslog'//←表示したいログのパスを記載
]);

foreach ($entries as $entry) {
    echo $entry->info()['textPayload'] . "\n";//←ループでログを出力
}

もちろんログビューアからもログは見れます。

<ログビューアからなら高度な検索を指定できる>
例)
resource.type="aws_ec2_instance"
"Jan 25" AND ("pid 29718" OR "pid 29629")

LoggingClientの詳しい仕様は↓

その他

"Project Name" と "Project ID"の違いは?
Project Name は、ユーザが任意でつけれるものです。
一方 Project ID グーグルクラウドクライアントライブラリに認証接続するために必要になります。