production.log
[2019-02-11 10:18:18] GET /
[2019-02-11 11:18:19] POST blavadasdasdgd
...
... <--- A lot of in between logs and other data
...
[2019-02-12 11:18:20] INFO ::HTTPServer#start: pid=21378 port=4567
[12/Mar/2019:11:18:25 +0200] "GET / HTTP/1.1" 404 458 0.0086
[12/Mar/2019:11:18:26 EET] "GET / HTTP/1.1" 404 458 - -> /
[12/Mar/2019:11:18:27 +0200] "GET /" 200 18893 0.0020
[2019-03-12 11:18:28] GET /
[2019-03-12 12:18:29] POST blablabla
...
... <--- A lot of in between logs and other data
...
[13/Mar/2019:11:18:30 +0200] "GET / HTTP/1.1" 404 458 0.0086
[13/Mar/2019:11:18:31 EET] "GET / HTTP/1.1" 404 458 - -> /
[13/Mar/2019:11:18:32 +0200] "GET /" 200 18893 0.0020
...
... <--- A lot of in between logs and other data
...
[2019-03-14 11:19:18] GET /
ファイルの内容は偽です(ただし、タイムスタンプの順序は正しいです)年をとる到着最新)
私はnohupを介して実行され、すべてを次のファイルに出力するWebサーバーを持っています。production.log
約(+10 GB)のデータと情報がここに記録されており、多くの最新のログとデータを維持するために何らかの方法で切り取り、古いデータを削除したいと思います。だから私のおおよその推測は、最後の30,000行を取得し、次の新しいファイルに出力することです。production.log.1
その後、もう一度移動して交換します。production.log
例:
tail -30000 production.log > production.log.1 && mv production.log.1 production.log
今試してもtail -f production.log
何も出力されません。新しいWebサーバーからインポートされましたが、ファイルを置き換える前の最後のタイムスタンプログのみが表示されます。 Web サーバーが書き込みを停止します。
他のファイルに書き込むことなくこれを行うより良い方法と良い方法はありますか? Webサーバーからサイトへの2>&1出力を維持しながら、サイトの古いデータを削除する必要があります。
ベストアンサー1
確実にする追加ファイルの出力、つまり use >>
and not です>
。
次に、「コピーと切り取り」を使用してログを保存できます。
cp production.log production.log.1 && cp /dev/null production.log
コピーコマンドが完了し、ログファイルの切り捨てを実行するのに少し時間がかかるため、一部のログが失われる可能性がありますが、これは避けられません。
このユーティリティには、logrotate
これを行うための特別なガイドラインがありますcopytruncate
。
単にリダイレクトする代わりに追加を使用することの重要な点は、そうでなければログファイルに書き込むプログラムが書き込みオフセットを覚えている可能性があることです。したがって、たとえば、ログファイルのサイズが2 MBでファイルを切り捨ててプログラムが書き換えると、最終的に2 MBの空のブロックを含む希少ログファイルが作成され、再記録されます。