首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Systemd服务和结构化日志记录

Systemd服务和结构化日志记录
EN

Stack Overflow用户
提问于 2019-04-23 16:14:41
回答 3查看 1.1K关注 0票数 3

我有一个类型为simple的systemd服务。

我希望我的服务能够记录键-值对。

到目前为止,我的简单服务只是使用自定义的键值语法将其日志打印到stdout。

我想避免我的自定义键值语法,它使用一种官方的方式来进行结构化日志记录。

有没有办法在systemd中使用结构化日志?

例如,我的服务将以下内容写入stdout:

代码语言:javascript
复制
{"key1": "value1", "key2": 1234}

如果systemd可以将字符串读取为json,那就太好了。

EN

回答 3

Stack Overflow用户

发布于 2019-05-01 08:59:14

您可以将结构化数据记录到systemd中,然后按原样或json格式查看它

假设我们以json格式记录键值对

代码语言:javascript
复制
systemd-cat -t "struct_logs" echo '{"key1": "value1", "key2": 1234}'

然后我们按原样阅读它们

代码语言:javascript
复制
sudo journalctl -t 'struct_logs' --lines 1 --no-pager

Apr 30 21:46:14 linux-ar struct_logs[17455]: {"key1": "value1", "key2": 1234}

或采用json格式。

代码语言:javascript
复制
sudo journalctl -t 'struct_logs' --lines 1 --no-pager -o json-pretty
{
        "__CURSOR" : "s=b6d07ffffffffff2787cea140a0db88a5;i=db8;b=c9b2132ffffffffe5807625fe;m=9fa5b3f81;t=58fffffff87eab;x=6402818ea7e32a5b",
        "__REALTIME_TIMESTAMP" : "1556671574343339",
        "__MONOTONIC_TIMESTAMP" : "42854989697",
        "_BOOT_ID" : "fffffffffffff24ec7a237b5e5807625fe",
        "PRIORITY" : "6",
        "_MACHINE_ID" : "fffffffffff66c86aaaaaaaaaa",
        "_HOSTNAME" : "linux-ar",
        "_TRANSPORT" : "stdout",
        "_UID" : "1000",
        "_GID" : "100",
        "SYSLOG_IDENTIFIER" : "struct_logs",
        "MESSAGE" : "{\"key1\": \"value1\", \"key2\": 1234}",
        "_PID" : "17455"
}

更进一步,您可以在jq的帮助下恢复准确的日志消息

代码语言:javascript
复制
sudo journalctl -t 'struct_logs' --lines 1 --no-pager -o json-pretty | jq -r '.MESSAGE'
{"key1": "value1", "key2": 1234}

如果用户具有这样做的适当权限,也可以记录自定义密钥。服务应该能够做到这一点

代码语言:javascript
复制
sudo logger --journald <<end
MESSAGE_ID=67feb6ffbaf24c5cbec13c008dd72309
MESSAGE=The dogs bark, but the caravan goes on.
SYSLOG_IDENTIFIER=struct_logs
KEY=bark
VALUE=goes on
end

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2019-05-03 16:56:22

看看Structured logging to journald from within a docker container;如果您想指定自定义字段,您的应用程序应该使用sd_journal_send方法。

如果您的应用程序无法做到这一点,您还可以输出json -这将在MESSAGE字段中结束,然后您可以自己解析。例如,我编写了SystemdJournal2Gelf将日志条目发送到Graylog,它还支持MESSAGE中的json输出,将其作为单独的字段发送到Graylog进行过滤

如果你不想修改应用程序,你可以使用一个单独的脚本-类似这样的脚本:

代码语言:javascript
复制
[Service]
ExecStart=/bin/sh -c '/bin/my-app | while read l; do echo "$l" | logger --journald; done'

如果需要,您甚至可以将json转换为键/值对,或者使用StandardOutput将标准输出发送到一个套接字,在该套接字中,您可以有一个单独的服务侦听。

票数 3
EN

Stack Overflow用户

发布于 2020-02-25 00:53:39

好吧,systemd并没有使从文本流中进行结构化日志记录变得很容易。它希望您对其库进行依赖并使用sd_journal_send (例如,请参阅http://0pointer.de/blog/projects/journal-submit.html )。我还没有发现任何“文本形式”标准允许systemd理解您的行不应该在MESSAGE字段中挤在一起,而应该解释为键-值对。我想一个解决方案是编写一个帮助进程来解析您的stdout,然后调用systemd记录器。然后,您可以通过管道将进程stdout进程导入到

但是,我确实找到了直接连接到日志套接字的this answer。通过巧妙地使用jq,您可以编写利用这一点的东西。但这似乎很奇怪:我不知道systemd是否真的打算在该套接字上保持兼容性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55806921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档