它实际上取决于缓冲区的位置:如果应用程序使用自己的日志记录缓冲区,则无法强制刷新.
如果缓冲是由C库完成的,那么您可以使用LD_PRELOAD来禁用缓冲.假设程序使用fopen()打开其日志文件,您可以执行以下操作:
#define _GNU_SOURCE 1
#include
#include
static FILE* (*libc_fopen)(char const *, char const *);
FILE * fopen(char const *name, char const *mode) {
FILE *ret;
if (!libc_fopen)
libc_fopen = dlsym(RTLD_NEXT, "fopen");
ret = libc_fopen(name, mode);
if (!ret)
return ret;
setvbuf(ret, NULL, _IONBF, 0);
return ret;
}
编译为共享库,然后使用LD_PRELOAD“注入”程序:
LD_PRELOAD=./nobuffering.so myprogram
如果需要,还可以检查文件名,并仅为您感兴趣的日志文件更改缓冲.