【问题标题】:How do I create a Laravel Logger that logs to a specific Elasticsearch Index?如何创建一个记录到特定 Elasticsearch 索引的 Laravel Logger?
【发布时间】:2020-05-06 23:10:14
【问题描述】:

我的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 的内容是什么。我已经搜遍了网,结果一无所获。

有什么想法吗?

【问题讨论】:

    标签: elasticsearch logging logstash laravel-6


    【解决方案1】:

    tldr;我最终使用了 Logstash 多管道。每个管道都指定自己的配置文件。在每个配置文件中,我使用了不同的端口和不同的默认索引。这让我可以在 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 文件中输入的完整列表是here

    1. 在每个配置文件中添加管道的完整配置:
    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

    1. 为 Laravel 中的每个管道创建新通道:
    config/logging.php
    ==================
    
    'index-name-1-channel' => [
                'driver' => 'custom',
                'via'    => LogstashIndexName1Logger::class,
                'host'   => env('LOGSTASH_HOST'),
                'port'   => env('LOGSTASH_INDX-NM-1_PORT'),
            ],
    
    1. 制作记录器类:
    <?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')-&gt;debug('What happened?!');

    我现在可以使用字段(甚至标签)编写单个功能的本地 kibana 查询。如果您对更好的实施有任何建议或提示,请随时发表评论

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2018-04-04
      • 2016-08-20
      相关资源
      最近更新 更多