リダイレクトを使用して、ジョブprintln
出力をxxx.log
ファイルに書き込みます。しかし、ログ情報をcrontabを介して現在の日付名を持つ別のファイルに移動したいと思います2017-08-18.log
。
> xxx.log
シェルコマンドを使用してファイルを消去しようとしましたが、xxx.log
新しいログが作成されるとすべてが復元されます。
リダイレクトログファイルを消去する方法は?
修正する
- 実行後の
> xxx.log
ファイルxxx.log
サイズは0です。しかし、私のアプリケーションがいくつかの新しいログを印刷すると、新しいxxx.log
ログ情報だけでなく、以前に消去されたログ情報も含まれます。 - 使用後は
mv xxx.log xxx2.log
新しいログ情報が記録されますxxx2.log
。ただし、名前変更の代わりに使用すると、rm xxx.log
ログ操作は停止します。またnohup java -jar xxx.jar > xxx.log 2>&1 &
、おなじみの場合は、次の手順に従ってください。ゲームフレームワーク、ファイルビルドを実行すると、dist
コマンドによってjarファイルが生成されます。 ps wx|grep "xxx.*.log
出力:
1)3912 pts/10 S+ 0:00 grep --color=auto xxx.log
2)26234 pts/10 Sl 0:16 /usr/lib/jvm/jdk1.8.0_111/bin/java -Duser.dir=...something ignored... play.core.server.ProdServerStart
(プロセス実行命令)
お役に立てば幸いです。もう一度ありがとうございます!
ベストアンサー1
問題は、ログファイルを作成するアプリケーションによってログファイルが開いていることです。ファイル()を切り捨てると、> file.log
アプリケーションは最後に作成された場所から書き込みを続けます(切り捨てのため、以前はファイルがゼロバイトで埋められると仮定します)。ファイルを移動すると、ファイルが開かれると名前は重要ではなくなり、アプリケーションはファイルに書き込みを続けます。ファイルを削除すると、そのブロックはディスクから解放されず、ファイルがディレクトリに表示されなくなった場合でも、アプリケーションはブロックに書き込みを続けます。
これは古典的なシーンです。あなたの申請書は以下を満たす必要があります。
- 定期的にログファイルを再度開く
- または、切り捨てを検出して再度開きます。
- または、「現在のログファイルを閉じて再度開く」という特別なシグナルを待ちます。
そうしないと、アプリケーションを再起動する以外に外部で何もできません。その後、次のように進みますlogrotate
。
- まず、ログファイルを新しい名前に移動します。
- オプションで、
touch
ログファイルの古い名前を使用してファイルが存在するようにします。 - 古いログファイルの書き込みを強制的に停止し、新しいログファイルの書き込みを開始するには、アプリケーションを再起動します。