yılında, kapsamlı dış arabirim bir araç bulamadık Temelde sadece aynı soruyu yanıtladı ve ben zor ben burada cevabımı paylaşacağız. complete answer available here'u okumanızı tavsiye ederim. Burada bir özet sağlamaya ve cevabımı mevcut içeriğe uyarlamaya çalışacağım.
İlk sürümde Log4j, kapatma yordamını el ile çağırmak için bir API sağlıyordu. Neden olmasa da, it was removed from the second version bilgisine sahip değiliz. Şimdi, bunu yapmanın doğru yolu (mevcut olmayan belgelere göre), kapatma işleminden sorumlu olan ShutdownCallbackRegistry
arabirimini kendi uygulamanızı sağlamaktır.
Bu sorunu gidermek için ne yaptık önerilen çözüm
Ben ShutdownCallbackRegistry
arayüzünün kendi versiyonunu hayata olmasıdır. Çoğunlukla varsayılan uygulamanın yaptığı aynı şeyleri yapar, fakat kendisini JVM'ye bir kapatma kancası olarak kaydetmek yerine, manuel olarak çağrılana kadar bekler.
Tüm çözümü ve talimatları GitHub/DjDCH/Log4j-StaticShutdown üzerinde bulabilir ve kendi projelerinizde kullanabilirsiniz. Temelde, sonunda, sadece uygulamada böyle bir şey yapmak zorunda:
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();
}
}
}));
Bu mükemmel bir çözüm olduğunu hiç şüphesiz ve benim uygulama mükemmel olduğunu söyleyemeyiz, ama ben denedim bunu doğru şekilde yapmak. Bu çözümü uygun bulup bulmazsanız, sizden geri bildirim duymaktan memnuniyet duyarız.
Günlüğe kaydetme, veya kapatma kancalarındaki diğer servislere bağlı olarak, kötü bir uygulama olmuştur ve şimdi size yetişmektedir. –
@MarkoTopolnik Eğer dediğiniz gibi kötü bir uygulama ise, bir kapatma kanca dişi çıkışının kayıt/günlüğe kaydetmesi gerekiyorsa ne yapılmasını önerirsiniz? – vegemite4me
Kapanış kanadında, başlangıç durumuna getirilmiş durumun herhangi bir parçasına hala sahip olamayacağınız için, yarı güvenilir olarak gördüğüm tek şey, bir dosya oluşturan ve ona yazılan tamamen kendi kendine yeten bir kod parçasıdır. Bir çekirdek dökümü yapıldığı gibi. –