我的 config/logging.php
中有一个 logstash 记录器连接到我的 logstash 实例的文件:
'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]);
}
}
我正在开发的应用程序是按功能命名的,客户希望 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
的内容是什么将会。我搜遍了网,结果空空如也。有任何想法吗?
最佳答案
tldr;我最终使用了 Logstash 多管道。每个管道都指定自己的配置文件。在每个配置文件中,我使用了不同的端口和不同的默认索引。这允许我在 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 文件中输入的完整列表是 here
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,请确保添加您需要配置的端口或撰写文件/ymlconfig/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]);
}
}
我可以成功登录 channel :
Log::channel('index-name-1-channel')->debug('What happened?!');
我现在可以使用字段(甚至标签)编写单个功能本地的 kibana 查询。如果您对更好的实现有任何建议或提示,请随时发表评论
关于elasticsearch - 如何创建一个记录到特定 Elasticsearch 索引的 Laravel Logger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61647018/