本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
systemd.journal-fields — 特殊的日志字段
每一条日志都像是数据库中的一条记录, 并且字段的内容可以是二进制数据。 文本字段统一格式化为UTF-8格式, 二进制字段仅在格式化为UTF-8无意义时才使用二进制格式。 应用可以自由定义新字段, 但是某些字段名称具有特定的专属含义。 所有具有特定专属含义的字段都是可选的。 在某些情况下,同一个字段可以在同一条日志记录中出现多次。
用户字段是指那些直接从客户端传递过来的字段, 并且会被存储在日志文件中。
MESSAGE=
¶人类易读的消息字符串。 这是显示给用户的主要文本, 通常不被转换(个别情况例外), 并且不用于创建该条日志的元数据。
MESSAGE_ID=
¶消息类型标识符。
一个不含任何标点符号、用小写十六进制字符串表示的128位无符号整数(如果存在的话)。
开发者可以使用
journalctl --new-id128
命令生成一个与UUID兼容的新标识符。
PRIORITY=
¶消息优先级(也就是日志等级),
是一个 0 ("emerg
")
到 7 ("debug
") 之间的十进制整数。
与 syslog 的消息优先级含义相同。
CODE_FILE=
, CODE_LINE=
, CODE_FUNC=
¶产生此消息的 程序源代码的具体位置(如果知道的话): 源代码文件名、行号、函数名。
ERRNO=
¶导致产生此消息的底层Unix错误代码(如果存在的话), 是一个 errno(3) 格式的十进制整数。
SYSLOG_FACILITY=
, SYSLOG_IDENTIFIER=
, SYSLOG_PID=
, SYSLOG_TIMESTAMP=
¶与 syslog 兼容的字段: facility(一个十进制数字,表示产生日志的子系统)、标签、客户端PID 、原始日志报文中的时间戳。 其中的"标签"通常由 glibc 的 program_invocation_short_name(3) 函数生成。
SYSLOG_RAW=
¶原始日志报文中的 syslog 行的原始内容。
仅当 MESSAGE=
字段被修改、
或者无法正确定位时间戳(不包含
SYSLOG_TIMESTAMP=
)时,才会包含此字段。
当日志消息包含前导或尾随空格(将会被删除)、
或者包含
NUL
字节(NUL
字节及其后的任何内容将会被删除)时,消息将被截断。因此,原始 syslog
行要么存储为 SYSLOG_RAW=
、
要么根据存储的优先级以及 facility, timestamp, identifier, MESSAGE=
重新创建。
可信字段是指名称以下划线开头的字段。 这些字段由日志守护进程添加,客户端无法掌控这些字段的内容, 因此是"可信的"。
_PID=
, _UID=
, _GID=
¶产生此日志消息的进程的:
PID、UID、GIU ,都是十进制的数字。
注意,通过派生进程的 "stdout
" 或
"stderr
" 获得的日志项中会包含父进程的认证证书
(用于发起到 systemd-journald 的连接)
_COMM=
, _EXE=
, _CMDLINE=
¶产生此日志消息的进程的: 名称、执行路径、命令行
_CAP_EFFECTIVE=
¶产生此日志消息的进程的有效 capabilities(7)
_AUDIT_SESSION=
, _AUDIT_LOGINUID=
¶产生此日志消息的进程的: 审计会话、审计登录UID , 这两个信息由内核的审计子系统负责维护。
_SYSTEMD_CGROUP=
, _SYSTEMD_SLICE=
, _SYSTEMD_UNIT=
, _SYSTEMD_USER_UNIT=
, _SYSTEMD_SESSION=
, _SYSTEMD_OWNER_UID=
¶产生此日志消息的进程的: systemd cgroup路径、systemd slice 单元、 systemd 单元名称(若存在)、 systemd 用户会话单元名称(若存在)、systemd 会话ID(若存在) systemd 用户单元的属主UID 或 产生原始日志消息的进程的systemd会话(若存在)属主UID
_SELINUX_CONTEXT=
¶产生此日志消息的进程的 SELinux 安全上下文(label)
_SOURCE_REALTIME_TIMESTAMP=
¶此日志消息的最早可信时间戳(若可知), 这不同于此消息被接收到的时间。 值是一个整数,。 表示距离1970年1月1日零时(UTC/GMT午夜)的微秒数(比秒更精确)
_BOOT_ID=
¶产生此日志消息时所处的"启动ID", 是一个用小写十六进制字符串表示的 128位无符号整数。
_MACHINE_ID=
¶产生此日志消息的主机的"machine ID", 参见 machine-id(5) 手册。
_SYSTEMD_INVOCATION_ID=
¶产生此日志消息的单元当时所处的运行周期(invocation ID)。
也就是该单元内的进程所能看到的
$INVOCATION_ID
变量的值(参见
systemd.exec(5) 手册)
_HOSTNAME=
¶产生此日志消息的主机的主机名。
_TRANSPORT=
¶此日志消息的 来源:
_STREAM_ID=
¶此字段仅用于 "_TRANSPORT=stdout
" 记录,
表示日志流的唯一ID标识(在创建日志流时自动生成的128位随机ID),每个日志流都拥有一个唯一ID标识。
该字段可用于在日志中标记来自同一个日志流的全部记录。
_LINE_BREAK=
¶此字段仅用于 "_TRANSPORT=stdout
" 记录,
表示来自标准输出流或标准错误流的日志消息并不是以常规的换行符("\n
", ASCII 10)结束的。
具体说来就是:(1) nul
表示以 NUL 字节终止;
(2) line-max
表示因为到达了最大行长度而终止(参见
journald.conf(5)
手册中的 LineMax=
选项);
(3) eof
表示这是日志流中的最后一条记录,并且此日志流没有以常规的换行符终结。
注意,如果日志记录以常规的换行符作为结束标记,
那么将不会生成此字段。
内核字段是指那些 来源于内核的消息所特有的字段。
_KERNEL_DEVICE=
¶内核设备名称。 块设备用 "b主设备号:次设备号" 格式, 字符设备用 "c主设备号:次设备号" 格式, 网络设备用 "n主设备号:次设备号" 格式。 对于其他类型的设备, 则用 "+子系统名称:内核设备名" 格式, 例如: "+platform:rtc_cmos" 或 "+scsi:host0"
_KERNEL_SUBSYSTEM=
¶该设备所属的内核子系统名称。例如: "platform" 或 "scsi"
_UDEV_SYSNAME=
¶该设备在 /sys
中显示的名称。
例如: "rtc_cmos" 或 "host0"
_UDEV_DEVNODE=
¶该设备在 /dev
中的节点路径。
例如:"/dev/bus/usb/002/001"
_UDEV_DEVLINK=
¶在
/dev
中指向此设备节点的额外软连接名称。
此字段可能有多个。
这些字段用于表明 其中的内容来自于其他程序或单元。
systemd-coredump 会使用如下两个字段:
COREDUMP_UNIT=
, COREDUMP_USER_UNIT=
¶用于表明包含内存转储(coredump)的消息 来源于哪个单元(可能是系统单元或用户单元)。参见 coredumpctl(1) 手册。
特权程序(UID=0)可以添加一个
OBJECT_PID=
字段。
这将导致 systemd-journald
根据调用者的行为添加更多的额外字段:
OBJECT_PID=PID
¶此条日志消息所附属的进程的PID
OBJECT_UID=
, OBJECT_GID=
, OBJECT_COMM=
, OBJECT_EXE=
, OBJECT_CMDLINE=
, OBJECT_AUDIT_SESSION=
, OBJECT_AUDIT_LOGINUID=
, OBJECT_SYSTEMD_CGROUP=
, OBJECT_SYSTEMD_SESSION=
, OBJECT_SYSTEMD_OWNER_UID=
, OBJECT_SYSTEMD_UNIT=
, OBJECT_SYSTEMD_USER_UNIT=
¶这些就是
systemd-journald 额外添加的字段,
其含义与如下对应的字段相同(见前文):
_UID=
,
_GID=
,
_COMM=
,
_EXE=
,
_CMDLINE=
,
_AUDIT_SESSION=
,
_AUDIT_LOGINUID=
,
_SYSTEMD_CGROUP=
,
_SYSTEMD_SESSION=
,
_SYSTEMD_UNIT=
,
_SYSTEMD_USER_UNIT=
,
_SYSTEMD_OWNER_UID=
。
在将日志内容转化为外部其他格式(例如 Journal Export Format 或 Journal JSON Format)的时候, 用于对日志消息进行定位的字段将被命名为以双下划线开头的名称。 注意,这些字段并不存在于日志数据库中, 仅用于导出日志时对每条消息进行定位。 在使用例如 sd_journal_send(3) 这样的接口存储日志时也禁止使用这些字段名称,同样的,也不可用于 sd_journal_add_match(3) 接口进行匹配。
__CURSOR=
¶此条日志的游标。 游标是一个文本字符串,类似于该条日志的指纹, 唯一的确定了此条日志的位置, 并且可以跨机器、跨平台、跨日志文件保持唯一性。
__REALTIME_TIMESTAMP=
¶日志收集守护进程接收到该条消息时的
主板硬件时钟时间戳(CLOCK_REALTIME
)。
值是一个整数,
表示距离1970年1月1日零时(UTC/GMT午夜)的微秒数。
注意,该字段与"_SOURCE_REALTIME_TIMESTAMP=
"字段不同,
该字段的值一般略晚于"_SOURCE_REALTIME_TIMESTAMP=
"字段的值,
并且通常是单调递增的。
__MONOTONIC_TIMESTAMP=
¶日志收集守护进程接收到该条消息时的
严格单调递增时间戳(CLOCK_MONOTONIC
)。
值是一个整数,
表示距离此次系统启动以来的微秒数。
与"_BOOT_ID=
"组合使用,
可精确的定位此条日志。