首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在尝试将monolog日志保存到Elasticsearch中时出现映射问题时,请使用ElasticsearchHandler

在尝试将monolog日志保存到Elasticsearch中时出现映射问题时,请使用ElasticsearchHandler
EN

Stack Overflow用户
提问于 2016-04-12 12:32:43
回答 1查看 2.6K关注 0票数 4

我试着用monolog把我的日志发送到弹性搜索。(我正在使用Symfony2)。

我已经建立了这样的单曲:

代码语言:javascript
复制
monolog:
    handlers:
        elasticsearch:
            elasticsearch:
                host: %logger_elastic_host%
                port: %logger_elastic_port%
            type: elasticsearch
            level: info

它只工作了几分钟,直到它与此错误消息(一个致命的错误,我删除了无用的东西):

创建:/monolog/log/AVQKYsGRPmEhlo7mDfrN导致MapperParsingException[未能解析context.stack.args];嵌套:ElasticsearchIllegalArgumentException[未知属性类];

我一直在和我的学院研究如何解决这个问题。我们发现:

  • 弹性搜索接收第一批日志并自动构建映射
  • 我们用另一个映射发送新日志,或者与以前发送的日志稍有不同,这样就会中断。
  • 在这种情况下,它在这里崩溃了: context.stack.args。

问题是,情况总是很不一样。

我们想要的是:

  1. 有没有人使用Monolog登录到Elasticsearch
  2. 你们是怎么避免这个问题的。(我们如何才能避免这种情况)?

谢谢各位。

EN

Stack Overflow用户

发布于 2017-10-21 16:33:27

之所以发生这种情况,是因为ES从第一个文档创建映射。如果插入后的任何文档具有相同的属性,但具有其他类型/格式,则ES将引发错误。

一个解决方案是创建一个自定义monolog格式化程序并注册它:

config.yml:

代码语言:javascript
复制
elasticsearch:
    type: elasticsearch
    elasticsearch:
        host: elasticsearch
    ignore_error: true
    formatter: my_elasticsearch_formatter

这一行将使Monolog\Handler\ElasticSearchHandler忽略Ruflin的Elastica包中的任何其他错误:

代码语言:javascript
复制
ignore_error: true

然后使用以下名称注册一个服务: my_elasticsearch_formatter:

代码语言:javascript
复制
    <service id="my_elasticsearch_formatter" class="AppBundle\Services\MyFormatter">
        <argument type="string">monolog</argument>
        <argument type="string">logs</argument>
    </service>

第一个参数是索引名,第二个arg是类型。

格式化程序类:

代码语言:javascript
复制
<?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中上下文的内部属性进行筛选,但至少不会丢失有关日志的重要信息。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36573407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档