elasticsearch - 如何创建一个记录到特定 Elasticsearch 索引的 Laravel Logger?

标签 elasticsearch logging logstash laravel-6

我的 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,请确保添加您需要配置的端口或撰写文件/yml
  • 在 Laravel 中为每个管道创建新 channel :
  • 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]);
        }
    
    }
    

    我可以成功登录 channel :Log::channel('index-name-1-channel')->debug('What happened?!');
    我现在可以使用字段(甚至标签)编写单个功能本地的 kibana 查询。如果您对更好的实现有任何建议或提示,请随时发表评论

    关于elasticsearch - 如何创建一个记录到特定 Elasticsearch 索引的 Laravel Logger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61647018/

    相关文章:

    javascript - 向 bunyan 实例添加自定义级别

    Elasticsearch 不接受数据

    mysql - Logstash 无法连接到 MySQL 数据库

    elasticsearch - Elasticsearch-使用n-gram搜索通配符

    elasticsearch - LogStash错误:无法在1:708的START_OBJECT上获取文本

    elasticsearch - 如何使用FileBeat将管道分隔格式的日志数据以JSON格式发送到Elasticsearch?

    elasticsearch - 如何获取ElasticSearch输出?

    elasticsearch - elasticsearch 父项是否必须在其子项之前存在?

    java - 日志记录级别未从属性文件加载

    asp.net - 如何在成员(member) asp.net 2008 中获取当前用户名