Cloudwatch to Elasticsearch анализирует / маркирует событие журнала перед отправкой в ​​ES - PullRequest
0 голосов
/ 04 июня 2018

Заранее признателен за помощь.

В моем сценарии - многострочные журналы Cloudwatch должны быть отправлены в Службу эластичного поиска.ECS - awslog-> Cloudwatch --- с использованием лямбды -> ES Domain (базовый поток, хотя и очень открытый для изменения способа передачи данных из CW в ES)

Мне удалосьрешить проблему с несколькими строками, используя multi_line_start_pattern НО Основная проблема, с которой я сейчас сталкиваюсь, - это то, что мои журналы имеют формат ODL (следующий формат)

[yyyy-mm-ddThh:mm:ss.SSS-Z][ProductName-Version][Log Level]
[Message ID][LoggerName][Key Value Pairs][[
Message]]

И я хочу проанализировать и токенизировать события журнала перед сохранениемв ES (против полной строки журнала). Например:

[2018-05-31T11:08:49.148-0400] [glassfish 4.1] [INFO] [] [] [tid: _ThreadID=43 _ThreadName=Thread-8] [timeMillis: 1527692929148] [levelValue: 800] [[
[] INFO : (DummyApplicationFunctionJPADAO) EntityManagerFactory located under resource lookup name [null], resource name=AuthorizationPU]]

Необходимо выполнить синтаксический анализ и токенизацию в формате

    timestamp            2018-05-31T11:08:49.148-0400 
    ProductName-Version glassfish 4.1  
    LogLevel            INFO 
    MessageID
    LoggerName 
   KeyValuePairs tid:  _ThreadID=43 _ThreadName=Thread-8
   Message           [] INFO : (DummyApplicationFunctionJPADAO) 
                    EntityManagerFactorylocated under resource lookup name 
                    [null], resource name=AuthorizationPU

В приведенных выше парах значения ключа повторяются ипеременная - для простоты я могу хранить все как одну длинную строку.

Что касается того, что я собрал об Cloudwatch - похоже, шаблон фильтра подписки reg ex support очень ограничен, на самом деле я не уверен, как соответствовать вышеуказанному шаблону.Для лямбда-функции, которая отправляет данные в ES, не встречались документация AWS или примеры, которые поддерживают лямбду в качестве средства для анализа и передачи для ES.

Буду признателен, если кто-то может подсказать, что / где будет лучшим вариантом для разбораCW записывает в журнал, прежде чем попасть в ES => Subscription Filter -Pattern против лямбда-функции или любым другим способом.

Спасибо.

1 Ответ

0 голосов
/ 16 октября 2018

Из того, что я вижу, лучшая ставка - это то, что вы предлагаете: лямбда, запускаемая журналом CloudWatch, которая переформатирует зарегистрированные данные в предпочитаемый вами формат ES и затем отправляет их в ES.

Вам понадобитсяподписать эту лямбду на ваши логи CloudWatch.Вы можете сделать это на лямбда-консоли или облачной консоли (https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions.html).

* Лямбда event: { "awslogs": { "data": "encoded-logs" } }. Где encoded-logs - это кодировка Base64 сжатого JSON.

Например, пример события (https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-cloudwatch-logs) можно декодировать в узле, например, используя:

const zlib = require('zlib');
const data = event.awslogs.data;
const gzipped = Buffer.from(data, 'base64');
const json = zlib.gunzipSync(gzipped);
const logs = JSON.parse(json);
console.log(logs);
/*
  { messageType: 'DATA_MESSAGE',
    owner: '123456789123',
    logGroup: 'testLogGroup',
    logStream: 'testLogStream',
    subscriptionFilters: [ 'testFilter' ],
    logEvents:
     [ { id: 'eventId1',
         timestamp: 1440442987000,
         message: '[ERROR] First test message' },
       { id: 'eventId2',
         timestamp: 1440442987001,
         message: '[ERROR] Second test message' } ] }
*/

Из того, что вы обрисовали в общих чертах, вы захотитеИзвлеките массив logEvents и разберите его на массив строк. Я с радостью помогу и вам, если вам это нужно (но мне нужно знать, на каком языке вы пишете свою лямбду)являются библиотеками для токенизации ODL, так что, надеюсь, это не так уж сложно).

На этом этапе вы можете POST эти новые записи непосредственно в вашем домене AWS ES.хороший пример того, как это сделать в python: https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-aws-integrations.html#es-aws-integrations-s3-lambda-es

Полный пример лямбды, которая делает все это (кем-то еще), можно найти здесь: https://github.com/blueimp/aws-lambda/tree/master/cloudwatch-logs-to-elastic-cloud

...