以下を使用してログファイルの行数を制限しようとしています。
php $PWD/private_html/run_worker.php | head -n 20000 >> $PWD/private_html/data/logfile.txt 2>&1 &
"|head -n 20000" なしでコマンドを実行すると、出力がリダイレクトされます。ただし、制限コードを含めるとログには何も記録されません。
どんな助けでも大変感謝します。
ベストアンサー1
バッファリングを受ける
まず、基本的にバッファリングがある可能性があり、非終端非標準エラーの出力はブロックバッファリングされます(それぞれvbuf(3) 設定)したがって、バッファがいっぱいになるまで(または何かがクラッシュするか、致命的な信号を食べる場合はまったくログが表示されなくなるまで)、ログを見ることができると期待してはいけません。テストには2つの端末を使用するのが最善です。 1つはコマンドを実行し、もう1つは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行」が不足しているように見え、代わりにサイズによって制限されます。