2016-10-19 95 views
4

我正在使用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查看條目。我想在不讀日誌文件的情況下(通過嗅探/運行/日誌/日誌這是一個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'''不會做你需要的嗎?這就是整個系統日誌爲你輸出標準輸出。如果沒有,也許你可以準確地描述你需要從日誌中提取什麼樣的信息。 – jforberg

+0

Journalctl確實收集所有日誌。就我而言,某些來自日誌的特權日誌需要進一步處理並按照其他子系統進行處理。我的要求是 – VarunPandey

+0

對於這個特定的問題,可以考慮直接通過一個systemd項目通信通道詢問。 –

回答

1

我花了一段時間才能弄清楚,但問題是相當簡單的。問題是在使用

SD_JOURNAL_RUNTIME_ONLY 

journald存儲被指定爲持續

對我來說,持久性日誌不會去運行時日誌緩衝區是非直觀的。因此,模擬journalctl -f功能的唯一方法是打開本地期刊並尋找尾部。

+0

你能幫我嗎。我試圖重現'journalctl --no-pager -u myservice'的功能,但是你的例子總是打印「日誌條目數爲0」。 –