Có cách nào để xóa các N
dòng đầu tiên khỏi nhật ký đang được ứng dụng tích cực bổ sung không?
Có cách nào để xóa các N
dòng đầu tiên khỏi nhật ký đang được ứng dụng tích cực bổ sung không?
Câu trả lời:
Không, các hệ điều hành như Linux và đó là các hệ thống tệp, không cung cấp quy định để xóa dữ liệu khỏi phần đầu của tệp. Nói cách khác, điểm bắt đầu lưu trữ cho một tệp được cố định.
Việc xóa các dòng từ đầu tệp thường được thực hiện bằng cách ghi dữ liệu còn lại vào một tệp mới và xóa dữ liệu cũ. Nếu một chương trình mở tệp cũ để ghi, việc xóa tệp đó sẽ bị hoãn cho đến khi ứng dụng đóng tệp.
Như các nhà bình luận đã lưu ý, vì những lý do được đưa ra trong câu trước của tôi, bạn thường cần phối hợp cắt tỉa logfile với các chương trình đang viết nhật ký. Chính xác làm thế nào bạn làm điều này phụ thuộc vào các chương trình. Một số chương trình sẽ đóng và mở lại các logfile của chúng khi bạn gửi cho chúng một tín hiệu (ví dụ HUP) và điều này có thể được sử dụng để ngăn các bản ghi nhật ký được ghi vào logfile 'đã xóa, mà không làm gián đoạn dịch vụ.
Có nhiều tiện ích có sẵn để quản lý kích thước của tệp nhật ký, ví dụ: logrotate
Một số chương trình có tiện ích riêng của họ. Ví dụ, máy chủ web Apache bao gồm tiện ích rotatelogs .
Tôi nghĩ rằng nhiệm vụ này có thể đạt được với sed
sed -i '1,10d' myfile
sẽ xóa các dòng từ dòng thứ 1 đến dòng thứ 10 tạo thành tệp.
Tôi nghĩ rằng tất cả mọi người ít nhất nên có một cái nhìn vào sed 1 lót này .
Lưu ý rằng điều này không hoạt động đối với các logfiles đang được ứng dụng tích cực thêm vào (như đã nêu trong câu hỏi).
sed -i
sẽ tạo một tệp mới và 'xóa' tệp đang được ghi vào. Hầu hết các ứng dụng sẽ tiếp tục ghi các bản ghi nhật ký vào tệp nhật ký đã xóa và sẽ tiếp tục lấp đầy không gian đĩa. Tệp nhật ký mới, bị cắt ngắn sẽ không được thêm vào. Điều này sẽ chỉ dừng lại khi ứng dụng được khởi động lại hoặc được báo hiệu để đóng và mở lại các tệp nhật ký của nó. Tại thời điểm đó sẽ có một khoảng cách (thiếu bản ghi nhật ký) trong tệp nhật ký mới nếu có bất kỳ hoạt động có thể đăng nhập nào giữa việc sử dụng sed và khởi động lại ứng dụng.
Một cách an toàn để làm điều này sẽ là tạm dừng ứng dụng, sử dụng sed để cắt bớt nhật ký, sau đó khởi động lại ứng dụng. Cách tiếp cận này có thể không được chấp nhận đối với một số dịch vụ (ví dụ: máy chủ web có thông lượng cao và yêu cầu liên tục dịch vụ cao)
sed -i
tạo một tệp mới với nội dung được chỉnh sửa và tệp cũ bị xóa để bạn không chỉnh sửa tệp đang hoạt động: $ ls -i --- 6823554 testfile --- $ sed -i 's/test/final/' testfile --- $ ls -i --- 6823560 testfile
------ Vui lòng kiểm tra cách sed -i
hoạt động. Tại sao câu trả lời sai này có rất nhiều upvote?
Không. Một giải pháp cho vấn đề chung về tăng trưởng tệp nhật ký này là xoay vòng nhật ký. Điều này liên quan đến việc di chuyển thường xuyên (hàng đêm hoặc hàng tuần, thông thường) của một tệp nhật ký hiện có sang một số tên tệp khác và bắt đầu mới với một tệp nhật ký trống. Sau một thời gian các tệp nhật ký cũ bị vứt đi.
Xem: http://www-uxsup.csx.cam.ac.uk/~jw35/cifts/apache/html/x1670.htm
Đây là một câu trả lời , không phải là một giải pháp. KHÔNG có giải pháp cho câu hỏi. Người hỏi nêu rõ: "từ một bản ghi đang được ứng dụng tích cực bổ sung ". Bạn có thể đọc để hiểu thêm và bỏ qua đến cuối cho một gợi ý tôi đưa ra dựa trên giả định của tôi tại sao mã này không tuân theo các thực tiễn tốt nhất về ghi nhật ký.
Để rõ ràng: "câu trả lời" khác ở đây đưa ra lời hứa sai . Không có số lượng đổi tên sẽ lừa ứng dụng sử dụng tệp mới. Thông tin hữu ích nhất được chôn vùi trong các bình luận được đưa ra cho những câu trả lời không chính xác này.
Các tệp ACTIVE không phải là một loại container mà bạn chỉ cần đặt dữ liệu vào. Một tên tệp trỏ đến MỘT inode (bắt đầu của tệp) và mỗi inode có một con trỏ đến một inode khác (nếu có nhiều dữ liệu hơn). Điều đó có nghĩa là một tệp được ghi liên tục có một luồng liên tục được thêm vào nó và những gì bạn nghĩ về "tệp" thực sự là một chuỗi nhật ký của các nút.
Hãy tưởng tượng bạn đang theo dõi ai đó trên Google Maps và người đó có thể dịch chuyển tức thời ở bất cứ đâu trên thế giới, bất cứ lúc nào và bạn đang cố gắng kết nối những dấu chấm này.
Công cụ Linux "cắt ngắn" có thể loại bỏ dữ liệu ở cuối tệp, chỉ bằng cách đi bộ cây inode và (tại vị trí / kích thước bạn chỉ định), nó sẽ loại bỏ tất cả các con trỏ tiếp theo trong ngăn xếp. Để thực hiện ngược lại - loại bỏ dữ liệu khi bắt đầu tệp - sẽ là một quá trình phức tạp và rủi ro khủng khiếp như vậy khi viết lại cây inode trong thời gian thực mà không ai sẽ viết các công cụ đó cho công chúng, bởi vì chúng thường thất bại và dẫn đến mất dữ liệu. Các Inodes wiki là ngắn nhưng giải thích một số các khái niệm.
** Lời khuyên của tôi: lật lại vấn đề này - TẠI SAO ứng dụng này hoạt động theo cách này? Có nhiều cách ghi nhật ký tốt nhất nhưng thường được gắn với hệ thống ghi nhật ký của bạn thực sự là gì (syslog, v.v.). Về cốt lõi, một ứng dụng dự kiến sẽ "giải phóng" nó xử lý vào tệp, vì vậy logrotate (vv) có thể xử lý thêm dữ liệu cũ.
Bất cứ khi nào tôi nghe "đến một logfile HOẠT ĐỘNG", tôi ngay lập tức yêu cầu người đó kể cho tôi "câu chuyện đặc biệt" đằng sau ứng dụng này. Thông thường đó là "nhà phát triển thoát và chúng tôi không thể thay đổi mã. Đây thực sự là nghịch đảo của an toàn, có rủi ro riêng. Nhưng tôi hiểu bạn muốn một giải pháp tránh chạm vào mã nguồn. Nếu đây là trường hợp, một câu hỏi cụ thể hơn là cần thiết.
Mở văn bản cao siêu Xóa các dòng và lưu tệp hoạt động bằng cách nào đó, ngay cả khi tệp đang được nối thêm, nhưng tôi đến đây để tìm kiếm giải pháp cho giải pháp dòng lệnh, vì vậy tôi sẽ để giải pháp này hoạt động nhưng vô dụng ở đây !!
Có thể sao chép, cắt bớt, nối đuôi bản sao lại với kích thước = 0 cắt bớt và xóa bản sao?
Tốt hơn là đuôi để sao chép đuôi, cắt ngắn bản gốc, sao chép đuôi đuôi vào bản gốc.
Bạn nhận được các dòng trong nhật ký ở độ dài đuôi để tốt hơn giới hạn độ dài byte.
Sửa đổi chi tiết từ bình luận:
Đầu tiên chúng tôi có một tập lệnh logger trong Python3 bất cứ điều gì bạn muốn
from time import sleep
idx = 0
while 1 == 1:
idx = (idx + 1)
lf = open('tailTrunc.log', 'a')
lf.write("line to file " + str(idx) + '\n')
lf.close()
sleep(0.01)
Sau đó, chúng tôi có cắt ngắn của chúng tôi
#!/usr/bin/env bash
trap "kill 0" EXIT
rm tailTrunc.log
touch tailTrunc.log
python3 logLoop.py &
loggerPID=$!
sleep 1
kill -STOP $loggerPID
tail -10 tailTrunc.log > trimEnd.log
truncate -s 0 tailTrunc.log
kill -CONT $loggerPID
sleep 1
trimEnd.log hiển thị 80 đến 89
nhật ký hiển thị 90 để kết thúc
Dù sao đi nữa, sẽ có một cách.
Nhiều ví dụ phức tạp hơn về trình hợp nhất và cách ghi hoặc mở luồng ghi có thể cần điều chỉnh cho mỗi lõi cpu, v.v. chỉ cần tạm dừng ghi và xếp hàng nếu bạn có thể trong trình ghi nhật ký của quá trình ghi nhật ký, v.v.