#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'