ElasticsearchTransport использует преобразование для изменения indexPrefix?

#elasticsearch #winston #winston-elasticsearch

#elasticsearch #уинстон #winston-elasticsearch

Вопрос:

ОБНОВЛЕНИЕ: я действительно могу изменить indexPrefix, используя приведенный ниже код, но фактический _index , который используется для фильтрации в Kibana, получает свое имя из оригинала indexPrefix . Кажется, что изменение indexPrefix в transformer методе слишком поздно, потому _index что он уже создан с исходным префиксом.

Я использую winston и winston-elasticsearch в настройке nodejs / express и хочу использовать один и тот же регистратор для входа в разные индексы (разные indexPrefix )

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

Транспорты представляют собой массив различных транспортов. Одним из них является an ElasticsearchTransport , который принимает некоторые параметры, такие как indexPrefix и level среди других. Уровень можно изменить в зависимости от типа журнала, передав 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 .

Кто-нибудь знает почему? Имеет ли это отношение к mappingTemplate, перечисленному ниже?:

 {
  "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": {}
      }
    }
  }
}
  

Ответ №1:

Хорошо, если кто-то заинтересован. Вместо этого я создал LoggerFactory. Я создаю регистратор, заполненный правильным indexPrefix через фабрику — таким образом, я получаю один экземпляр регистратора для каждого indexPrefix, который я хочу…

Ответ №2:

Для тех, у кого такая же проблема, я решил это по-другому.

1 — Я создал переменную внутри области ElasticsearchTransport; 2 — Я изменил значение переменной внутри метода transformer; 3 — Я использовал переменную внутри метода indexPrefix, чтобы определить, какой префикс использовать:

 indexPrefix: () => return variable ? 'test1' : 'test2'