tldr; В итоге я использовал Logsta sh Multiple Pipelines. Каждый конвейер определяет свой собственный файл конфигурации. В каждом файле конфигурации я использовал другой порт и другой индекс по умолчанию. Это позволило мне указать разные регистраторы в Laravel
- Определить
path.settings
расположение папки - Поместить
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?!');
И теперь я могу писать запросы кибаны, которые являются локальными для одного функция с использованием полей (или даже тегов). Если есть какие-либо предложения или советы, которые вы можете знать для лучшей реализации, не стесняйтесь комментировать