Biến một tệp nhật ký thành một loại bộ đệm tròn


22

Các bạn ơi, có giải pháp * nix nào có thể làm cho tệp nhật ký hoạt động như một bộ đệm tròn không? Ví dụ: tôi muốn các tệp nhật ký lưu trữ tối đa 1Gb dữ liệu và loại bỏ các mục cũ hơn sau khi đạt đến giới hạn.

Có thể ở tất cả? Tôi tin rằng để đạt được rằng một tệp nhật ký nên được biến thành một loại thiết bị đặc biệt ...

PS Tôi biết các công cụ logrotating linh tinh nhưng đây không phải là thứ tôi cần. Logrotating yêu cầu rất nhiều IO, thường xảy ra mỗi ngày một lần trong khi tôi cần một giải pháp "thời gian chạy".


3
Tôi không chắc tại sao bạn nghĩ rằng xoay vòng log sẽ cần rất nhiều IO. Xoay 10 logfiles là 10 hoạt động đổi tên và HUP của dịch vụ. Không chính xác là một hoạt động giết người ... Và đó là giải pháp tiêu chuẩn cho vấn đề của bạn :)
pehrs

2
Một người có thể đang chạy một kịch bản / thực thi mà không chơi tốt với HUP.
Scott

1
Điều này là để cung cấp một trường hợp sử dụng khác cho câu hỏi của bạn. Tôi có một máy nghe nhạc bị quỷ ám. Tôi muốn một bản ghi độ dài chỉ vài dòng, vì vậy tôi có thể thấy những gì đang chơi và những gì đã chơi trước đó. A tail -f somefilesẽ làm điều đó. Tôi chỉ thử với các bản ghi xoay và tail -fkhông hoạt động với những bản ghi đó.
Vorac

Câu trả lời:


14

Linux có bộ đệm vòng nhân. Bạn có thể sử dụng dmesgđể hiển thị nó .

Hoặc đây là một mô-đun hạt nhân Linux xuất hiện để làm những gì bạn muốn.

Emlog là gì?

emlog là một mô-đun hạt nhân Linux giúp dễ dàng truy cập vào đầu ra gần đây nhất (và chỉ mới nhất) từ một quy trình. Nó hoạt động giống như "tail -f" trên một tệp nhật ký, ngoại trừ việc lưu trữ cần thiết không bao giờ tăng lên. Điều này có thể hữu ích trong các hệ thống nhúng khi không có đủ bộ nhớ hoặc dung lượng ổ đĩa để giữ các tệp nhật ký hoàn chỉnh, nhưng đôi khi cần thông báo gỡ lỗi gần đây nhất (ví dụ: sau khi phát hiện thấy lỗi).

Mô-đun hạt nhân emlog thực hiện trình điều khiển thiết bị ký tự đơn giản. Trình điều khiển hoạt động giống như một đường ống có tên có bộ đệm tròn hữu hạn. Kích thước của bộ đệm có thể dễ dàng cấu hình. Khi nhiều dữ liệu được ghi vào bộ đệm, dữ liệu cũ nhất sẽ bị loại bỏ. Một quá trình đọc từ thiết bị emlog trước tiên sẽ đọc bộ đệm hiện có, sau đó xem văn bản mới như được viết, tương tự như giám sát tệp nhật ký bằng cách sử dụng "tail -f". (Việc đọc không chặn cũng được hỗ trợ, nếu một quy trình cần lấy nội dung hiện tại của nhật ký mà không chặn để chờ dữ liệu mới.)


1
Cảm ơn các liên kết! BTW, trang chủ emlog có một liên kết đến ulogbufd, đây có lẽ là một giải pháp thích hợp hơn cho tôi.
pachanga

Các emlog kernel mô-đun hiện đang duy trì trên github: github.com/nicupavel/emlog
dbernard

4

Điều gần nhất tôi có thể nghĩ đến là RRDTools, nhưng có lẽ nó không phải là thứ bạn đang tìm kiếm. Một giải pháp khác là theo dõi tệp nhật ký (giả sử mỗi giây hoặc trong Linux có inotify), ví dụ: bạn viết một tập lệnh như:

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done

với inotify:

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done

+1 để đề cập đến RRDtool, một ví dụ thực tế về ghi nhật ký cấu trúc dữ liệu vòng.
Cory J

Cảm ơn, ví dụ hiển thị inotifywait sử dụng lệnh shell
pachanga

4

Bạn có thể sử dụng đa bộ từ Daemontools của djb. Bạn dẫn đầu ra log của bạn vào nó. Có, đó là xoay vòng log, nhưng các phép quay chỉ đơn giản là:

ln current $tai64nlocaltimestamp

Mà, trên bất kỳ hệ thống tập tin linux hiện đại nào là một hoạt động siêu nhanh. Bạn có thể chỉ định số lượng tệp nhật ký bạn muốn, mức độ lớn bạn muốn chúng. tạo các tệp 10 x 1024mb và bạn sẽ có bộ đệm vòng 1gb.

