答案1
S3 是一个分布式系统,这至少是它生成大量日志文件的一个因素。
S3 中的对象是不可变的——无法直接将数据附加到 S3 对象,这样做需要进行模拟操作:必须将对象的字节复制到新对象中,然后再复制附加数据。这将使记录到单个“不断增长”的每日日志文件中几乎不可能以任何规模进行。日志文件是标准的 S3 对象,因此这可能是单个文件按原样写入的另一个原因。
它并不是每个请求对应一个文件,尽管在流量较低的存储桶上看起来确实如此。本质上,每个日志文件都包含在其时间戳之前创建的记录,但不一定是自上次写入日志以来的记录——日志文件偶尔会包含几小时、几天或几周前的记录,这些记录滞留在 S3 中的某个地方,最终被释放。这种情况很少见,但有记录表明存在这种可能性。
事件发生后,通常需要快速获取用于故障排除的日志,因此通常希望尽快收到它们,而这正是 S3 倾向于做的事情。
这是不可配置的。
http://docs.aws.amazon.com/AmazonS3/latest/dev/ServerLogs.html
我轻松访问日志的解决方案是在我的日志收集存储桶上添加 S3 事件通知,该通知会将消息发送到 SQS 队列。队列使用者在具有 EBS Cold Storage (sc1) 卷的 EC2 实例上运行。当每个日志文件写入存储桶时,队列使用者会获取文件并从文件名中得出日期。然后,它会解析日志事件以确定其 HTTP 状态类,例如 2XX、3XX、4XX、5XX 或其他/不匹配,并将每条记录附加到主每日文件中。带有 4xx、5xx 或不匹配/意外的记录将附加到仅包含错误的较小每日文件中。使用类似的工具搜索这些本地文件grep
变得轻而易举。