限制日志文件大小

埃里克

我正在尝试使用以下方法限制日志文件中的行数:

php $PWD/private_html/run_worker.php | head -n 20000 >> $PWD/private_html/data/logfile.txt 2>&1 &

如果运行不带“ | head -n 20000”的命令,则输出将被重定向。但是,当我包含限制代码时,没有任何内容写入日志。

任何帮助,将不胜感激。

遭受缓冲

首先,可能会有缓冲;默认情况下,输出到not-terminal-not-standard-error的数据是块缓冲的(每个setvbuf(3)),因此,在缓冲区被填满之前,不应期望看到任何日志(或者当某些东西崩溃或吃掉致命的东西时根本不希望看到任何日志)信号)。最好使用两个终端进行测试,一个终端运行命令,另一终端运行tail -f输出文件:

# terminal watcher (how do the log lines appear in the logfile?)
rm logf; touch logf; tail -f logf

# terminal test commands (feed logfile)
php -r 'while(1){echo "logline\n";sleep(1);}' >> logf
...
^C
perl -E 'while(1){say "logline";sleep 1}' >> logf
...
^C

由此看来(至少在我的系统上)PHP没有阻止缓冲区标准输出,这与默认设置有所不同。但是,head它会缓冲,stdbuf但无济于事,因为所有日志行都成簇出现:

php -r 'while(1){echo "logline\n";sleep(1);}' | head -7 >> logf
php -r 'while(1){echo "logline\n";sleep(1);}' | stdbuf -o 0 -- head -7 >> logf

因此head,可能不是执行此任务的正确工具。(请注意,各种应用程序都将在内部进行缓冲,因此,无论发生什么可怕的事情,stdbuf都可能无济于事:

stdbuf -o 0 perl -E 'while(1){say "logline";sleep 1}' >> logf
perl -E 'STDOUT->autoflush;while(1){say "logline";sleep 1}' >> logf

如果有可能,请在应用程序本身中设置适当的缓冲。)

至于原木

对日志行进行硬限制将需要消耗N行的内容,但随后保持打开状态(或者应用程序随后被杀死,或者...?):

php -r 'while(1){echo "logline\n";sleep(1);}' 2>&1 \
| perl -ne 'BEGIN{STDOUT->autoflush; $N=7 } if($N>0){print;$N--}' >> logf

或者这可以使用PHP在内部完成,假设所有日志都可以通过处理该任务的功能或日志记录模块或框架进行路由。否则,有很多工具可以将标准输出的日志记录下来,其中包含不同级别的选项和学习曲线,尽管这些工具似乎缺少“ N条线”,而是根据大小设置了上限。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章