gpt4 book ai didi

php - 从 EC2 实例登录到 CloudWatch

转载 作者:行者123 更新时间:2023-12-03 11:22:56 27 4
gpt4 key购买 nike

我的 EC2 服务器目前正在托管一个网站,该网站将每个注册用户的事件记录在本地 EC2 实例上他们自己的单独日志文件下,例如 username.log。我试图找出一种方法,使用 PHP SDK 将这些日志事件推送到 CloudWatch,而不会减慢应用程序的速度,同时仍然能够为我网站的每个注册成员维护一个单独的日志文件。

我一生都无法弄清楚:

选项 1:如何登录 CloudWatch 异步 使用 CloudWatch SDK?我的 PHP 应用程序的行为非常缓慢,因为每个日志行大约需要 100 毫秒才能直接推送到 CloudWatch。代码示例如下。

选项 2:或者,我如何在 EC2 上配置已安装的 CloudWatch 代理以简单地观察我的所有日​​志文件,这基本上会在单独的过程中为我将它们异步上传到 CloudWatch? CloudWatch EC2 日志代理需要您的服务器上有一个静态“配置文件”( AWS documentation ),据我所知,它需要提前列出您的所有日志文件(“日志流”),我不会这样做能够在服务器启动时进行预测。有没有办法解决这个问题(即,只需观察目录中的所有日志文件)?配置文件示例如下。

这里欢迎所有想法,但我不希望我的解决方案只是“将您的所有日志放入一个文件中,以便您的日志名称始终是可预测的”。

提前致谢!!!

选项 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

最佳答案

看起来我们现在有一些好消息……不确定是否为时已晚!

CloudWatch Log Configuration

所以回答这个疑惑,

Is there any way around this (ie, simply observe ALL log files in a directory)?



是的,我们可以使用通配符提及日志文件和文件路径,这可以帮助您灵活地配置从何处获取日志并将其推送到日志流。

关于php - 从 EC2 实例登录到 CloudWatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35519720/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com