注意

本文档适用于 Ceph 的开发版本。

桶日志记录

版本 T 中的新功能。

桶日志记录提供了一种机制,用于记录对桶的所有访问。日志数据可用于监控桶活动、检测未经授权的访问、深入了解桶使用情况,以及将日志用作桶更改的日志。日志记录存储在单独桶中的对象中,可以稍后进行分析。日志记录配置在桶级别完成,可以随时启用或禁用。日志桶可以累积来自多个桶的日志。建议为每个桶配置不同的“前缀”,以便不同桶的日志将存储在日志桶中的不同对象中。

注意

  • 必须先创建日志桶,然后才能在桶上启用日志记录。

  • 日志桶不能与正在记录日志的桶相同。

  • 日志桶不能启用日志记录。

  • 日志桶不能设置任何加密(包括使用 AES-256 的 SSE-S3)。

  • 日志桶不能设置任何压缩。

  • 日志桶不得启用 RequestPayer。

  • 源桶和日志桶必须位于同一区域组中。

  • 源桶和日志桶可能属于不同的帐户(设置了适当的桶策略)。

  • 日志桶可以启用对象锁定并设置默认保留期。

  • 日志对象名称的 16 字节唯一 ID 部分是一个按字典顺序排列的随机字符串,由一个 10 字节计数器和一个 6 字节随机字母数字字符串组成(如果计数器不可用,则为随机字母数字字符串)。

日志记录可靠性

出于性能原因,尽管日志记录写入持久存储,但日志对象仅在某个可配置的时间量之后(或者如果达到 128 MB 的最大对象大小)才会出现在日志桶中。此时间(以秒为单位)可以通过对 REST API 的 Ceph 扩展按源桶设置,或者通过 rgw_bucket_logging_obj_roll_time 配置选项全局设置。如果未设置,默认时间为 5 分钟。将日志对象添加到日志桶是“惰性”完成的,这意味着如果没有更多记录写入对象,即使在配置的时间过去后,它也可能保留在日志桶之外。为了解决这个问题,您可以将给定源桶上的所有日志记录对象刷新到日志桶中,无论是否已过去足够的时间或者是否没有更多记录写入对象。当桶上的日志记录被禁用、其日志记录配置被更改或桶被删除时,刷新将自动发生。

当由写入日志记录触发时,将新日志对象添加到日志桶的过程是异步的。因此,生成日志的操作会立即完成,并且不会等待日志对象添加完成;此添加稍后发生。刷新时,日志对象会立即添加到日志桶中。因此,此操作可能会导致桶中的日志记录暂时出现空白,直到任何待处理的日志对象也添加进来。

要检查源桶的哪些日志对象当前正在等待添加到日志桶中,请执行以下命令

radosgw-admin bucket logging list --bucket <source bucket>

标准

如果日志记录类型设置为“Standard”(默认值),则日志记录在桶操作完成后写入日志桶。这意味着日志记录操作可能会失败,而不会向客户端发出任何指示。

日志

如果日志记录类型设置为“Journal”,则记录在桶操作完成之前写入日志桶。这意味着如果日志记录操作失败,则不会执行该操作,并且会向客户端返回错误。存在一些例外情况:下表中的“操作失败”列通过“否”表示即使日志记录失败也不会失败的操作。日志模式支持根据已记录对象键的前缀和后缀匹配来过滤记录。正则表达式匹配也可用于创建过滤器。请注意,日志记录可能已成功写入,但桶操作失败,因为日志已写入。

日志模式支持以下操作

操作

操作名称

操作失败

PutObject

REST.PUT.OBJECT

DeleteObject

REST.DELETE.OBJECT

DeleteObjects

REST.POST.DELETE_MULTI_OBJECT

CompleteMultipartUpload

REST.POST.UPLOAD

CopyObject

REST.PUT.OBJECT

PutObjectAcl

REST.PUT.ACL

PutObjectLegalHold

REST.PUT.LEGAL_HOLD

PutObjectRetention

REST.PUT.RETENTION

PutObjectTagging

REST.PUT.OBJECT_TAGGING

DeleteObjectTagging

REST.DELETE.OBJECT_TAGGING

多站点

多区域部署中,在日志对象添加到日志桶之前,每个区域使用自己的日志对象。日志对象添加到日志桶后(即刷新后),它会复制到其他区域。这意味着在给定时间段内,可能存在多个包含相关日志记录的日志对象。

桶日志记录策略

只有源桶的所有者才允许启用或禁用桶日志记录。要将桶用作日志桶,它必须具有允许这样做的桶策略(即使源桶和日志桶属于同一用户或帐户)。桶策略必须允许 logging.s3.amazonaws.com 服务主体对日志桶执行 s3:PutObject 操作。桶策略还应指定预期将日志写入其中的源桶和帐户。例如

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowLoggingFromSourceBucket",
      "Effect": "Allow",
      "Principal": {
        "Service": "logging.s3.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::log-bucket-name/prefix*",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "source-account-id"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:s3:::source-bucket-name"
        }
      }
    }
  ]
}

