Java için cephe kaydı | sıcak çevrimiçi

Portakalkafa

Global Mod
Global Mod
İlk Java günlüğe kaydetme gönderisindeki en iyi uygulamaları ve tuzakları tartıştıktan sonra, şimdi büyük bir projede günlüğe kaydetmeyi daha derine inmek istiyorum. Bu alanda, genellikle farklı günlük tutma çerçeveleri arasında sorunlar ortaya çıkar ve tüm uygulama günlük kaydını birleştirmek bazen zor olabilir.

Duyuru









Hendrik Ebbers (@hendrikEbbers), Java Şampiyonu, JCP Uzman Grubu üyesi ve JavaOne’da birçok kez Rockstar Konuşmacısı olarak ödüllendirildi. Hendrik, Open Elements şirketi aracılığıyla şu anda Hedera Hashgraph’ın tasarlanmasına ve hizmetlerinin halka sunulmasına yardımcı oluyor. Hendrik, JUG Dortmund ve Cyberland’in kurucu ortağıdır ve dünya çapında Java üzerine dersler ve atölye çalışmaları yapmaktadır. “Mastering JavaFX 8 Controls” adlı kitabı Oracle Press tarafından 2014 yılında yayınlandı. Hendrik, JakartaEE veya Eclipse Adoptium gibi açık kaynaklı projelerde aktif olarak yer alıyor. Hendrik, AdoptOpenJDK TSC ve Eclipse Adoptium WG’nin bir üyesidir.







Sorunu daha iyi anlamak için, çok basit bir örnekle başlayacağım, günlüğe kaydetmede Hello World gibi. Aşağıdaki kod, yalnızca bir iletiyi günlüğe kaydeden minimal bir Java uygulamasını gösterir:


public class HelloLogging {

private static final Logger LOG = Logger.getLogger("HelloLogging");

public static void main(final String[] args) {
LOG.info("Hello World");
}
}


Bu önemsiz uygulamada bile, örneğin örnekte olduğu gibi, günlük kaydı çerçevesinin özellikleri kullanılarak günlük kaydı yapılabilir. java.util.Logging (JUL), yapılandırılmış ve bir dosyaya veya konsola (kabuk) gönderilmiştir. Aşağıdaki şema, şematik bir yapıda günlük kaydının yapısını ve yapılandırmasını göstermektedir.








Gerçekçi bir senaryo


Duyuru

Verilen yapı küçük bir proje için iyi çalışsa da, ilk birkaç bağımlılık eklendiğinde bazen sorunlu hale gelir. Uygulamamız için iki bağımlılığa ihtiyacımız olduğunu düşünelim: bir veritabanına erişim izni vermek için bir kitaplık ve uygulamamızı saldırılardan korumak için bir güvenlik kitaplığına başka bir bağımlılık. Bu kitaplıkların geliştiricileri ayrıca çalışma zamanı durumları, kullanımları ve hataları hakkında bilgi vermek istediklerinden günlük kaydını da kullanırlar. Ancak bu kütüphaneler java.util.Logging, ancak diğer günlük kitaplıkları kullanılır. Aşağıdaki şemada da görebileceğiniz gibi Log4J2 ve Logback’in kullanımda olduğunu varsayalım.








Artık uygulama günlüğümüzün üç farklı günlük çerçevesi üzerinden yönlendirilmesi sorunumuz var. Log4J ve Logback ayrıca yeterli yapılandırma seçenekleri sunar, ancak günlük tutma çerçeveleri birbiriyle senkronize olmadığından, tüm çerçevelerin aynı dosyaya yazması çok aptalca bir fikir olur. Burada, farklı çerçevelerin aynı satıra yazması, rastgele hizalanmış ve hatta kilitlenmiş okunamayan bir grup metin modülüyle sonuçlanabilir. Diğer bir fikir de, aşağıdaki şemada gösterildiği gibi, her çerçevenin kendi dosyasına erişmesidir.








Bu yapı, kayıtların birbirinden tamamen bağımsız hareket etmesi ve birbirinin önüne geçmemesi anlamına gelmektedir. Bu size temiz bir kayıt sağlar, ancak manuel olarak veya araçların yardımıyla eşitlemeniz gereken birkaç dosyaya yayılır. Ayrıca, örneğin uygulamanızı analiz etmek için daha yüksek bir günlük kaydını etkinleştirmek istediğinizde, tüm mevcut günlük sistemlerini yapılandırmak her zaman gereklidir. Daha da kötüsü, gerçek bir projede ikiden fazla bağımlılık vardır, bu da çok daha fazla kayıt çerçevesinin kullanılabileceği anlamına gelir.

Cephe kullanımı yoluyla küresel kayıt


