Как отправить событие Log из Laravel в Loggly?
Я хочу отправлять журналы Monolog из моего приложения Laravel 5.1 в онлайн-сервис управления журналами Loggly.com. Из всех возможных сред, в том числе местного развития.
5 ответов
Я нашел несколько устаревших библиотек и сложные способы сделать это. Так что я получил очень простое решение. На самом деле, у Laravel Monolog Handler уже есть Loggly Handler из коробки.
Добавьте информацию о конфигурации в config/services.php:
'loggly' => array(
'key' => 'ENTER_YOUR_LOGGLY_TOKEN_HERE',
'tag' => 'ProjectName_' .strtolower(env('APP_ENV')),
),
Затем добавьте обработчик Monolog в bootstrap/app.php перед возвратом $app:
/*
|--------------------------------------------------------------------------
| Setup Loggly Handler
|--------------------------------------------------------------------------
*/
$app->configureMonologUsing(function($monolog) {
$handler = new \Monolog\Handler\LogglyHandler(config('services.loggly.key'),\Monolog\Logger::DEBUG);
$handler->setTag(config('services.loggly.tag'));
$monolog->pushHandler($handler);
});
Вуаля! Вы получаете ваши Monolog Logs в панели инструментов Loggly.
ОБНОВЛЕНИЕ: (спасибо @thitami)
Основано на laravel.com/docs/5.6/upgrade
Метод configureMonologUsing Если вы использовали метод configureMonologUsing для настройки экземпляра Monolog для вашего приложения, теперь вы должны создать собственный канал журнала. Для получения дополнительной информации о том, как создавать собственные каналы, ознакомьтесь с полной документацией по ведению журнала.
Мой работает с небольшой конфигурацией с Laravel 8 .
Просто используйте встроенный обработчик монолога для Loggly.
Отредактируйте ваше приложение/config/logging.php
use Monolog\Handler\LogglyHandler;
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single', 'loggly'],
'ignore_exceptions' => false,
],
'loggly' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => LogglyHandler::class,
'with' => [
'token' => env('LOGGLY_TOKEN'),
],
],
]
Для более продвинутого ведения журнала (в моем случае мне нужно установить тег, так как он отсутствовал в конструкторе встроенного обработчика.
Скопируйте встроенный обработчик из папки поставщика (например , vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php ) в выбранную вами папку приложения (например , app/Logging/CustomLogglyHandler.php ) . .
Измените конструктор, чтобы установить теги, и вам нужно изменить некоторые импорты, поскольку мы находимся в разных пространствах имен.
// app/Logging/CustomLogglyHandler.php
namespace App\Logging;
use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Handler\MissingExtensionException;
use Monolog\Logger;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\LogglyFormatter;
use function array_key_exists;
use CurlHandle;
use Monolog\Handler\Curl\Util as CurlUtil;
public function __construct(string $token, array|string $tag = [], $level = Logger::DEBUG, bool $bubble = true)
{
if (!extension_loaded('curl')) {
throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler');
}
$this->token = $token;
if (is_array($tag)) {
$this->tag = $tag;
} else {
$this->tag = [$tag];
}
parent::__construct($level, $bubble);
}
// config/logging.php
'loggly' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => CustomLogglyHandler::class,
'with' => [
'token' => env('LOGGLY_TOKEN'),
'tag' => strtolower(env('APP_NAME', 'Laravel')) . '_' . strtolower(env('APP_ENV', 'production'))
],
],
Я смог справиться с поведением локального журнала по умолчанию Laravel и одновременно Mladen Janjetovic, немного Mladen Janjetovic код Mladen Janjetovic. Проверено на Laravel 5.3
конфиг /services.php:
'loggly' => [
'key' => 'ENTER_YOUR_LOGGLY_TOKEN_HERE',
'tag' => 'ProjectName_' .strtolower(env('APP_ENV')),
],
самонастройки /app.php:
/*
|--------------------------------------------------------------------------
| Push to Loggly, and save locally.
|--------------------------------------------------------------------------
*/
$app->configureMonologUsing(function($monolog) use ($app) {
$log = $app->make(Illuminate\Log\Writer::class);
$logglyHandler = new \Monolog\Handler\LogglyHandler(config('services.loggly.key'));
$logglyHandler->setTag(config('services.loggly.tag'));
if (config('app.env') == 'production')
{
// Push to Loggly and save local if in production
$log->getMonolog()->pushHandler($logglyHandler);
$log->useFiles(storage_path('/logs/laravel.log'));
}
else
{
// Otherwise, save only locally
$log->useFiles(storage_path('/logs/laravel.log'));
}
});
Кроме того, вы можете использовать Monolog-Cascade для этого.
Monolog-Cascade - это расширение Monolog, которое позволяет вам устанавливать и настраивать несколько регистраторов и обработчиков из одного файла конфигурации.
Вот пример файла конфигурации для Monolog-Cascade с использованием Loggly. Это будет входить в систему вам stdOut и Loggly:
---
handlers:
console:
class: Monolog\Handler\StreamHandler
level: DEBUG
stream: php://stdout
error_loggly_handler:
class: Monolog\Handler\LogglyHandler
level: ERROR
token: xxxx-xxxx-xxxxxxxx
tags: [cascade, waterfall]
loggers:
my_logger:
handlers: [console, error_loggly_handler]
Если вам интересно, вот сообщение в блоге на Cascade => https://medium.com/orchard-technology/enhancing-monolog-699efff1051d
[Отказ от ответственности]: Я основной вкладчик Monolog-Cascade.
Чтобы расширить вклад Хасана (публикация в качестве ответа, так как у меня все еще не хватает репутации, чтобы оставлять комментарии).
Если вам нужно использовать ежедневные журналы локально, вы можете использовать следующий код:
$logFile = 'laravel'.'.txt';
$log->useDailyFiles(storage_path().'/logs/'.$logFile);
Конечно, имя лог файла абсолютно произвольно. В этом примере формат будет таким:
laravel-YYYY-MM-DD.txt
Редактировать: с обновлением до 5.4 эта строка больше не работает:
$log = $app->make(Illuminate\Log\Writer::class);
В качестве обходного пути вы можете создать экземпляр Writer вручную, добавив $monolog, доступный из configureMonologUsing
закрытие:
$log = new Illuminate\Log\Writer($monolog);