桶日志记录配额

桶和用户配额应用于日志桶。每次写入日志记录时都会检查配额,并在将日志对象添加到日志桶时更新配额。在“Journal”模式下,如果超出配额,日志记录操作将失败,从而导致桶操作也失败。在“Standard”模式下,日志记录操作将被跳过,但桶操作将继续。

桶日志记录 REST API

详细信息请参阅:桶操作

日志对象键格式

简单

“Simple”日志对象键具有以下格式

<prefix><year-month-day-hour-minute-second>-<16 bytes unique-id>

例如

fish/2024-08-06-09-40-09-0000000002AGQ6W1

分区

“Partitioned”日志对象键具有以下格式

<prefix><source bucket owner>/<zone group>/[tenant:]<source bucket name>/<year>/<month>/<day>/<year-month-day-hour-minute-second>-<16 bytes unique-id>

例如

fish/testid/default/fish-bucket/2024/08/06/2024-08-06-10-11-18-0000000011D1FGPA

日志记录格式

日志记录是空格分隔的字符串列,具有以下可能的格式

日志

“Journal”记录格式使用最少量的数据来记录桶更改日志(这是 Ceph 扩展)。

  • 桶所有者(如果为空则为破折号)

  • 桶名称(如果为空则为破折号),格式为:[tenant:]<bucket name>

  • 时间,格式为:[day/month/year:hour:minute:second timezone]

  • 操作,格式为:WEBSITE/REST.<HTTP method>.<resource>

  • 对象键(如果为空则为破折号)

  • 对象大小(如果为空则为破折号)

  • 版本 ID(如果为空则为破折号)

  • eTag(如果为空则为破折号)

例如

testid fish [06/Aug/2024:09:40:09 +0000] REST.PUT.OBJECT myfile - 512 4cfdfc1f58e762d3e116787cb92fac60
testid fish [06/Aug/2024:09:40:28 +0000] REST.DELETE.OBJECT myfile - - 4cfdfc1f58e762d3e116787cb92fac60

标准

“Standard”记录格式基于 AWS 日志记录格式

  • 桶所有者(如果为空则为破折号)

  • 桶名称(如果为空则为破折号),格式为:[tenant:]<bucket name>

  • 时间,格式为:[day/month/year:hour:minute:second timezone],其中“timezone”采用 UTC 偏移量

  • 客户端 IP 地址(如果为空则为破折号)

  • 用户或帐户(如果为空则为破折号)

  • 请求 ID

  • 操作,格式为:WEBSITE/REST.<HTTP method>.<resource>

  • 对象键(如果为空则为破折号)

  • 请求 URI,格式为:"<HTTP method> <URI> <HTTP version>"

  • HTTP 状态(如果为零则为破折号)。请注意,在大多数情况下,日志是在知道状态之前写入的

  • 错误代码(如果为空则为破折号)

  • 发送的字节数(如果为零则为破折号)

  • 对象大小(如果为零则为破折号)

  • 总时间(不支持,始终为破折号)

  • 周转时间(以毫秒为单位)

  • referer(如果为空则为破折号)

  • 用户代理(如果为空则为破折号),位于双引号内

  • 版本 ID(如果为空则为破折号)

  • 主机 ID,取自 x-amz-id-2(如果为空则为破折号)

  • 签名版本(如果为空则为破折号)

  • 密码套件(如果为空则为破折号)

  • 身份验证类型(AuthHeader 用于常规身份验证,QueryString 用于预签名 URL,如果未通过身份验证则为破折号)

  • 主机头(如果为空则为破折号)

  • TLS 版本(如果为空则为破折号)

  • 访问点 ARN(不支持,始终为破折号)

  • ACL 标志(如果授权需要 ACL,则为 Yes,否则为破折号)

例如

testid fish [06/Aug/2024:09:30:25 +0000] - testid 9e369a15-5f43-4f07-b638-de920b22f91b.4179.15085270386962380710 REST.PUT.OBJECT myfile "PUT /fish/myfile HTTP/1.1" 200 - 512 512 - - - - - - - - - localhost - -
testid fish [06/Aug/2024:09:30:51 +0000] - testid 9e369a15-5f43-4f07-b638-de920b22f91b.4179.7046073853138417766 REST.GET.OBJECT myfile "GET /fish/myfile HTTP/1.1" 200 - - 512 - - - - - - - - - localhost - -
testid fish [06/Aug/2024:09:30:56 +0000] - testid 9e369a15-5f43-4f07-b638-de920b22f91b.4179.10723158448701085570 REST.DELETE.OBJECT myfile "DELETE /fish/myfile1 HTTP/1.1" 200 - - 512 - - - - - - - - - localhost - -

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入