Linux
使用 nohup 替換日誌文件而不影響“重定向標準輸入和標準輸出”
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 執行的網路伺服器,並將所有內容輸出到一個名為的文件中**
production.log
,並且正在向它寫入大約(+10GB)的數據和資訊,我想以一種方式截斷它,以在其中保留一些近期的日誌和數據它,但擺脫舊數據。因此,我大致猜測將最後 30,000 行拖尾輸出到一個名為的新文件中production.log.1
,然後將其移回並替換為production.log
**例子:
tail -30000 production.log > production.log.1 && mv production.log.1 production.log
現在,當我嘗試它時,
tail -f production.log
它永遠不會從網路伺服器輸出任何新內容,而是只會在我設法替換文件之前一直顯示最後一個時間戳日誌。網路伺服器只是停止寫入它。有沒有更好或更好的方法可以在不寫入不同文件的情況下做到這一點?我需要擺脫這個站點的舊數據,同時保持 2>&1 從網路伺服器輸出到它。
確保將輸出附加到文件中,即使用
>>
而不是>
.接下來,您可以使用“複製和截斷”來保留日誌:
cp production.log production.log.1 && cp /dev/null production.log
複製命令完成並執行日誌文件截斷的時間視窗很小,因此您可能會失去一些日誌,但這不能避免。
請注意,該實用程序
logrotate
有一個特殊指令來執行此操作:copytruncate
.使用追加而不是簡單地重定向的要點是,否則寫入日誌文件的程序可能會記住它的寫入偏移量,因此如果日誌文件大小為例如 2MB,並且您截斷文件,並且程序再次寫入,您可能會結束使用具有 2MB 空塊的稀疏日誌文件,然後再次記錄日誌。