首页 > 解决方案 > ElasticsearchTransport 使用 transform 来改变 indexPrefix?

问题描述

更新:我实际上可以使用下面的代码更改 indexPrefix,但_index用于在 Kibana 中过滤的实际名称来自原始indexPrefix. indexPrefix在方法中更改似乎transformer为时已晚,因为_index已经使用原始前缀创建了。

我在 nodejs/express 设置中使用winstonandwinston-elasticsearch并希望使用相同的记录器记录到不同的索引(不同indexPrefix

const logger = winston.createLogger({
  transports
});

传输是一组不同的传输。其中之一是ElasticsearchTransport接受一些参数,例如indexPrefixlevel其他参数。transformer通过传入一个方法作为参数,可以根据日志的类型更改级别。

    new winstonElastic.ElasticsearchTransport({
      level: logLevel,
      indexPrefix: getIndex(),
      messageType: 'log',
      ensureMappingTemplate: true,
      mappingTemplate: indexTemplateMapping,
      transformer: (logData: any) => {
        const transformed: any = {};
        transformed['@timestamp'] = logData.timestamp ? logData.timestamp : new Date().toISOString();
        transformed.message = logData.message;
        transformed.level = parseWinstonLevel(logData.level);
        transformed.fields = _.extend({}, staticMeta, logData.meta);
        transformed.indexPrefix = getIndex(logData.indexPrefix);
        return transformed;
      },

每当记录器写入新条目时都会调用transformer方法,我可以通过设置属性来验证它是否有效message。它还会将 覆盖level到当前日志级别。由于某种原因,它不适用于该属性indexPrefix- 即使它发生更改,也不会覆盖初始的indexPrefix. 我什至尝试删除初始值,但随后记录失败,从未设置indexPrefix.

有谁知道为什么?是否与下面列出的映射模板有关?:

{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "index": {
      "refresh_interval": "5s"
    }
  },
  "mappings": {
    "properties": {
      "@timestamp": { "type": "date" },
      "@version": { "type": "keyword" },
      "message": { "type": "text" },
      "severity": { "type": "keyword" },
      "fields": {
        "dynamic": true,
        "properties": {}
      }
    }
  }
}

标签: elasticsearchwinstonwinston-elasticsearch

解决方案


好的,如果有人感兴趣的话。我最终改为制作了一个 loggerFactory。我通过工厂创建了一个使用正确 indexPrefix 播种的记录器 - 这样我最终每个 indexPrefix 我想​​要一个记录器实例......


推荐阅读