Lưu ý rằng do xoay tự động, nó là một nguồn trên mỗi phiên bản đa nhóm. Nhưng bạn có thể giải quyết vấn đề đó bằng cách viết một trình bao bọc đơn giản với netcat hoặc bằng tay.


Cảm ơn vì tiền hỗ trợ! Tôi chắc chắn cũng sẽ có nhiều người chơi.
pachanga

1

Bạn có thể tạo một ống FIFO và sau đó đọc nó bằng cách sử dụng tập lệnh chèn vào cơ sở dữ liệu. Khi bộ đếm đạt 1.000, khởi động lại số id được chèn vào cơ sở dữ liệu. Tất nhiên, nó sẽ không hoạt động với kích thước, nhưng bạn đã sử dụng nó làm ví dụ, vì vậy tôi cho rằng đây là một câu hỏi lý thuyết.


1

Câu hỏi thú vị; bạn thường không xem đó là một thiết kế. Tôi có một chương trình sử dụng một kỹ thuật tương tự mờ nhạt để ghi lại lịch sử, nhưng nó sử dụng định dạng nhị phân. 'Tệp nhật ký' có bốn phần, tất cả được trình bày ở định dạng trung lập máy:

  1. Một tiêu đề chứa số ma thuật và số lượng mục (tối đa) trong danh sách được sử dụng và danh sách miễn phí, số thứ tự cho mục lịch sử tiếp theo, số mục thực tế trong danh sách được sử dụng, số mục thực tế trong danh sách miễn phí và độ dài của tệp (mỗi tệp là 4 byte).
  2. Danh sách được sử dụng, mỗi mục nhập có độ lệch và độ dài (4 byte cho mỗi phần của mỗi mục).
  3. Danh sách miễn phí, mỗi mục tương tự như mục nhập danh sách được sử dụng.
  4. Dữ liệu chính, mỗi bản ghi lịch sử bao gồm một tập hợp các byte liền kề được kết thúc bởi một byte kết thúc null.

Khi một bản ghi mới được phân bổ, nếu có không gian trong danh sách miễn phí, thì nó sẽ ghi đè lên một mục ở đó (không nhất thiết phải sử dụng tất cả - trong trường hợp đó đoạn vẫn nằm trong danh sách miễn phí). Khi không có không gian trong danh sách miễn phí, thì không gian mới sẽ được phân bổ ở cuối. Khi một bản ghi cũ quay ra, không gian của nó được chuyển sang danh sách miễn phí và kết hợp với bất kỳ bản ghi miễn phí liền kề nào. Nó được thiết kế để xử lý các câu lệnh SQL để các bản ghi có thể được trải rộng trên nhiều dòng. Mã này hoạt động trên một số lượng hồ sơ xác định. Nó không giới hạn kích thước của tệp mỗi se (mặc dù sẽ không khó để làm như vậy).

Mã lịch sử mã chính nằm trong hai tệp, history.c và history.h, có sẵn từ nguồn cho chương trình SQLCMD (phiên bản của tôi, không phải của Microsoft; của tôi đã tồn tại một thập kỷ trở lên trước Microsoft), có thể được tải xuống từ Lưu trữ phần mềm của nhóm người dùng thông tin quốc tế . Ngoài ra còn có chương trình kết xuất tệp lịch sử (histdump.c) và trình kiểm tra lịch sử (histtest.ec - nó tự xưng là ESQL / C, nhưng bản thân nó thực sự là mã C, một trong những chức năng hỗ trợ mà nó gọi sử dụng một số Informix ESQL / C chức năng thư viện). Liên hệ với tôi nếu bạn muốn thử nghiệm mà không sử dụng Informix ESQL / C - xem hồ sơ của tôi. Có một số thay đổi nhỏ để làm cho nó biên dịch histtest bên ngoài môi trường thiết kế của nó, cộng với bạn cần một makefile.


0

Tôi đồng ý với nhận xét của pehrs cho câu hỏi của bạn. Nhật ký xoay không khó lắm. Bạn có thể thiết lập logrotate hoặc tập lệnh khác để kiểm tra định kỳ tệp nhật ký của mình, thậm chí thường xuyên như mọi phút nếu bạn muốn. Khi phát hiện tệp của bạn đạt kích thước 1GB, nó chỉ cần thực hiện đổi tên, bên cạnh không có I / O. Trong quá trình đổi tên, quá trình tiếp tục ghi tệp nhật ký. Công cụ quay vòng nhật ký sau đó có thể gửi HUP tới trình nền syslog của bạn (trình nền của bạn đang đăng nhập qua syslog, phải không? Nếu không, nó sẽ hỗ trợ tín hiệu HUP nếu nó được viết tốt ...) để mở lại đường dẫn tệp gốc . Tại thời điểm này, nó sẽ bắt đầu ghi vào một tệp mới tại đường dẫn gốc và bạn có thể xóa phiên bản đã xoay.

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.