Günlüğe kaydetme için hangi tasarım deseni daha uygundur?


10

Bir programda bazı olayları günlüğe kaydetmeliyim, ancak bildiğim kadarıyla, günlük kodunu programın dışında tutmak daha iyi olurdu çünkü programın gerçek işlevselliği ile ilgili değil. Peki, kodun tamamen dışında kalmam ve sadece olayları kaydetmek için Gözlemciler ve Dinleyiciler kullanmam gerekip gerekmediğini söyleyebilir misiniz? Ya da ben bir şey günlüğü gereken her yerde aşağıdaki gibi bir kod satırı ekleyebilirsiniz:

MyGloriousLogger.getXXXLogger().Log(LogPlace, new LogObject(z1, z2, z3, z4, ..., z99));

Observer tasarım modelini kullanmak için bir hata mı yaparım? Başka bir tasarım desenine ihtiyacım var mı? Yoksa tasarım kalıplarını düşünmeyi bırakmalı mıyım?

PS1. Yalnızca dinleyicileri ve gözlemcileri kullanarak oturum açmak istiyorsam, kesinlikle programın gözlemcilerini ve dinleyicilerini eklemem ve geliştirmem gerekecek.

PS2. Kesinlikle Java'da oturum açmak için farklı kütüphaneler olduğunu biliyorum ve java.utils.logging kullanıyorum ama özel nesnelerimi günlüğe kaydetmek için bir sarıcıya ihtiyacım var.


2
Java zaten 17 günlük çerçevesi ve meta günlük çerçevesi (slf4j) ve muhtemelen bazı meta-meta günlük çerçevesi ve hiçbiri sizin için çalışmıyor mu?
kevin cline

Yanıtlar:


15

Logginggenellikle sorumluluk zinciri modeli ile uygulanır . Elbette bunu bir Cephe ile birleştirebilirsiniz (ve ben de) . Gerçekten dinleyicileri veya gözlemcileri kullanmam.

Sorumluluk zinciri - Logger


Bu temelde "kodunuza soyut kaydediciye yaz" mı diyor? Sanırım sorum şu: Olayları kaydetmek ve olaylara yanıt olarak kaydeden bir dinleyici sağlamak için olayları tetiklemeli miyim, yoksa doğrudan Logger hizmetimi (dahili olarak sorumluluk zincirini kullanan) çağırmalı mıyım?
Francesco Belladonna

8

Yöntemler üzerine After, Before ve Around önerilerini kullanan Unsur Odaklı Programlamayı kullanın . İhtiyacınıza göre, api'nin başlangıcından önce, bazı koşullardan sonra veya bazı durumlarda günlükler ekleyebilir ve ayrıca ana kodunuzu günlük kodundan ayırabilirsiniz.


0

Observer bana uygun gelmiyor. Ayrıca, "ihtiyacınız olan her yerde" günlükçü çağrılarını atmak kodunuzu parçalayacak ve SRP'yi ihlal edecektir.

Örneğin, bunun için AOP ile ilgilenebilirsiniz, böylece yöntem ek açıklamaları aracılığıyla günlükçü çağrılarını ekleyebilirsiniz.


0

Çıktınızın birden fazla yere inebileceği durumlarda, sorumluluk zinciri iyi bir model gibi görünmektedir. UML'de konsola yönlendiren farklı bir logger'ınız var, diğeri errorFile ve 3. basitçe info logger.

Genellikle logLevels farklı ama günlük dosyası aynı gördük.

Günlük kodunuzu uygulama kodundan ayırdığı için gözlemci desenini günlüğe kaydetme için kötü görmüyorum. Bu iyi bir uygulama, farklı kayıt mekanizmalarına geçiş bu şekilde kolaydır. Her günlüğe kaydetmek istediğinizde, bir olayı tetiklediğinizde uygun dinleyici olayı alır ve günlüğe kaydeder. Tüm kayıtların listesini tutan bir ara singleton nesnesi olmalıdır.

Bu şekilde günlük kodumuzu uygulama kodundan ayırabileceğimizi görüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.