首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连续监控系统期刊

连续监控系统期刊
EN

Stack Overflow用户
提问于 2016-10-19 00:53:58
回答 1查看 2.2K关注 0票数 5

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

  1. 可以不轮询地监听运行时日志 (SD_JOURNAL_RUNTIME_ONLY)吗?SD_JOURNAL_FOREACH_DATA和sd_journal_get_data在这件事上没有说得多
  2. 在您看来,这是一个很好的设计
  3. 是否有一种方法可以理解,运行时日志在哪里被转发?我做了"systemctl状态systemd-日记. service“,并且服务状态正在运行。然而,当我试图使用sd_journal_open阅读日记时,它并没有显示任何条目。我可以通过日志看到条目。为了避免磁盘io,我想在不读取日志文件的情况下这样做(通过嗅探/run/log/journal,这是unix域套接字)。

下面是我使用的示例代码:

代码语言:javascript
复制
#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;                                                                                                  
}        
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-11 00:53:58

我花了一段时间才弄明白,但问题相当简单。问题是在使用

代码语言:javascript
复制
SD_JOURNAL_RUNTIME_ONLY

journald 存储被指定为持久

对我来说,持久性日志不会进入运行时日志缓冲区,这是不直观的。因此,模拟journalctl -f功能的唯一途径就是打开本地期刊,寻找尾巴。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40120363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档