日志

Swift 具有非常详细的日志记录,生成的日志可用于集群监控、利用率计算、审计记录等。总而言之,Swift 的日志会发送到 syslog,并按日志级别和 syslog facility 组织。所有与相同请求相关的日志行都具有相同的事务 ID。本页记录了系统中使用的日志格式。

注意

默认情况下,Swift 会记录完整的日志行。但是,使用 log_max_line_length 设置,并且取决于您的日志服务器软件,行可能会被截断或缩短。如果 log_max_line_length < 7,日志行将被截断。如果 log_max_line_length >= 7,日志行将被“缩短”:大约一半的最大长度,后跟“ … ”,再后跟另一半的最大长度。除非您使用异常短的值,否则不太可能在使用以下记录的日志行时遇到这种情况,但您可能会在调试和错误日志行中看到它。

代理日志

代理日志包含发往代理服务器的所有外部 API 请求的记录。Swift 的代理服务器使用自定义格式记录请求,该格式旨在提供强大的信息和简单的处理。可以使用 log_msg_template 配置参数更改此格式。默认日志格式是

{client_ip} {remote_addr} {end_time.datetime} {method} {path} {protocol}
    {status_int} {referer} {user_agent} {auth_token} {bytes_recvd}
    {bytes_sent} {client_etag} {transaction_id} {headers} {request_time}
    {source} {log_info} {start_time} {end_time} {policy_index}
    {access_user_id}

一些关键字(由 (可匿名化) 标志指示)可以通过使用 ‘anonymized’ 转换器进行匿名化。数据应用 log_anonymization_method 的哈希方法和可选的 salt log_anonymization_salt

一些关键字(由 (时间戳) 标志指示)可以使用匹配的转换器转换为标准日期格式:‘datetime’、‘asctime’ 或 ‘iso8601’。其他时间戳转换器包括秒、毫秒、微秒和纳秒的 ‘s’、‘ms’、‘us’ 和 ‘ns’。Python 的 strftime 指令也可以用作转换器 (a, A, b, B, c, d, H, I, j, m, M, p, S, U, w, W, x, X, y, Y, Z)。

示例

{client_ip.anonymized} {remote_addr.anonymized} {start_time.iso8601}
    {end_time.H}:{end_time.M} {method} acc:{account} cnt:{container}
    obj:{object.anonymized}

日志字段

client_ip

Swift 猜测的最终客户端 IP,从请求中的各种标头中获取。(可匿名化)

remote_addr

TCP 连接另一端的 IP 地址。(可匿名化)

end_time

请求的时间戳。(时间戳)

method

请求中的 HTTP 动词。

domain

请求中的域名。(可匿名化)

路径

请求的路径部分。(可匿名化)

协议

使用的传输协议(当前为 http 或 https)。

status_int

请求的响应代码。

referer

HTTP Referer 标头的值。(可匿名化)

user_agent

HTTP User-Agent 标头的值。(可匿名化)

auth_token

auth token 的值。这可能会被截断或以其他方式混淆。

bytes_recvd

为此请求从客户端读取的字节数。

bytes_sent

发送到客户端的响应主体中的字节数。这是传递给 WSGI 服务器的字节数。

client_etag

客户端提供的 etag 标头值。(可匿名化)

transaction_id

请求的事务 ID。

headers

请求中提供的标头。(可匿名化)

request_time

请求的持续时间。

source

请求的“来源”。这可能设置为为了满足客户端请求而生成的请求,例如批量上传。

log_info

各种可能对诊断有用的信息,例如任何 x-delete-at 标头的值。

start_time

请求开始时的精确时间戳。(时间戳)

end_time

请求结束时的精确时间戳。(时间戳)

ttfb

请求和发送第一个字节之间的时间。

policy_index

存储策略索引的值。

account

从请求路径中提取的帐户部分。(可匿名化)

container

从请求路径中提取的容器部分。(可匿名化)

对象

从请求路径中提取的对象部分。(可匿名化)

pid

发出日志行的进程的 PID。

wire_status_int

发送到客户端的状态,如果请求主体出现错误或断开连接,则可能与记录的响应代码不同。

access_user_id

用于日志记录的用户 ID。中间件应设置 environ[‘swift.access_logging’][‘user_id’] 以标识用于日志记录目的的用户。对于 S3 API 请求,这包含 S3 访问密钥 ID。其他身份验证中间件应设置用户特定的标识符。对于没有身份验证中间件支持的请求,此字段将为“-”。

在一行日志中,以上所有字段都用空格分隔并进行 URL 编码。如果任何值为空,则将其记录为“ - ”。这允许通过在空格上拆分每行进行简单的解析。新的值可能会不时地放置在日志行的末尾,但现有值的顺序不会更改。Swift 日志处理实用程序应查找它们需要的第一个 N 个字段(例如,在 Python 中使用类似 log_line.split()[:14] 的方法来获取到事务 ID)。

注意

一些日志字段(如请求路径)已经过 URL 引用,因此记录的值将被双引号引用。例如,如果客户端上传带有 : 的对象名称,它将被 URL 引用为 %3A。日志模块然后将此值引用为 %253A

Swift 来源

代理日志中的 source 值用于标识系统中请求的发起者。例如,如果客户端启动批量上传,代理服务器最终可能会执行许多请求。最初的批量上传请求将正常记录,但所有内部“子请求”都将具有指示它们来自批量功能的 source 值。

记录的来源值

请求的发起者

FP

FormPost

SLO

静态大对象

SW

StaticWeb

TU

TempURL

BD

批量操作(删除和存档自动提取) (delete)

EA

批量操作(删除和存档自动提取) (extract)

AQ

Account Quotas

CQ

Container Quotas

CS

Container Sync Middleware

TA

TempAuth

DLO

动态大对象

LE

List Endpoints

KS

KeystoneAuth

RL

速率限制

RO

只读

VW

版本化写入

SSC

服务器端复制

SYM

Symlink

SH

容器分片

S3

AWS S3 Api

OV

对象版本控制

EQ

Etag Quoter

存储节点日志

Swift 的帐户、容器和对象服务器进程都会记录它们收到的请求,如果已使用 log_requests 配置参数(默认值为 true)对其进行配置。这些日志行的格式是

remote_addr - - [datetime] "request_method request_path" status_int
    content_length "referer" "transaction_id" "user_agent" request_time
    additional_info server_pid policy_index

日志字段

remote_addr

TCP 连接另一端的 IP 地址。

datetime

请求的时间戳,格式为“day/month/year:hour:minute:second +0000”。

request_method

请求中的 HTTP 动词。

request_path

请求的路径部分。

status_int

请求的响应代码。

content_length

响应中的 Content-Length 标头的值。

referer

HTTP Referer 标头的值。

transaction_id

请求的事务 ID。

user_agent

HTTP User-Agent 标头的值。Swift 服务报告的服务名称后跟进程 ID 的 user-agent 字符串,例如 "proxy-server <pid of the proxy>""object-updater <pid of the object updater>"

request_time

请求接收和响应开始之间的时间。注意:这包括 PUT 的传输时间,但不包括 GET。

additional_info

其他有用的信息。

server_pid

服务器的进程 ID

policy_index

存储策略索引的值。