我试着用monolog把我的日志发送到弹性搜索。(我正在使用Symfony2)。
我已经建立了这样的单曲:
monolog:
handlers:
elasticsearch:
elasticsearch:
host: %logger_elastic_host%
port: %logger_elastic_port%
type: elasticsearch
level: info它只工作了几分钟,直到它与此错误消息(一个致命的错误,我删除了无用的东西):
创建:/monolog/log/AVQKYsGRPmEhlo7mDfrN导致MapperParsingException[未能解析context.stack.args];嵌套:ElasticsearchIllegalArgumentException[未知属性类];
我一直在和我的学院研究如何解决这个问题。我们发现:
问题是,情况总是很不一样。
我们想要的是:
谢谢各位。
发布于 2017-10-21 16:33:27
之所以发生这种情况,是因为ES从第一个文档创建映射。如果插入后的任何文档具有相同的属性,但具有其他类型/格式,则ES将引发错误。
一个解决方案是创建一个自定义monolog格式化程序并注册它:
config.yml:
elasticsearch:
type: elasticsearch
elasticsearch:
host: elasticsearch
ignore_error: true
formatter: my_elasticsearch_formatter这一行将使Monolog\Handler\ElasticSearchHandler忽略Ruflin的Elastica包中的任何其他错误:
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>第一个参数是索引名,第二个arg是类型。
格式化程序类:
<?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中上下文的内部属性进行筛选,但至少不会丢失有关日志的重要信息。
https://stackoverflow.com/questions/36573407
复制相似问题