持续监控系统期刊

时间:2016-10-19 00:53:58

标签: c linux logging systemd journal

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

  1. 是否可以在不轮询的情况下收听运行时日记(SD_JOURNAL_RUNTIME_ONLY)? SD_JOURNAL_FOREACH_DATA和sd_journal_get_data对此不say much
  2. 在您看来,这是一个很好的设计
  3. 有没有办法了解转发运行时日志的位置?我做了“systemctl status systemd-journald.service”并且服务状态正在运行。但是,当我尝试使用sd_journal_open读取日记时,它不会显示任何条目。我可以通过journalctl查看条目。我想这样做而不读取日志文件(通过sniffing / run / log / journal这是一个unix域套接字)来避免磁盘io。
  4. 以下是我使用的示例代码:

    #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;                                                                                                  
    }        
    

1 个答案:

答案 0 :(得分:1)

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

SD_JOURNAL_RUNTIME_ONLY

journald 存储空间被指定为持久

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