在日常工作中,通过 tail+grep 查看日志,可能是一个程序员最常用的操作之一了。但最近遇到了一个由于Linux全缓冲机制带来的小坑,特此记录一下。
在进行用户行为打点日志文件的实时监控时,遇到这样一个问题:
采用的命令如下:
tail -300f XXX.log | grep "XXX" | grep "YYY"
发现并没有实时grep出符合条件的日志记录,经过排查最后得出结论,原来是Linux中IO的缓冲机制的锅。
于是研究一下缓冲机制
- 无缓冲,就是不使用缓冲机制。
- 行缓冲,缓冲,直到遇到换行符。一般用于终端设备。
- 全缓冲,缓冲,直到buffer满。一般用于块设备。
在全缓冲的情况下,一般来说buffer_size为4096,有些是8192。只有达到buffer_size,才会进行输出。
对应到具体的环境中
- 终端窗口中执行tail命令,是面向终端设备的,会使用行缓冲
- 使用管道时,会变为使用全缓冲,要等到字节数达到buffer_size才会看到输出
全缓冲的Linux操作:
|
>>
【扩展】
-
grep 可以通过–line-buffer 参数设置缓冲模式
tail -f log | grep --line-buffer xxx | grep --line-buffer yyy
-
对于没有提供设置缓冲模式的Linux命令,可通过stdbuf命令设置缓冲模式,例如tcpdump:
stdbuf -oL tcpdump ... | grep ...