0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PHP】Log出力 in GKE

Posted at

GKEでログ出力をしようとしてはまったのでメモを残しておく。
なお、標準出力ではなく、ログエクスプローラでの閲覧を前提としています。

構成

k8s on gke
nginx → php(php7.4.3)

実装

前段階:Monologで標準出力

*こちらの方法は問題がありましたので前段階とします。

use Monolog\Formatter\LineFormatter;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;

// --- 省略

        $logger = new Logger($name);
        $formatter = new LineFormatter(null, null, true, true);

        $sh = new StreamHandler('php://stdout', Logger::DEBUG);
        $sh->setFormatter($formatter);
        $logger->pushHandler($sh);

        $sh = new StreamHandler('php://stderr', Logger::ERROR);
        $sh->setFormatter($formatter);
        $logger->pushHandler($sh);

        $logger->debug('なんか内容');

// --- 省略

こちらの方法では、ログ出力はできたものの、すべてのログが severity:ERROR になってしまった。本来infoのログもERRORででるので、もはや訳が分からない状態。

{
textPayload: "なんか内容"
insertId: "省略"
resource: {
type: "k8s_container"
labels: {6}
  # pod名とか入ってる
}
timestamp: "省略"
severity: "ERROR"
labels: {3}
logName: "projects/${PROJECT_id}/logs/stderr"
receiveTimestamp: "省略"
}

標準ライブラリ使用

上記の方法では適切に表示ができなかったので調べたところ、ログのformatをがっちがちに設定するか、標準ライブラリを使えとのこと。
今回は後者の方法でやってみることとした。

use Google\Cloud\Logging\LoggingClient;
use Google\Cloud\Logging\PsrLogger;

// --- 省略
  $name = 'test';
  $logger = LoggingClient::psrBatchLogger($name);
  
  $logger->info('なんか内容'); 
// --- 省略

なんやこれ、くっそかんたんやんけ、と思ったのものの、ロギングに出ない。
ちなみにログエクスプローラ上では以下のクエリで検索をかけていた。

resource.type="k8s_container"
resource.labels.namespace_name="namespace_name"
resource.labels.cluster_name="cluster_name"
resource.labels.container_name="container_name"

よくよく調べてみたところ、psrBatchLoggerは名前だけ指定すると、resource.type="global"
に設定されるようだった。

クラウドコンソール上で以下のコマンドを試すと目的のログがいた。

gcloud beta logging logs list

--- 省略
projects/${PROJECT_ID}/logs/test
--- 省略

gcloud beta logging read projects/<PROJECT>/logs/<LOG_NAME>
こちらで内容を確認すると

insertId: "省略"  
 jsonPayload: {}  # 内容入ってる
 logName: "projects/${PROJECT_ID}/logs/test"  
 receiveTimestamp: "省略"  
 resource: {
  labels: {
   project_id: ${PROJECT_ID}    
  }
  type: "global"   
 }
 severity: "INFO"  
 timestamp: 省略  
}

severity:INFOになっているものの、typeがglobalなのはちょといただけない。

設定をきちんとしてみる

use Google\Cloud\Logging\LoggingClient;
use Google\Cloud\Logging\PsrLogger;

// --- 省略
        $logger = LoggingClient::psrBatchLogger(
            $name,
            [
                'resource' => [
                    'type' => 'k8s_container',
                    'labels' => [
                        'project_id' => ${PROJECT_ID},
                        'cluster_name' => ${CLUSTER_NAME},
                        'container_name' => ${CONTAINER_NAME},
                        'namespace_name' => ${NAMESPACE_NAME}
                    ]
                ]
            ]
        );

        $logger->info('なんか内容');
// ---省略

こちらの設定方法でログエクスプローラに以下のクエリを指定したところ

resource.type="k8s_container"
resource.labels.namespace_name="namespace_name"
resource.labels.cluster_name="cluster_name"
resource.labels.container_name="container_name"

以下のログが出力できた。

{
insertId: "省略"
jsonPayload: {
message: "なんか内容"
}
resource: {
type: "k8s_container"
labels: {
namespace_name: "namespace_name"
container_name: "conteainer_name"
project_id: "${PROJECT_ID}"
pod_name: ""
location: ""
cluster_name: "cluster_name"
}
}
timestamp: "省略"
severity: "INFO"
logName: "projects/${PROJECT_ID}/logs/name"
receiveTimestamp: "省略"
}

と狙い通りに出力することができた。

*標準出力に出していた際には、pod_nameやlocationなども自動で入力されていたが、今回は不要と判断し、設定していない。
*logNameに / をもちいて階層化を狙ったが、そうすると全く出力されなくなってしまった
. で区切るのが今のところベターと思われる。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?