持续监控 Systemd 日志
Continuously monitor Systemd Journals
我正在使用 systemd 日志创建自定义日志处理程序。我正在尝试使用 sd_journal API,但我有几个问题:
- 是否可以在不轮询的情况下收听运行时日志 (SD_JOURNAL_RUNTIME_ONLY)? SD_JOURNAL_FOREACH_DATA 和 sd_journal_get_data 没有 say much 关于这个。
- 在您看来,这个设计好吗?
- 有没有办法了解运行时日志转发到哪里?我做了"systemctl status systemd-journald.service",服务状态是运行。但是,当我尝试使用 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: %s\n", 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("%.*s\n", (int)l, (const char*) d);
count++;
}
sd_journal_close(jd);
printf ("# of Journal entries read: %d\n", count);
} while (0);
return 0;
}
我花了一段时间才弄清楚,但问题相当简单。问题在于使用
SD_JOURNAL_RUNTIME_ONLY
而 journald
存储 被指定为 持久性 。
对我来说,non-intuitive 持久日志不会进入运行时日志缓冲区。所以要想模拟journalctl -f
的功能,就只能打开本地期刊找尾巴了。
我正在使用 systemd 日志创建自定义日志处理程序。我正在尝试使用 sd_journal API,但我有几个问题:
- 是否可以在不轮询的情况下收听运行时日志 (SD_JOURNAL_RUNTIME_ONLY)? SD_JOURNAL_FOREACH_DATA 和 sd_journal_get_data 没有 say much 关于这个。
- 在您看来,这个设计好吗?
- 有没有办法了解运行时日志转发到哪里?我做了"systemctl status systemd-journald.service",服务状态是运行。但是,当我尝试使用 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: %s\n", 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("%.*s\n", (int)l, (const char*) d);
count++;
}
sd_journal_close(jd);
printf ("# of Journal entries read: %d\n", count);
} while (0);
return 0;
}
我花了一段时间才弄清楚,但问题相当简单。问题在于使用
SD_JOURNAL_RUNTIME_ONLY
而 journald
存储 被指定为 持久性 。
对我来说,non-intuitive 持久日志不会进入运行时日志缓冲区。所以要想模拟journalctl -f
的功能,就只能打开本地期刊找尾巴了。