2015-04-17 45 views
4

我的程序輸出信息用這種命令的日誌文件:最新的系統日誌消息被延遲

#include <syslog.h> 

int main(void) 
{ 
    openlog(NULL, LOG_PID | LOG_PERROR, LOG_USER); 
    /* ... */ 
    syslog(LOG_INFO, "My message\n"); 
} 

我也創建以下文件10-myconfig.conf/etc/rsyslog.d

# Create template for exec-name specific output files 
$Template DynaFile,"/var/log/%PROGRAMNAME%.log" 

# Printout format for user log 
$Template UserLogFormat,"%pri-text%: %timegenerated% %syslogtag%%msg:::drop-last-lf%\n" 

# Set user log 
user.* ?DynaFile;UserLogFormat 

正如所料,消息來到/var/log/syslog/var/log/my_program.log

但是,最後一行不會立即顯示在/var/log/my_program.log中。最後一行看起來像是丟失了,但是在一些更多的行到達後,出現丟失的行。

它看起來像是有某種緩衝區,它沒有被刷新到文件,直到完整。我期望至少在每一條新線上都會發生這樣的衝突,因爲printf的確如此,但似乎並不像那樣。

如何確保將日誌消息立即刷新到日誌文件?

回答

1

系統日誌工具的目的是接受可能快速生成的消息,並最終將它們保存在文件中。這樣的設施可以追溯到20世紀50年代的操作系統(可能以前)。

日誌文件沒有最後幾條消息是正常的。消息保存在內核緩衝區中。 dmesg命令訪問內存緩衝區。也許你可以使用它來查看日誌的最新部分?