持续监控系统期刊

Var*_*dey 5 c linux logging journal systemd

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

  1. 是否可以在没有轮询的情况下监听运行时日志(SD_JOURNAL_RUNTIME_ONLY)?SD_JOURNAL_FOREACH_DATA和sd_journal_get_data对此没有太多说明.
  2. 在您看来,这是一个很好的设计吗?
  3. 有没有办法了解运行时日志转发的位置?我做了"systemctl status systemd-journald.service"并且服务状态正在运行.但是,当我尝试使用sd_journal_open读取日记时,它不会显示任何条目.我可以通过journalctl查看条目.我想这样做而不读取日志文件(通过sniffing/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;                                                                                                  
}        
Run Code Online (Sandbox Code Playgroud)

Var*_*dey 1

我花了一段时间才弄清楚,但问题相当简单。问题在于使用

SD_JOURNAL_RUNTIME_ONLY
Run Code Online (Sandbox Code Playgroud)

journald 存储被指定为持久的

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