tôi về cơ bản chỉ trả lời cùng một câu hỏi và tôi khó khăn tôi sẽ chia sẻ câu trả lời của tôi ở đây. Tôi khuyến khích bạn đọc số complete answer available here. Tôi sẽ cố gắng cung cấp một bản tóm tắt ở đây và điều chỉnh câu trả lời của tôi cho ngữ cảnh hiện tại.
Trong phiên bản đầu tiên, Log4j đã cung cấp API để thủ công gọi thủ tục tắt máy. Vì lý do chúng tôi không có kiến thức về, it was removed from the second version. Bây giờ, đúng cách để làm điều đó (theo tài liệu không tồn tại), là cung cấp việc thực hiện của riêng bạn về giao diện ShutdownCallbackRegistry
, chịu trách nhiệm về thủ tục tắt máy.
giải pháp đề xuất
Tôi đã làm gì để khắc phục vấn đề này là tôi thực hiện phiên bản riêng của tôi về giao diện ShutdownCallbackRegistry
. Nó chủ yếu làm những việc tương tự như việc thực thi mặc định, nhưng thay vì tự đăng ký như là một hook shutdown cho JVM, nó đợi cho đến khi nó được gọi thủ công.
Bạn có thể tìm giải pháp và hướng dẫn đầy đủ trên GitHub/DjDCH/Log4j-StaticShutdown và sử dụng nó trong các dự án của riêng bạn. Về cơ bản, ở cuối, bạn chỉ phải làm một cái gì đó như thế này trong ứng dụng của bạn:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
try {
// Do your usual shutdown stuff here that need logging
} finally {
// Shutdown Log4j 2 manually
StaticShutdownCallbackRegistry.invoke();
}
}
}));
Tôi không thể nói không chút nghi ngờ rằng đây là giải pháp hoàn hảo và rằng việc thực hiện của tôi là hoàn hảo, nhưng tôi đã cố gắng để làm điều đó đúng cách. Tôi sẽ rất vui khi được nghe ý kiến phản hồi của bạn, hoặc nếu bạn thấy giải pháp này phù hợp hay không.
Ghi nhật ký hoặc tùy thuộc vào bất kỳ dịch vụ nào khác trong móc tắt máy, đã hoạt động không tốt và tất cả đều bắt kịp với bạn. –
@MarkoTopolnik Nếu thực hành không tốt như bạn nói, bạn đề nghị làm gì nếu đầu ra của một móc móc tắt máy cần ghi/ghi? – vegemite4me
Vì trong hook shutdown bạn không thể đếm trên bất kỳ phần nào của trạng thái khởi tạo vẫn tồn tại, thứ duy nhất tôi thấy là semi-trusted là một đoạn code hoàn toàn khép kín tạo ra một tệp và ghi vào nó. Tương tự như cách mà một phân đoạn lõi được tạo ra. –