Как мне создать Laravel Logger, который будет вести журнал с указанным c индексом Elasticsearch? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть логгер logsta sh в моем config/logging.php файле, который подключается к моему экземпляру logsta sh:

        'logstash' => [
            'driver' => 'custom',
            'via'    => LogstashLogger::class,
            'host'   => env('LOGSTASH_HOST'),
            'port'   => env('LOGSTASH_PORT'),
        ],

Используя L6 и учебник, я создал этот LogstashLogger:

<?php

namespace App\Logger;

use Monolog\Formatter\LogstashFormatter;
use Monolog\Handler\SocketHandler;
use Monolog\Logger;
use Psr\Log\LoggerInterface;

class LogstashLogger
{

    /**
     * @param array $config
     * @return LoggerInterface
     */
    public function __invoke(array $config): LoggerInterface
    {
        $handler = new SocketHandler("udp://{$config['host']}:{$config['port']}");
        $handler->setFormatter(new LogstashFormatter(config('app.name')));

        return new Logger(config('app.env'), [$handler]);
    }

}

Приложение, над которым я работаю, имеет пространство имен по функциям, и клиент хотел бы c журналов с описанием функции в Elasticsearch, где каждая функция передает индекс. Идея состоит в том, чтобы иметь собственные регистраторы для каждого индекса. Примерно так:

        'feature1' => [
            'driver' => 'custom',
            'via'    => LogstashLogger::class,
            'host'   => env('LOGSTASH_HOST'),
            'port'   => env('LOGSTASH_PORT'),

            'index' => feature1-index
        ],

или еще лучше:

        'feature1' => [
            'driver' => 'custom',
            'via'    => Feature1LogstashLogger::class,
            'host'   => env('LOGSTASH_HOST'),
            'port'   => env('LOGSTASH_PORT'),
        ],

Я просто не знаю, каким будет содержимое Feature1LogstashLogger. Я обыскал net и оказался пустым.

Есть идеи?

1 Ответ

0 голосов
/ 07 мая 2020

tldr; В итоге я использовал Logsta sh Multiple Pipelines. Каждый конвейер определяет свой собственный файл конфигурации. В каждом файле конфигурации я использовал другой порт и другой индекс по умолчанию. Это позволило мне указать разные регистраторы в Laravel

  1. Определить path.settings расположение папки
  2. Поместить pipelines.yml файл в это место с содержимым, аналогичным этому:
- pipeline.id: index-name-1
  path.config: "/usr/share/logstash/pipeline/index-name-1.conf"

- pipeline.id: index-name-2
  path.config: "/usr/share/logstash/pipeline/index-name-2.conf"

Полный список того, что можно ввести в файл pipelines.yml: здесь

В каждый из конфигурационных файлов добавьте полную конфигурацию конвейера:
index-name-1.conf
====================

input {
    udp {
        port => 500X
        type => syslog
      }
}

filter {
  json {
    source => "message"
    enable_metric => false
    add_field => { "appFeature" => "Feature1" }
    remove_field => ['@version', 'host']
  }
}

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
        user => "elastic"
        password => "changeme"
        index => "index-name-1-%{+YYYY.MM.dd}"
    }
}

500X может быть 5001, 5002 или любым портом, который вы или ваш системный администратор определили как доступно и бесплатно. Если вы используете docker, обязательно добавьте порты, которые вам нужны в вашей конфигурации, или создайте файл / yml

Создайте новые каналы для каждого конвейера в Laravel:
config/logging.php
==================

'index-name-1-channel' => [
            'driver' => 'custom',
            'via'    => LogstashIndexName1Logger::class,
            'host'   => env('LOGSTASH_HOST'),
            'port'   => env('LOGSTASH_INDX-NM-1_PORT'),
        ],
Сделайте классы регистратора:
<?php

namespace App\Logger;

use Monolog\Formatter\LogstashFormatter;
use Monolog\Handler\SocketHandler;
use Monolog\Logger;
use Psr\Log\LoggerInterface;

class LogstashIndexName1Logger
{

    /**
     * @param array $config
     * @return LoggerInterface
     */
    public function __invoke(array $config): LoggerInterface
    {
        $handler = new SocketHandler("udp://{$config['host']}:{$config['port']}");
        $handler->setFormatter(new LogstashFormatter(config('app.name'), 'IndexName1'));

        return new Logger(config('app.env'), [$handler]);
    }

}

Я могу успешно войти в систему с каналом: Log::channel('index-name-1-channel')->debug('What happened?!');

И теперь я могу писать запросы кибаны, которые являются локальными для одного функция с использованием полей (или даже тегов). Если есть какие-либо предложения или советы, которые вы можете знать для лучшей реализации, не стесняйтесь комментировать

...