Как отправить событие 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);
Другие вопросы по тегам