更新:我实际上可以使用下面的代码更改indexPrefix,但在Kibana中用于过滤的实际_index的名称来自于原始的indexPrefix。在transformer方法中更改indexPrefix似乎为时已晚,因为已经使用原始前缀创建了_index。
我在nodejs/express设置中使用winston和winston-elasticsearch,并希望使用相同的日志记录器来记录不同的索引(不同的indexPrefix)
const logger = winston.createLogger({
transports
});传输是不同传输的数组。其中之一是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": {}
}
}
}
}发布于 2020-10-30 19:35:45
好吧,如果有人感兴趣的话。我最终做了一个loggerFactory。我通过工厂创建了一个带有正确indexPrefix的记录器--这样我就可以为每个我想要的indexPrefix创建一个记录器实例……
https://stackoverflow.com/questions/64591885
复制相似问题