GCP(GCE)에서 Laravel 로그를 StackDriver로 출력

GCP에서 Laravel 로그를 StackDriver로 출력하려면



TL;DR


  • monolog-stackdriver를 사용하여 Laravel 로그를 stackDriver에서 볼 수 있습니다.
  • env 파일의 설정에서 로그의 출력 대상을 통상 로그 or StackDriver의 전환 가능
  • 인턴스를 설정하지 않으면 StackDriver의 글로벌 범주로 출력됩니다.
  • GCE의 instance_id

    로그 전송 절차



    composer로 패키지 도입



    이 패키지를 사용합니다.
    htps : // Pac cross st. 오 rg / pac 게이 s / 코데 니 r

    라이브러리 배포 명령
    composer require codeinternetapplications/monolog-stackdriver
    

    로그 대상을 설정하려면



    1.ENV 파일 설정

    2.config/logging.php 설정

    config/logging.php는 StackDriver의 표시 대상에서 설정량이 다릅니다.
  • 글로벌 -> 공통 설정을 수행하는 것
  • 인스턴스 이름 단위 (이번에는 GCE) -> 인스턴스 이름 만 설정
  • 인스턴스 (머신) 단위 -> 인스턴트 ID도 설정

  • ENV 파일 설정



    로그를 보려는 레벨에 맞게 env를 나열합니다.

    env
    # 必須
    LOG_CHANNEL=stackdriver
    
    # インスタンス名別のログ保存する場合
    GCP_LOG_RESOURCE_NAME=hoge_resource
    
    # インスタンス(マシーン)単位のログ保存する場合
    GCP_LOG_INSTANCE_ID=hoge_xxxxxx
    GCP_LOG_PROJECT_ID=hoge_id
    GCP_LOG_ZONE=hoge_zone
    
    hoge_ 의 값을 적절한 값으로 변경하십시오.

    config/logging.php 설정



    글로벌로 표시되도록 설정하는 경우



    config/logging.php
    
    'channels' => [
    
        // ( ... )
    
        'stackdriver' => [
            'driver' => 'custom',
            'via' => CodeInternetApplications\MonologStackdriver\Laravel\CreateStackdriverLogger::class,
            'logName' => env('APP_NAME', 'my-project-log'),
    
            //GCP内部からの保存には必要ない
            // 'loggingClientOptions' => [
                // 'keyFilePath' => '/path/to/service-account-key-file.json',
            // ],
    
            // 'loggerOptions' => [],
            // 'lineFormat' => '%message%',
            // 'entryOptionsWrapper' => 'stackdriver',
        ],
    ]
    
    logName 항목은 적절한 이름을 붙여 주세요
    loggingClientOptions 항목에서 json 키 파일을 지정하지만 GCP 내부에서 로그를 보내는 데 json이 필요하지 않습니다.
    다른 클라우드(예: AWS)에서 전송할 때 지정합니다.

    로그 표시 예

    아래에서 설명하는 항목으로 로그 보내기


    좋은 점
    - 설정이 간단
    - 많은 경우에 적용 가능
    - 여러 인스턴스 프로그램에서 로그를 집계할 수 있습니다.

    나쁜 점
    - 복수의 머신으로부터의 로그를 식별하는 궁리가 별도 필요
    - 오류 조사 시 전역과 머신 로그를 왕복하여 비교해야 함

    인스턴스 이름별로 표시되도록 설정하는 경우



    config/logging.php
    
    'channels' => [
    
        // ( ... )
    
        'stackdriver' => [
            'driver' => 'custom',
            'via' => CodeInternetApplications\MonologStackdriver\Laravel\CreateStackdriverLogger::class,
            'logName' => env('APP_NAME', 'my-project-log'),
    
            'loggerOptions' => [
                  'labels' => [
                      'compute.googleapis.com/resource_name' => env('GCP_LOG_RESOURCE_NAME', 'dev-web-instance'),
                  ],
                  'resource' => [
                      'type' => 'gce_instance',
                  ],
            ]
    
            //GCP内部からの保存には必要ない
            // 'loggingClientOptions' => [
                // 'keyFilePath' => '/path/to/service-account-key-file.json',
            // ],
    
            // 'loggerOptions' => [],
            // 'lineFormat' => '%message%',
            // 'entryOptionsWrapper' => 'stackdriver',
        ],
    ]
    

    전역 설정에 loggerOptions를 추가하고 있습니다.
    여기에서는 GCE의 로그이므로 인스턴트에 GCE를 지정하고 있습니다.
    지정하고 싶은 부분의 로그에서 실제로 지정된 항목을 설정 파일에 복사하면 그 위치에 들어가게 됩니다.

    로그 표시 예

    아래에서 설명하는 항목으로 로그 보내기


    좋은 점
    - 서버와 같은 카테고리이므로 시간축에 따른 파악이 가능
    - 머신을 그룹화하지 않으면 머신 이름과 로그가 일치합니다.
    - 오토스케일 머신에서도 그룹에 집약되는 형태로 취득 가능

    나쁜 점
    - 머신의 식별은 할 수 없다
    - instance_id가 비어 있어도 표시할 수 있지만, 정상적인 로그 사양으로 문제가 없는지 불명

    인스턴스(머신) 단위로 표시되도록 설정하는 경우



    config/logging.php
    
    'channels' => [
    
        // ( ... )
    
        'stackdriver' => [
            'driver' => 'custom',
            'via' => CodeInternetApplications\MonologStackdriver\Laravel\CreateStackdriverLogger::class,
            'logName' => env('APP_NAME', 'my-project-log'),
    
            'loggerOptions' => [
                  'labels' => [
                      'compute.googleapis.com/resource_name' => env('GCP_LOG_RESOURCE_NAME', 'dev-web-instance'),
                  ],
                  'resource' => [
                        'type' => 'gce_instance',
                        'labels' => [
                            'instance_id' =>  env('GCP_LOG_INSTANCE_ID'),
                            'project_id' =>  env('GCP_LOG_PROJECT_ID'),
                            'zone' =>  env('GCP_LOG_ZONE'),
                        ]
                    ],
            ]
    
            //GCP内部からの保存には必要ない
            // 'loggingClientOptions' => [
                // 'keyFilePath' => '/path/to/service-account-key-file.json',
            // ],
    
            // 'loggerOptions' => [],
            // 'lineFormat' => '%message%',
            // 'entryOptionsWrapper' => 'stackdriver',
        ],
    ]
    

    인스턴스 이름별 설정에 loggerOptions.resource.labels를 추가했습니다.

    instance_id는 Compute Engine의 상세 페이지입니다.


    project_id는 TOP 페이지에 나와 있습니다.

    로그 표시 예

    (생략)

    좋은 점
    - 서버 정보와 같은 위치에 저장되므로 시간축을 따라 파악하기 쉽습니다.
    - 머신의 식별도 가능
    나쁜 점
    - 오토스케일로 id가 바뀌는 경우의 대응을 생각할 필요가 있다

    로그 전송



    Laravel의 표준 코드로 전송이 가능

    로그 전송 코드 예
    
    //infoレベルログ
    Log::info('InfoLogInfoTest', ['logItem1' => 'メッセージはあとから分かりやすいものを', 'logItem2' => ['ItemSub1' => '配列形式で自由にデータを入れられる', 'ItemSub2' => '入れ子も問題なし'] ]);
    
    // errorレベルログ
    Log::error('InfoLogErrorTest', ['logItem1' => 'エラーもStackDriverで正しく識別', 'logItem2' => ['ItemSub1' => '配列形式で自由にデータを入れられる', 'ItemSub2' => '入れ子も問題なし'] ]);
    

    첫 번째 인수는 message에 저장됩니다.
    두 번째 인수는 jsonPayload에 저장됩니다.


    StackDriver에 로그 레벨도 인식되어 있으므로 Error

    이상입니다.

    좋은 웹페이지 즐겨찾기