Вход в CloudWatch из экземпляров EC2

На моих серверах EC2 в настоящее время размещается веб-сайт, который регистрирует активность каждого зарегистрированного пользователя в отдельном файле журнала на локальном экземпляре EC2, например, username.log. Я пытаюсь найти способ отправить события журнала для них в CloudWatch с помощью PHP SDK, не замедляя работу приложения, и при этом сохраняя возможность поддерживать отдельный файл журнала для каждого зарегистрированного члена моего веб-сайта.

Я не могу за всю жизнь понять это:

ВАРИАНТ 1: Как я могу войти в CloudWatch асинхронно используете CloudWatch SDK? Мое PHP-приложение ведет себя ОЧЕНЬ вяло, поскольку каждая строка журнала занимает примерно 100 мс, чтобы перейти непосредственно к CloudWatch. Пример кода ниже.

ВАРИАНТ 2: В качестве альтернативы, как я могу настроить установленный агент CloudWatch на EC2 так, чтобы он просто НАБЛЮДАЛ все мои файлы журналов, которые в основном загружают их асинхронно в CloudWatch для меня в отдельном процессе? Для агента ведения журнала CloudWatch EC2 требуется статический «файл конфигурации» (Документация AWS) на вашем сервере, который, насколько мне известно, должен заранее перечислить все ваши файлы журналов («потоки журналов»), что я не смогу предсказать во время запуска сервера. Есть ли способ обойти это (то есть просто наблюдать ВСЕ файлы журналов в каталоге)? Пример файла конфигурации ниже.

Здесь приветствуются все идеи, но я не хочу, чтобы мое решение просто заключалось в том, чтобы «выбросить все ваши журналы в один файл, чтобы имена журналов всегда были предсказуемыми».

Заранее спасибо!!!


ВАРИАНТ 1: Регистрация через SDK (занимает ~ 100 мс / logEvent):

// Configuration to use for the CloudWatch client
$sharedConfig = [
'region'  => 'us-east-1',
'version' => 'latest',
'http'    => [
'verify' => false
]
];

// Create a CloudWatch client
$cwClient = new Aws\CloudWatchLogs\CloudWatchLogsClient($sharedConfig);

// DESCRIBE ANY EXISTING LOG STREAMS / FILES
$create_new_stream = true;
$next_sequence_id = "0";
$result = $cwClient->describeLogStreams([
'Descending' => true,
'logGroupName' => 'user_logs',
'LogStreamNamePrefix' => $stream,
]);
// Iterate through the results, looking for a stream that already exists with the intended name
// This is so that we can get the next sequence id ('uploadSequenceToken'), so we can add a line to an existing log file
foreach ($result->get("logStreams") as $stream_temp) {
if ($stream_temp['logStreamName'] == $stream) {
$create_new_stream = false;
if (array_key_exists('uploadSequenceToken', $stream_temp)) {
$next_sequence_id = $stream_temp['uploadSequenceToken'];
}
break;
}
}

// CREATE A NEW LOG STREAM / FILE IF NECESSARY
if ($create_new_stream) {
$result = $cwClient->createLogStream([
'logGroupName' => 'user_logs',
'logStreamName' => $stream,
]);
}

// PUSH A LINE TO THE LOG *** This step ALONE takes 70-100ms!!! ***

$result = $cwClient->putLogEvents([
'logGroupName' => 'user_logs',
'logStreamName' => $stream,
'logEvents' => [
[
'timestamp' => round(microtime(true) * 1000),
'message' => $msg,
],
],
'sequenceToken' => $next_sequence_id
]);

ВАРИАНТ 2: Вход в систему с помощью установленного агента CloudWatch (обратите внимание, что файл конфигурации, приведенный ниже, позволяет только жестко запрограммировать заранее определенные имена журналов, насколько мне известно):

[general]
state_file = /var/awslogs/state/agent-state

[applog]
file = /var/www/html/logs/applog.log
log_group_name = PP
log_stream_name = applog.log
datetime_format = %Y-%m-%d %H:%M:%S

5

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …