2016-10-19 1 views
4

Я работаю с журналами systemd для создания специальной программы обработки журналов. Я пытаюсь работать с sd_journal API, но у меня есть несколько вопросов:Постоянно отслеживать журналы Systemd

  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.

Вот пример кода, я использую:

#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

'' 'journalctl -f''' не делает то, что вам нужно? Это весь поток системных журналов на stdout для вас. Если нет, возможно, вы могли бы точно описать, какую информацию вам нужно извлечь из журнала. – jforberg

+0

Journalctl собирает все журналы. В моем случае некоторые привилегированные журналы из журнала нуждаются в дальнейшей обработке и массировании для других подсистем. Мое требование - – VarunPandey

+0

. В отношении данного вопроса, попросите напрямую обратиться к одному из каналов связи проекта systemd. –

ответ

1

Это мне потребовалось некоторое время, чтобы выяснить, но проблема была довольно проста. Проблема заключалась в использовании

SD_JOURNAL_RUNTIME_ONLY 

в то время как journaldхранения был определен как персистирующей.

Для меня это было неинтуитивно, что постоянные журналы не переходят в буфер журнала выполнения. Таким образом, единственный способ имитировать функциональность journalctl -f - это открыть местные журналы и искать хвост.

+0

Не могли бы вы мне помочь. Я пытаюсь воспроизвести функциональность 'journalctl -no-pager -u myservice'. Но ваши примеры всегда печатают« Количество записей в журнале: 0 ». –

Смежные вопросы