我正在使用系统日志来创建自定义日志处理程序。我正在尝试使用sd_journal API,但是我有几个问题:

  • 是否可以在不轮询的情况下监听运行时日志(SD_JOURNAL_RUNTIME_ONLY)? SD_JOURNAL_FOREACH_DATA和sd_journal_get_data与此无关。
  • 在您看来,这是一个好的设计吗?
  • 是否有一种方法可以了解,将运行时日志转发到哪里?我做了“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 存储被指定为持久

    对我来说,持久日志不会进入运行时日志缓冲区是不直观的。因此,模拟journalctl -f功能的唯一方法是打开本地日志并查找尾部。

    关于持续监控系统日记帐,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40120363/

    10-09 12:52