2016-04-12 5 views
2

Я пытаюсь начать отправку своих журналов в эластичный поиск с использованием монолога. (Я использую Symfony2).Имея проблемы с отображением при попытке сохранить журналы монолога в Elasticsearch, используйте ElasticsearchHandler

Я настроил монолога как это:

monolog: 
    handlers: 
     elasticsearch: 
      elasticsearch: 
       host: %logger_elastic_host% 
       port: %logger_elastic_port% 
      type: elasticsearch 
      level: info 

Он работал всего несколько минут, пока он не порвал с этим сообщения об ошибках (фатальная ошибка, я удалил бесполезные вещи):

создать :/monolog/logs/AVQKYsGRPmEhlo7mDfrN вызвано MapperParsingException [не удалось проанализировать [context.stack.args]]; inested: ElasticsearchIllegalArgumentException [неизвестно свойство [класс]];

Я искал с моим коллегой, как это исправить. То, что мы обнаружили, это:

  • Упругие поиск получить первые журналы и автоматически построить отображение
  • Мы посылаем новые журналы с другим отображением или немного отличается от того, что было направлено раньше, и она ломается.
  • В этом случае он разбивается здесь: context.stack.args.

Проблема в том, что контекст всегда будет отличаться.

То, что мы хотели бы это:

  1. кто-нибудь там с помощью монолога, чтобы войти в Elasticsearch

  2. Как вы, ребята, удается избежать этой проблемы. (Как мы можем избежать этого)?

спасибо, ребята.

+0

У меня такая же проблема, как и вы. Вам удалось это исправить? Буду признателен :) – viscat

+0

Мы это исправим, я покинул компанию с тех пор. Я пытаюсь связаться с парнем, который воспользовался исправлением. –

+0

Вам удалось связаться с парнем? : D –

ответ

0

Это происходит потому, что ES создает отображение из первого документа. Если какой-либо документ, который вставлен после, имеет одно и то же свойство, но с другим типом/форматом, то ES выдает ошибку.

Решение состоит в том, чтобы создать собственный Монолог форматировщик и зарегистрировать его:

config.yml:

elasticsearch: 
    type: elasticsearch 
    elasticsearch: 
     host: elasticsearch 
    ignore_error: true 
    formatter: my_elasticsearch_formatter 

Эта линия будет сделать Монолог \ Handler \ ElasticSearchHandler игнорировать любые другие ошибки из пакета Elastica Ruflin в:

ignore_error: true 

Затем зарегистрировать службу с именем: my_elasticsearch_formatter:

<service id="my_elasticsearch_formatter" class="AppBundle\Services\MyFormatter"> 
     <argument type="string">monolog</argument> 
     <argument type="string">logs</argument> 
    </service> 

Первый аргумент - это имя индекса, вторым аргументом является тип.

А класс форматировщик:

<?php 

namespace AppBundle\Services; 

use function json_encode; 
use Monolog\Formatter\ElasticaFormatter; 
use function var_dump; 

class MyFormatter extends ElasticaFormatter 
{ 
    /** 
    * @param string $index 
    * @param string $type 
    */ 
    public function __construct($index, $type) 
    { 
     parent::__construct($index, $type); 
    } 

    /** 
    * @param array $record 
    * @return array|\Elastica\Document|mixed|string 
    */ 
    public function format(array $record) 
    { 
     $record['context'] = json_encode($record['context']); 

     return parent::format($record); 
    } 
} 

Недостатком этого решения является то, что он будет json_encode контекст. Вы не сможете фильтровать внутренние свойства контекста в ES, но по крайней мере вы не потеряете важную информацию о своих журналах.