【问题标题】:Include loggroup name in the indexname for Lambda在 Lambda 的索引名称中包含日志组名称
【发布时间】:2020-02-03 03:17:48
【问题描述】:

我正在将数据从云监视日志流式传输到 Elastic Search 集群,并且我希望索引模式包含日志组。下面是 lambda 代码。

默认 -

var source = buildSource(logEvent.message, logEvent.extractedFields);
source['@id'] = logEvent.id;
source['@timestamp'] = new Date(1 * logEvent.timestamp).toISOString();
source['@message'] = logEvent.message;
source['@owner'] = payload.owner;
source['@log_group'] = payload.logGroup;
source['@log_stream'] = payload.logStream;
var x = source['@log_group'];
console.log('hello');
        // index name format: cwl-YYYY.MM.DD
var indexName = [
    'cwl-' + '- ' + timestamp.getUTCFullYear(),              // year
    ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
    ('0' + timestamp.getUTCDate()).slice(-2)          // day,
].join('.');

我需要的改变

var source = buildSource(logEvent.message, logEvent.extractedFields);
source['@id'] = logEvent.id;
source['@timestamp'] = new Date(1 * logEvent.timestamp).toISOString();
source['@message'] = logEvent.message;
source['@owner'] = payload.owner;
source['@log_group'] = payload.logGroup;
source['@log_stream'] = payload.logStream;
var x = source['@log_group'];
// index name format: cwl- myloggroup - YYYY.MM.DD
var indexName = [
    'cwl-' + x + '- ' + timestamp.getUTCFullYear(),              // year
    ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
    ('0' + timestamp.getUTCDate()).slice(-2)          // day,
].join('.');

编辑

  var indexName = [
            'cwl-' + x + '-' + timestamp.getUTCFullYear(),              // year
            ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
            ('0' + timestamp.getUTCDate()).slice(-2),source['@log_group'].toString()          // day,
        ].join('.');

但是随着这种变化,数据流式传输失败了。我不确定是什么导致了这个问题。

硬编码文本

// index name format: cwl-YYYY.MM.DD
var indexName = [
    'cwl-' + 'test' + timestamp.getUTCFullYear(),              // year
    ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
    ('0' + timestamp.getUTCDate()).slice(-2)          // day
].join('.');

【问题讨论】:

  • 您可以从索引名称中删除空格并尝试吗?
  • 不起作用,我在上面的问题中添加了关于我的尝试的编辑部分。
  • 您是否遇到任何错误?您是使用 ElasticSearch 托管服务还是自行托管?
  • 你能检查一下我添加的图像吗,我添加了一个 console.log 并打印了正确的模式,但在试运行期间我遇到了失败。一旦我删除我的更改,一切都会开始工作,我开始在 Kiabana 中看到日志
  • 如果你硬编码 indexName,你会看到 kibana 中的所有文档吗?

标签: javascript amazon-web-services aws-lambda kibana


【解决方案1】:

我不知道您为什么将日志组名称放在索引名称中,但如果您想根据日志组过滤您的日志,您可以使用 log-group 的日志源名称进行过滤。

由于命名约定,如果在索引中附加日志组名称,ELK 可能无法创建索引,因为 AWS 日志组通常包含斜杠字符。

索引名称的规则在 MetaDataCreateIndexService 254 中编码。本质上:

Lowercase only
Cannot include \, /, *, ?, ", <, >, |, space (the character, not the word), ,, #
Indices prior to 7.0 could contain a colon (:), but that's been deprecated and won't be supported in 7.0+
Cannot start with -, _, +
Cannot be . or ..
Cannot be longer than 255 characters

第二件事,您可以看到硬编码的名称,因为您将其放在正确的位置,因为您在第一次尝试时将名称添加到日期部分。日期时间处理器的目的是将文档指向正确的时间使用日期数学索引名称支持基于文档中的日期或时间戳字段的基于索引。

 var indexName = [
            'cwl-'+source['@log_group'].toString()+ '-' + timestamp.getUTCFullYear(),              // year
            ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
            ('0' + timestamp.getUTCDate()).slice(-2),         // day,
        ].join('.');

或者您可以替换日志组名称中的所有特殊字符。

source['@log_group'].toString().replace(/[^A-Z0-9]+/ig, "-");

【讨论】:

猜你喜欢
  • 2020-07-13
  • 2011-03-06
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多