Cephe kaydı burada yardımcı olabilir. Kodu somut bir uygulamadan ayırmak için bir cephe kullanılabilir. Simple Logging Facade for Java (SLF4J) kendisini bir standart olarak açıkça belirlemiştir. SLF4J, geçişli bağımlılıklar olmadan tek bir bağımlılık olarak gelen ve hemen hemen her sisteme kolayca takılabilen bir kayıt API’si sağlar. Bu durumda API, kodunuzda belirli günlük çağrıları oluşturmak için kullanılabilir. Aşağıdaki kod, “Merhaba Dünya” kaydının bir örneğini gösterir:


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloLogging {

private static final Logger logger =
LoggerFactory.getLogger(HelloLogging.class);

public static void main(String[] args) {
logger.info("Hello World!");
}
}



Sadece bu koda bakarsanız, SLF4J’nin klasik Java günlük kaydına göre hangi avantajları getirmesi gerektiğini merak edebilirsiniz. En önemli noktalardan biri ise, org.slf4j.Logger bir arayüzdür. modül slf4j-apiSLF4J-Api’yi ve dolayısıyla belirtilen arabirimi içeren , arabirimin uygulanmasını sağlamaz. Modülün tamamı, yalnızca kayıt cephesi olan SLF4J’nin genel API’sini tanımlar.

Bunları kullanmak için bir uygulama sağlamamız gerekiyor. Bunu yapmak için, günlük cephesinin uygulanmasını sağlayan bir bağımlılık olarak sözde bağlama eklenmelidir. Bu bağlama, genellikle günlük olaylarını belirli bir günlük kaydı çerçevesine iletir. Örneğin, somut günlük uygulamanız olarak Apache Commons Logging’i kullanmak istiyorsanız, bunu yapmanız yeterlidir. slf4j-jcl-VERSION.jar Sınıf yoluna modül ekleyin. Bu tür bağlamalar derleme zamanında gerekli değildir ve bu nedenle çalışma zamanı kapsamı aracılığıyla Maven’de veya Gradle’da “RuntimeOnly” bağımlılığı olarak belirtilebilir. SLF4J dahili olarak Java SPI kullandığından, günlük kaydının somut uygulamasını kullanmak için herhangi bir kodu değiştirmeniz gerekmez. Şimdi bu fonksiyonu örnek uygulamamız için kullanabiliriz:




Uygulama olarak SLF4J ve Log4J2'yi kullanma




Diyagramda Log4J2, günlük uygulaması olarak kullanılır ve uygun bir bağlama eklenerek, tüm günlük mesajları org.slf4j.Logger-Oluşturulan kaydediciler otomatik olarak Log4J2’ye iletilir. Bu örnekte “Veritabanı kitaplığı” bağımlılığımız da açıkça Log4J2 kullandığından, çeşitli dahili ve harici modüllerden gelen mesajlar doğrudan Log4J2 aracılığıyla işlenir. Özel günlük uygulamaları için bağlamalara ek olarak SLF4J, SLF4J ve konsol mesajlarının minimum düzeyde uygulanmasını sunan slf4j-simple kitaplığını da sunar (System.error) dışarı çıkmak.

Ancak örnekte bir sorun daha var: Kullanılan “Security lib” Logback’i kaydedici olarak kullanıyor ve bu nedenle mesajları farklı bir çıktıda bitiyor. Bu gibi durumlarda, SLF4J için sözde adaptörler kullanılabilir. Bunlar, doğrudan bir günlük API’sine gönderilen günlük mesajlarının SLF4J’ye iletilmesine izin verir. Günlük çerçevesine bağlı olarak, bu tür bağdaştırıcılar için tamamen farklı uygulama yaklaşımları vardır. SLF4J bu adaptörlerden bazılarını sunarken, bazı kayıt çerçeveleri bunları doğrudan gönderir. Örneğin Log4J2 için, mesajları Log4J2’den SLF4J’ye iletmek istiyorsanız aşağıdaki bağımlılığı eklemeniz gerekir:


<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>



En iyi şekilde sınıf yoluna yalnızca çalışma zamanında eklenen bu bağımlılığın eklenmesi, aşağıdaki grafikteki gibi bir günlük kaydıyla sonuçlanır:




SLF4J ve Log4J2




SLF4J, çeşitli günlük kitaplıklarını web sitelerinde eklentiler ve adaptörler aracılığıyla entegre etme konusunda iyi bir genel bakış sunar.

Şimdi örnek uygulamamıza bakarak öğrendiklerimize dayanarak, bir logback bağdaştırıcısı ekleyerek hedefimize ulaşabiliriz. Aşağıdaki şemada gösterildiği gibi, tüm sistemden gelen tüm günlük mesajları Log4J2 aracılığıyla yönlendirilir ve bu nedenle yalnızca bir merkezi konumu belgelememiz gerektiği avantajına sahibiz.




Bir kayıt tarafının doğru kullanımı





(rm)



Haberin Sonu
 
Üst