Xóa N dòng đầu tiên khỏi tệp nhật ký hoạt động


26

Có cách nào để xóa các Ndò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:


10

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 .


3
Nhưng bạn không nên làm điều này trong khi một cái gì đó vẫn mở tệp và vẫn đang nối thêm vào nó, bởi vì nó sẽ ghi vào tệp hiện đã bị xóa và bạn sẽ mất các thông điệp tường trình đó.
Tarnay Kálmán

Thật. Ngay cả khi bạn đã sử dụng cùng tên tệp.
Hennes

quá tệ, hệ điều hành không cho phép bạn, điều đó chắc chắn sẽ thuận tiện cho người quay vòng log không phải tải lại các quy trình sau khi quay: |
rogerdpack

25

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 -isẽ 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)


2
Bạn có biết những gì xảy ra với các ứng dụng đang nối thêm?
Adam Matan

1
Chúng ta hãy giả sử một trình xử lý tệp mở bình thường nối các dòng và tuôn ra mọi lúc.
Adam Matan

1
Tôi biết cách của mình xung quanh sed, và trích xuất các dòng vào một tệp mới là không có trí tuệ với sed. Vấn đề là giữ tất cả trong cùng một tệp.
Adam Matan

10
Không, điều này không nên làm việc. sed -itạ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 -ihoạt động. Tại sao câu trả lời sai này có rất nhiều upvote?
pabouk

1
Câu hỏi nêu rõ "từ một nhật ký đang được ứng dụng tích cực bổ sung". Từ hoạt động là "tích cực". Có lẽ sự làm rõ đó đã được thêm vào sau khi câu trả lời của bạn xuất hiện. Nhưng như hiện tại, những độc giả bị thu hút bởi "hầu hết những người ủng hộ" SILL bị đánh lừa. Tôi chỉ có thể downvote một lần.
Scott Prive

5

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


2

Đâ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.


0

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 !!


-1

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.


"Từ một bản ghi đang được ứng dụng tích cực bổ sung". Vấn đề mà giải pháp của bạn bỏ qua là logfile được ứng dụng sử dụng "vĩnh viễn" - có nghĩa là nút của logfile vẫn còn hoạt động. Giải pháp của bạn "sao lưu" dữ liệu logfile, có thể đã sử dụng ngoài câu hỏi này.
Scott Prive

Cảm ơn bình luận của bạn và bỏ phiếu? Tôi đã sửa đổi một ví dụ nhanh chóng rẻ tiền là thức ăn vì nghĩ rằng bạn sẽ phải suy nghĩ sâu hơn về tình huống của bạn, nhưng ở đó sẽ có cách nào đó.
Thầy James

Đừng nghĩ đó là phiếu bầu của tôi, nhưng tôi nghĩ rằng điểm nhấn trong các bình luận của câu trả lời khác: NẾU bạn sao chép một logfile, thì đó không còn là logfile hoạt động nữa ... bất kể bạn làm gì. Filehandle của ứng dụng sẽ luôn luôn chỉ vào nút của logfile gốc. Hãy nghĩ về nó theo cách này: bạn có một ứng dụng sử dụng các chức năng ghi nhật ký không chuẩn và liên tục thêm byte vào tệp mà nó đã mở.
Scott Prive

1
Phải xin lỗi để suy luận. Có inode cần giữ nguyên như vậy tại sao ví dụ / bằng chứng đưa ra sử dụng cắt ngắn, và một lần nữa, nó phụ thuộc vào tình huống (các tùy chọn cho tất cả rõ ràng đang ẩn trong trang web đơn giản).
Thầy James
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.