라라벨 프로젝트에 datadog 세팅하기

보람·2022년 1월 19일
0

Laravel

목록 보기
1/4
post-thumbnail
  1. 관련 프로그램 설치
  • composer.json 에 추가후 composer update하기
"datadog/dd-trace": "^0.56.0"
  • 로컬에서 작업하는 경우 아래 명령어 터미널에 입력하여 datadog_trace 깔기
pecl install datadog_trace
valet restart
  1. 관련 파일 생성
  • app/Extensions/Loggers/DatadogLogger.php : datadog 로그 초기 환경 설정

웹서버냐 커맨드냐에 따라서 파일 나눠주기

  • 로그레벨은 ERROR : 에러 로그만 쌓이도록

  • 20라인에서 로그채널을 env('LOG_CHANNEL')로 가져오지 않고 config('app.log_channel') 로 부르는 이유는??

서버 배포시 php artisan config:cache 명령어가 실행되는데 위 명령어가 실행되면 초기에 설정파일 외에는 다른 파일에서 ENV() 로 값을 호출할 때 제대로 안불러올 수 있다.

<?php

namespace App\Extensions\Loggers;

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

class DatadogLogger
{
    /**
     * Create a custom Monolog instance.
     *
     * @param  array  $config
     * @return \Monolog\Logger
     */
    public function __invoke(array $config)
    {
        // create a log channel
        $log = new Logger(config('app.log_channel'));

        // create a Json formatter
        $formatter = new JsonFormatter();

        // create a handler
        $path = php_sapi_name() === 'cli' ? storage_path('logs/laravel-cli.log') : storage_path('logs/laravel.log');
        $stream = new StreamHandler($path, Logger::ERROR);
        $stream->setFormatter($formatter);

        // bind
        $log->pushHandler($stream);

        return $log;
    }
}
  • app/Providers/DataDogServiceProvider.php : 로그에 datadog앱에서 검색시 사용가능한 trace_id, span_id 추가하기
<?php

namespace App\Providers;

use App\Models\RegionPath;
use App\Notifications\JobFailedNotification;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Database\Schema\Builder;
use Illuminate\Queue\Events\JobFailed;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\ServiceProvider;
use URL;

/**
 * Class DataDogServiceProvider
 * @package App\Providers
 */
class DataDogServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // Get the Monolog instance
        $monolog = logger()->getLogger();
        if (!$monolog instanceof \Monolog\Logger 
            || config('app.log_channel') !== 'datadog') {
            return;
        }

        // Optional: Use JSON formatting
        $useJson = false;
        foreach ($monolog->getHandlers() as $handler) {
            if (method_exists($handler, 'setFormatter')) {
                $handler->setFormatter(new \Monolog\Formatter\JsonFormatter());
                $useJson = true;
            }
        }

        $monolog->pushProcessor(function ($record) use ($useJson) {
            if ($useJson === true) {
                $record['dd'] = [
                    'trace_id' => \DDTrace\trace_id(),
                    'span_id'  => \dd_trace_peek_span_id(),
                ];
            } else {
                $record['message'] .= sprintf(
                    ' [dd.trace_id=%d dd.span_id=%d]',
                    \DDTrace\trace_id(),
                    \dd_trace_peek_span_id()
                );
            }
            return $record;
        });
    }
}
  1. 관련 환경 파일 설정 변경
  • config/logging.php
'default' => env('LOG_CHANNEL', 'datadog'),
,'channels' => [
    'datadog' => [
                'driver' => 'custom',
                'via' => App\Extensions\Loggers\DatadogLogger::class
            ],
            
            others...
]
  • config/app.php : log_channel 값이 없는경우에만 수정!
/*
|--------------------------------------------------------------------------
| Log Channel
|--------------------------------------------------------------------------
|
| laravel error log channel
|
*/
'log_channel' => env('LOG_CHANNEL', 'datadog'),
  • .env : 로컬에서는 LOG_CHANNEL 을 datadog로 안하고 stack이나 cloudwatch와 같은 원하는 채널로 넣어도 된다.
LOG_CHANNEL=datadog
profile
백엔드 개발자

0개의 댓글