Я придерживался того, что я считаю правильной настройкой Loggly в качестве канала Monolog с Laravel 5.6, но я продолжаю получать строки текста вместо json-записей с возможностью поиска. Например:
[2018-07-27 14:50:20] local.INFO: массив (
‘foo’ => ‘bar’,
)
Это из свойства unparsed записи Loggly. Не действительный JSON на любом участке!
Вот некоторые соответствующие фрагменты кода, чтобы показать, как настроен канал loggly и как я запускаю запись в журнале.
конфиг / logging.php:
'loggly' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\LogglyHandler::class,
'with' => [
'token' => env('LOGGLY_KEY'),
'tag' => str_replace(' ', '_', env('APP_NAME') . '_' . env('APP_ENV')),
]
]
маршруты:
Route::get('/', function(){
Log::info(['foo' => 'bar']);
return view('welcome');
});
из composer.json:
"laravel/framework": "5.6.21",
"monolog/monolog": "^1.23",
Я подумал, что, возможно, может помочь обновление до более новой версии монолога, но я столкнулся с этим при попытке обновить монолог через композитор:
Ваши требования не могут быть разрешены для устанавливаемого набора пакетов.
Проблема 1
- laravel / framework v5.6.21 требует монолог / монолог ~ 1.12 -> выполнимый монологом / монологом [1.x-dev].
- laravel / framework v5.6.21 требует монолог / монолог ~ 1.12 -> выполнимый монологом / монологом [1.x-dev].
- laravel / framework v5.6.21 требует монолог / монолог ~ 1.12 -> выполнимый монологом / монологом [1.x-dev].
- Можно установить только одно из: monolog / monolog [2.x-dev, 1.x-dev].
- Запрос на установку монолога / монолога ^ 2.0 -> выполняется монологом / монологом [2.x-dev].
- Запрос на установку laravel / framework 5.6.21 -> удовлетворяется laravel / framework [v5.6.21].
Что мне не хватает? Разве Монолог не должен отправлять мой вывод журнала как json в Loggly? Глядя на LogglyHandler, он использует LogglyFormatter, который расширяет JsonFormatter. Это кажется разумным, но в итоге получается строка. Что дает?
Явно укажите formatter
, Это может быть одно из следующих:
'formatter' => Monolog\Formatter\JsonFormatter::class,
ИЛИ ЖЕ
'formatter' => 'default',
Итак, ваш новый loggly
определение канала будет выглядеть примерно так:
'loggly' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\LogglyHandler::class,
'formatter' => Monolog\Formatter\JsonFormatter::class,
'with' => [
'token' => env('LOGGLY_KEY'),
'tag' => str_replace(' ', '_', env('APP_NAME') . '_' . env('APP_ENV')),
]
]
После глубокого изучения монолога и JSON Formatter исправление оказалось очень простым. Первый параметр — это текстовое значение, а второй Параметр может содержать ассоциативный массив, который переводится в json и доступен для поиска в Loggly.
Log::info('Home Page Loaded',['foo' => 'bar']);