函数
GLiblog_structured
自版本:2.50 起
声明 [src]
void
g_log_structured (
const gchar* log_domain,
GLogLevelFlags log_level,
...
)
说明 [src]
使用结构数据记录一条消息。
消息将通过应用程序使用 g_log_set_writer_func()
设置的日志写入器进行传递。如果消息具有致命性(即其日志级别为 G_LOG_LEVEL_ERROR
),程序会在该函数的末尾调用 G_BREAKPOINT()
来中止。如果日志写入器返回 G_LOG_WRITER_UNHANDLED
(失败),则不会尝试其他任何备用写入器。有关链接写入器的信息,请参阅 GLogWriterFunc
的文档。
结构数据以键-值对的形式提供,其中键是 UTF-8 字符串,值是任意指针,通常指向 UTF-8 字符串,但这并不是一个要求。要传递二进制(非空终止)结构数据,请使用 g_log_structured_array()
。结构数据的键应遵循 systemd 日志字段 规范。建议根据设置它们代码对自定义键进行命名空间划分。例如,GLib 中的所有自定义键都具有 GLIB_
前缀。
请注意,预计为 UTF-8 字符串的键(尤其是 "MESSAGE"
和 "GLIB_DOMAIN"
)在 GLib 版本 2.74.1 之前必须作为空终止 UTF-8 字符串传递,因为默认日志处理程序并不会考虑 GLogField
的长度。从 GLib 2.74.1 开始,已修复这个问题,可以不使用空终止 UTF-8 字符串传递其正确长度,但 "GLIB_DOMAIN"
除外,它在 GLib 2.82.3 中才得到修复。
log_domain
会转换为 GLIB_DOMAIN
字段。log_level
会转换为 PRIORITY
字段。格式字符串的占位符会替换为提供的值,并转换为 MESSAGE
字段。
你可能通常希望传递到该函数的其他字段
请注意,如果在包含 glib.h
之前定义了符号 G_LOG_USE_STRUCTURED
,则日志记录宏(例如 G_DEBUG_HERE()
、g_message()
、g_warning()
、g_critical()
、g_error()
等)会自动设置 CODE_FILE
、CODE_LINE
和 CODE_FUNC
。
例如
g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
"MESSAGE_ID", "06d4df59e6c24647bfe69d2c27ef0b4e",
"MY_APPLICATION_CUSTOM_FIELD", "some debug string",
"MESSAGE", "This is a debug message about pointer %p and integer %u.",
some_pointer, some_integer);
请注意,每个 MESSAGE_ID
必须 唯一且随机生成。如果添加 MESSAGE_ID
,请考虑随软件一起发布 消息目录。
要将用户数据指针传递到特定于此日志记录调用的日志记录器函数,必须使用 g_log_structured_array()
并将指针作为字段传递,其中 GLogField.length
设为零,否则将其解释为字符串。
例如
const GLogField fields[] = {
{ "MESSAGE", "This is a debug message.", -1 },
{ "MESSAGE_ID", "fcfb2e1e65c3494386b74878f1abf893", -1 },
{ "MY_APPLICATION_CUSTOM_FIELD", "some debug string", -1 },
{ "MY_APPLICATION_STATE", state_object, 0 },
};
g_log_structured_array (G_LOG_LEVEL_DEBUG, fields, G_N_ELEMENTS (fields));
另请注意,即使未指定其他结构化字段,也必须在格式字符串之前始终存在一个 MESSAGE
键。MESSAGE
格式对必须是键值对的最后一个,而 MESSAGE
是唯一支持 printf()
格式化的字段。
stdout
和 stderr
的默认 writer 函数会在消息后自动附加一个换行符,因此不应手动添加一个到格式字符串中。
自 2.50 起可用
此函数不可直接用于语言绑定。
参数
log_domain
-
类型:
const gchar*
日志域,通常为
G_LOG_DOMAIN
。数据由函数调用者所有。 该值为以 NULL 终止的 UTF-8 字符串。 log_level
-
类型:
GLogLevelFlags
日志级别,可以是
GLogLevelFlags
中的级别,也可以是用户自定义级别。 ...
-
类型:
要添加到日志条目的结构化数据的键值对,后面是键
MESSAGE
,再后面是printf()
样式的消息格式,以及要插入到格式字符串中的参数。