- 관련 프로그램 설치
"datadog/dd-trace": "^0.56.0"
pecl install datadog_trace
valet restart
- 관련 파일 생성
로그레벨은 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;
}
}
<?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;
});
}
}
- 관련 환경 파일 설정 변경
'default' => env('LOG_CHANNEL', 'datadog'),
,'channels' => [
'datadog' => [
'driver' => 'custom',
'via' => App\Extensions\Loggers\DatadogLogger::class
],
others...
]
/*
|--------------------------------------------------------------------------
| Log Channel
|--------------------------------------------------------------------------
|
| laravel error log channel
|
*/
'log_channel' => env('LOG_CHANNEL', 'datadog'),
LOG_CHANNEL=datadog