我正在使用systemd日志创建一个自定义日志处理程序。我正试图与sd_journal api工作,但我有几个问题:
- 是否可以在没有轮询的情况下侦听运行时日志 (SD_JOURNAL_RUNTIME_ONLY) ?SD_JOURNAL_FOREACH_DATA和sd_journal_get_data并没有说明这一点。
- 在你看来,这是一个好的设计吗?
- 是否有一种方法来理解在哪里运行时日志被转发?我写了systemctl status systemd-journal。Service",服务状态为running。但是,当我试图使用sd_journal_open读取日志时,它不显示任何条目。我可以通过journalctl查看条目。我想这样做,而不读取日志文件(通过嗅探/run/log/journal,这是一个unix域套接字),以避免磁盘io。
下面是我使用的示例代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <systemd/sd-journal.h>
#include <systemd/sd-daemon.h>
int main(int argc, char *argv[]) {
int ret_val = 0;
int count = 0;
sd_journal *jd;
sd_journal_print(LOG_INFO, "Hello World, this is PID %lu!", (unsigned long) getpid());
do {
ret_val = sd_journal_open (&jd, SD_JOURNAL_SYSTEM | SD_JOURNAL_RUNTIME_ONLY | SD_JOURNAL_LOCAL_ONLY);
if (ret_val != 0) {
fprintf(stderr, "Failed to open journal: %sn", strerror(-ret_val));
break;
}
printf ("Current Journal was loaded successfully!n");
const void *d;
size_t l;
SD_JOURNAL_FOREACH_DATA (jd, d, l) {
printf("%.*sn", (int)l, (const char*) d);
count++;
}
sd_journal_close(jd);
printf ("# of Journal entries read: %dn", count);
} while (0);
return 0;
}
我花了一段时间才弄清楚,但问题相当简单。问题在于
的使用SD_JOURNAL_RUNTIME_ONLY
,而journald
存储指定为persistent。
对我来说,持久日志不去运行时日志缓冲区是不直观的。因此,模拟journalctl -f
功能的唯一方法是打开本地期刊并寻找尾部。