日志¶
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 |
|
SLO |
|
SW |
|
TU |
|
BD |
批量操作(删除和存档自动提取) (delete) |
EA |
批量操作(删除和存档自动提取) (extract) |
AQ |
|
CQ |
|
CS |
|
TA |
|
DLO |
|
LE |
|
KS |
|
RL |
|
RO |
|
VW |
|
SSC |
|
SYM |
|
SH |
|
S3 |
|
OV |
|
EQ |
存储节点日志¶
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 字符串,例如 |
request_time |
请求接收和响应开始之间的时间。注意:这包括 PUT 的传输时间,但不包括 GET。 |
additional_info |
其他有用的信息。 |
server_pid |
服务器的进程 ID |
policy_index |
存储策略索引的值。 |