用户界面
log 驱动程序是使用克隆接口 /dev/slog打开的。
每次打开 /dev/slog 都会获取一个单独的流来记录。 为了接收 log 消息,进程必须首先通过使用 I_STR 操作来通知 log 驱动程序是错误记录器还是跟踪记录器。
对于错误记录器, I_STR 操作具有 ic_cmd 参数值 I_ERRLOG ,但没有附带的数据。
对于跟踪记录器, I_STR 操作具有 ic_cmd 参数值 I_TRCLOG,并且必须伴有包含一个或多个 trace_ids 结构的数组的数据缓冲区。 每个 trace_ids 结构指定从中接受消息的中间, sid 和级别字段。 strlog 子例程接受其中间和 sid 字段中的值与 trace_ids 结构中的值完全匹配,且其级别小于或等于 trace_ids 结构中给定的级别的消息。 如果跟踪标识符结构的任何字段中的值为-1,则表示该字段可接受任何值。
一次最多可以有一个跟踪记录器和一个错误记录器处于活动状态。 在记录器进程通过使用 ioctl 操作来标识自身之后, log 驱动程序将开始发送消息,但须遵守先前记录的限制。 这些消息是使用 getmsg 系统调用获取的。 此消息的控制部分包含 log_ctl 结构,此结构指定中间字段, sid 字段,级别字段和标志字段,以及自引导以来提交消息的时间 (以记号计) ,自 1970 年 1 月 1 以来的相应时间 (以秒计) 以及序号。 提供了自 1970 年以来的时间 (以秒为单位) ,以便可以轻松计算消息的日期和时间; 提供了自引导以来的时间 (以刻度为单位) ,以便可以确定 log 消息的相对计时。
为错误日志记录和跟踪日志记录流保留不同的序号,以便可以确定消息序列中的间隔。 (在高消息流量期间,记录器可能不会传递某些消息以避免占用系统资源。) 消息的数据部分包含格式字符串的未展开文本 (以 null 结束) ,后跟格式字符串的自变量 (最多由 NLOGARGS 值指定的数字) ,在格式字符串后面的第一个字边界上对齐。
进程还可以将同一结构的消息发送到 log 驱动程序,即使它不是错误或跟踪记录器也是如此。 接受的消息控制部分中 log_ctl 结构的唯一字段是级别和标志字段。 所有其他字段都由 log 驱动程序填写,然后再转发到相应的记录器。 数据部分必须包含以 null 结束的格式字符串,并且任何自变量 (最多为 NLOGARGS) 必须在格式字符串结束后的下一个字边界上各打包一个字。
当给定类型的日志记录进程已存在时,尝试发出 I_TRCLOG 或 I_ERRLOG 操作会导致返回 ENXIO 错误。 同样,对于没有任何 trace_ids 结构的 I_TRCLOG 操作,或者对于任何无法识别的 I_STR 操作,将返回 ENXIO 。 将以静默方式忽略用户进程发送到驱动程序的格式不正确的日志消息 (无错误结果)。