2011-06-28 26 views
8

Thực tiễn tốt nhất để triển khai trình ghi tệp/trình ghi nhật ký trong Java tương thích với logrotate là gì? Mục tiêu sẽ cho phép logrotate được sử dụng cho tất cả quản lý nhật ký, thay vì sử dụng chức năng xoay vòng/quản lý của một API ghi nhật ký (Log4J, v.v.).Làm cách nào để tạo một trình ghi tệp thân thiện với logrotate trong Java hoặc nền tảng khác?

Tôi muốn được nghe ý kiến ​​/ câu trả lời cho các nền tảng phát triển khác, ngoài Java.

Trả lời

8

Bạn chỉ cần định kỳ đóng và mở lại tệp nhật ký bên trong ứng dụng của mình. Bạn cần một trình xử lý giữ thời gian gần nhất. Trình xử lý sẽ đóng và mở lại tệp nếu (ví dụ) 20 giây trôi qua kể từ lần đóng gần nhất và mục nhập nhật ký sắp được viết. Bạn nên kiểm tra ngay trước khi viết mục nhật ký

Nếu bạn không làm, nhật ký sẽ được ghi vào tệp cũ ngay cả khi nó được đổi tên bởi logrotate (!) (Bộ mô tả tệp vẫn giữ nguyên) và sau đó các mục nhật ký sẽ biến mất khi nhật ký được nén và bị xóa (trong trường hợp này java sẽ tự động thả các bản ghi đó).

Đóng và mở lại nhật ký (sử dụng tên tệp) sẽ đảm bảo rằng nếu tệp đã được đổi tên thành một tệp mới sẽ được tạo. Đóng và mở lại tệp mỗi khi nhật ký được viết là quá mức cần thiết vì mở tệp là một thao tác tốn kém.

0

Tôi đã xem một số ứng dụng khác và dường như có tùy chọn postrotatecopytruncate option. Các tùy chọn copytruncate là dễ dàng hơn nhưng tôi nghĩ rằng nó là ít đáng tin cậy như bộ đệm có thể không được flushed (tức là làm theo @Jarek Potuik câu trả lời) và thậm chí nếu họ là bạn có thể nhận được mục trùng lặp hoặc bỏ mục.

Như vậy cho phép giả sử bạn muốn postrotate tùy chọn:

Tùy chọn postrotate cho phép bạn chạy một lệnh để nói với ứng dụng của bạn để mở lại file (gần và sau đó mở). Trong khi mở và đóng tập tin trong Java, bạn sẽ làm điều này với một khối đồng bộ hoặc một số loại khóa và tất nhiên tuôn ra bất kỳ bộ đệm.

Cho phép giả định ứng dụng của bạn được gọi là myapp:

Bạn sẽ có một tập tin trong /etc/logrotate.d/myapp với một cái gì đó như:

/var/log/myapp/*.log { 
     weekly 
     missingok 
     rotate 20 
     compress 
     delaycompress 
     notifempty 
     sharedscripts 
     postrotate 
      /etc/init.d/myapp rotate-logs > /dev/null 
     endscript 
} 

Lệnh /etc/init.d/myapp rotate-logs sẽ cần để ra hiệu cho các ứng dụng để đóng và mở lại nhật ký các tập tin.

Phần báo hiệu khá phức tạp và phụ thuộc vào loại ứng dụng bạn có vì Java không hỗ trợ IPC tốt (tức là tín hiệu unix) để bạn có thể phải mở cổng hoặc sử dụng cổng hiện có chẳng hạn như 8080 (tức là lệnh HTTP REST trong trường hợp thùng chứa servlet) để cho ứng dụng của bạn đóng và mở lại các tệp nhật ký.

Các vấn đề liên quan