Java günlük çerçevesi - Java logging framework

Bir Java günlüğü çerçeve bir olan bilgisayar veri kaydı için paket Java platformu . Bu makale genel amaçlı günlükleme çerçevelerini kapsar.

Günlüğe kaydetme, bir uygulama tarafından etkinliğin kaydedilmesini ifade eder ve geliştirme ekipleri için yaygın bir sorundur. Günlük oluşturma çerçeveleri, Java platformu için günlük kaydı sürecini kolaylaştırır ve standartlaştırır. Özellikle, konsola açık çıktıdan kaçınarak esneklik sağlarlar (aşağıdaki Ekleyiciye bakın). Günlüklerin yazıldığı yer koddan bağımsız hale gelir ve çalışma zamanında özelleştirilebilir.

Ne yazık ki JDK, orijinal sürümüne günlüğe kaydetmeyi dahil etmedi, bu nedenle Java Logging API eklendiğinde diğer birkaç günlükleme çerçevesi yaygın olarak kullanıldı - özellikle Apache Commons Logging (Java Commons Logging veya JCL olarak da bilinir) ve log4j . Bu, her biri farklı günlük çerçevelerini kullanan farklı üçüncü taraf kitaplıklarını (JAR) entegre ederken sorunlara yol açtı. Bu sorunu çözmek için takılabilir günlükleme çerçeveleri (sarmalayıcılar) geliştirildi.

İşlevselliğe genel bakış

Günlük kaydı genellikle üç ana bölüme ayrılır: Kaydedici, Biçimlendirici ve Ekleyici (veya İşleyici).

  • Logger, günlüğe kaydedilecek mesajı belirli meta verilerle birlikte yakalamak ve günlükleme çerçevesine aktarmaktan sorumludur.
  • Mesajı aldıktan sonra, çerçeve, onu çıktı için biçimlendiren mesajla Biçimlendiriciyi çağırır.
  • Daha sonra çerçeve, biçimlendirilmiş mesajı düzenleme için uygun Ekleyiciye / İşleyiciye iletir. Bu, bir konsol ekranına çıktıyı, diske yazmayı, bir veritabanına eklemeyi veya bir e-posta oluşturmayı içerebilir.

Object Guy tarafından sağlanan Logging Framework gibi daha basit günlükleme çerçeveleri, günlükçüyü ve ekleyiciyi birleştirir. Bu, varsayılan işlemi basitleştirir, ancak özellikle proje ortamlar arasında taşınırsa daha az yapılandırılabilir.

Ağaç kesicisi

Logger, uygulamanın, çıktının nereye gönderildiğine / depolandığına bakılmaksızın oturum açmasına izin veren bir nesnedir. Uygulama , belirli bir ad / tanımlayıcı altında günlükçü nesnesine bir nesneyi veya bir nesneyi ve isteğe bağlı bir önem düzeyine sahip bir istisnayı ileterek bir mesajı günlüğe kaydeder .

İsim

Kaydedicinin bir adı vardır. Ad, düzeyleri ayıran noktalar (.) İle genellikle hiyerarşik olarak yapılandırılır. Yaygın bir şema, günlüğe kaydetmeyi yapan sınıfın veya paketin adını kullanmaktır. Hem log4j hem de Java günlük API'si, işleyicileri hiyerarşinin daha üst seviyelerinde tanımlamayı destekler.

Örneğin, kaydedici " com.sun.some.UsefulClass " olarak adlandırılmış olabilir . İşleyici, aşağıdakilerden herhangi biri için tanımlanabilir:

  • com
  • com.sun
  • com.sun.some
  • com.sun.some.UsefulClass

Bu yığında herhangi bir yerde tanımlanmış bir işleyici olduğu sürece, günlük kaydı gerçekleşebilir. Örneğin, com.sun.some.UsefulClass kaydediciye kaydedilen bir mesaj , com.sun işleyici tarafından yazılabilir . Tipik olarak herhangi bir kaydedici tarafından oluşturulan mesajları alan ve işleyen global bir işleyici vardır.

Önem düzeyi

Mesaj belirli bir seviyede kaydedilir. Yaygın düzey adları Apache Commons Logging'den kopyalanır (Java Logging API farklı düzey adları tanımlasa da):

Ortak seviyeler
Seviye Açıklama
ÖLÜMCÜL Erken sonlandırmaya neden olan ciddi hatalar. Bunların bir durum konsolunda hemen görünmesini bekleyin.
HATA Diğer çalışma zamanı hataları veya beklenmeyen koşullar. Bunların bir durum konsolunda hemen görünmesini bekleyin.
UYARI Kullanımdan kaldırılmış API'lerin kullanımı, yetersiz API kullanımı, 'neredeyse' hatalar, istenmeyen veya beklenmeyen ancak mutlaka "yanlış" olmayan diğer çalışma zamanı durumları. Bunların bir durum konsolunda hemen görünmesini bekleyin.
BİLGİ İlginç çalışma zamanı olayları (başlatma / kapatma). Bunların bir konsolda hemen görünmesini bekleyin, bu nedenle muhafazakar olun ve minimumda tutun.
HATA AYIKLA sistemdeki akış hakkında ayrıntılı bilgi. Bunların yalnızca günlüklere yazılmasını bekleyin.
İZLEME daha detaylı bilgi. Bunların yalnızca günlüklere yazılmasını bekleyin.

Günlük çerçevesi, her kaydedici için geçerli günlük kaydı düzeyini korur. Günlük kaydı düzeyi, daha çok veya daha az kısıtlayıcı olarak ayarlanabilir. Örneğin, günlük kaydı seviyesi "UYARI" olarak ayarlanmışsa, o seviye veya daha yüksek seviyedeki tüm mesajlar günlüğe kaydedilir: HATA ve ÖNEMLİ.

Önem seviyeleri hem kaydedicilere hem de ekleyicilere atanabilir. Çıktının üretilmesi için belirli bir önem düzeyinde her ikisinin de etkinleştirilmesi gerekir. Bu nedenle, hata ayıklama çıktısı için etkinleştirilen bir günlükçü, mesajı alan işleyici de hata ayıklama için etkinleştirilmemişse çıktı üretmeyecektir.

Filtreler

Filtreler, bir günlük olayının yok sayılmasına veya günlüğe kaydedilmesine neden olur. En yaygın kullanılan filtre, önceki bölümde belgelenen günlük kaydı düzeyidir. Log4j 2 ve SLF4J gibi günlükleme çerçeveleri ayrıca bir günlük olayına eklendiğinde filtreleme için de kullanılabilen İşaretleyiciler sağlar. Filtreler ayrıca, atılan istisnalara, günlük mesajındaki verilere, günlük API'si aracılığıyla açığa çıkan ThreadLocal'daki verilere veya çeşitli diğer yöntemlere dayalı olarak günlük olaylarını kabul etmek veya reddetmek için de kullanılabilir.

Biçimlendiriciler, Düzenler veya oluşturucular

Biçimlendirici, belirli bir nesneyi biçimlendiren bir nesnedir. Çoğunlukla bu, ikili nesneyi alıp bir dizgi gösterimine dönüştürmekten oluşur. Her çerçeve, istenirse geçersiz kılınabilir varsayılan bir çıktı formatı tanımlar.

Ekleyiciler veya işleyiciler

Ekleyiciler, belirtilen minimum önem düzeyinde veya üzerindeki iletileri dinler. Ekleyen, iletildiği mesajı alır ve uygun şekilde yayınlar. Mesaj eğilimleri şunları içerir:

  • konsolda göster
  • bir dosyaya veya sistem günlüğüne yaz
  • bir veritabanı tablosuna eklemek
  • Java Mesajlaşma Hizmetleri aracılığıyla dağıtın
  • e-posta ile gönder
  • bir sokete yaz
  • "bit paketine" at (/ dev / null)

Özellik karşılaştırması

Tablo 1 - Özellikler
Çerçeve Tür Desteklenen Günlük Düzeyleri Standart Ekleyiciler Yorumlar Maliyet / Lisans
Log4J Günlük Çerçevesi FATAL ERROR WARN INFO DEBUG TRACE Listelenecek çok fazla: Ekleyici Belgelerine Bakın Birçok proje ve platformda yaygın olarak kullanılmaktadır. Log4j 1, 2015 yılında "Kullanım Ömrünün Sonu" olarak ilan edildi ve diğer günlük uygulamalarıyla kullanılabilen bir API ve bu API'nin bir uygulamasını sağlayan Log4j 2 ile değiştirildi.
Apache Lisansı, Sürüm 2.0
Java Günlük API'si Günlük Çerçevesi SEVERE WARNING INFO CONFIG FINE FINER FINEST Sun'ın varsayılan Java Sanal Makinesi (JVM) şunlara sahiptir: ConsoleHandler, FileHandler, SocketHandler, MemoryHandler JRE ile birlikte gelir
Tinylog Günlük Çerçevesi ERROR WARNING INFO DEBUG TRACE ConsoleWriter, FileWriter, LogcatWriter, JdbcWriter, RollingFileWriter, SharedFileWriter ve null (tüm günlük girişlerini atar) Apache Lisansı, Sürüm 2.0
Yeniden giriş yap Günlük Çerçevesi ERROR WARN INFO DEBUG TRACE Listelenecek çok şey var: bkz. Appender JavaDoc Birçok iyileştirmeyle log4j'nin yerini almak üzere geliştirildi. Akka , Apache Camel , Apache Cocoon , Artifactory , Gradle , Lift Framework , Play Framework , Scalatra , SonarQube , Spring Boot , gibi tipik olarak slf4j arkasında olmak üzere çok sayıda proje tarafından kullanılır ... LGPL , Sürüm 2.1
Apache Commons Günlük Kaydı (JCL) Günlük Sarmalayıcı FATAL ERROR WARN INFO DEBUG TRACE Temel çerçeveye bağlıdır Genellikle log4j ile birlikte yaygın olarak kullanılır Apache Lisansı, Sürüm 2.0
SLF4J Günlük Sarmalayıcı ERROR WARN INFO DEBUG TRACE Takılabilir olan temel çerçeveye bağlıdır. JCL, JDK ve log4j günlükleme paketleri için API uyumlu şimler sağlar . Çıktı oluşturmak için bunlardan herhangi birini de kullanabilir. Varsa çıktı için Logback kullanmanın varsayılan değeri. Pek çok proje ve platformda yaygın olarak kullanılır, sıklıkla Logback uygulama olarak kullanılır. MIT Lisansı

Düşünceler

JCL ve Log4j çok yaygındır çünkü çok uzun süredir ortalıkta bulunmaktadırlar ve uzun süredir tek seçimlerdir. Slf4j'nin esnekliği (altında Logback kullanarak) onu popüler bir seçim haline getirdi.

SLF4J, diğer çerçevelerden herhangi birini taklit etmesine izin veren bir dizi günlük sarmalayıcıdır (veya dolgudur). Böylelikle, her birinin kullanmayı seçtiği günlükleme çerçevesinden bağımsız olarak, birden çok üçüncü taraf kitaplığı bir uygulamaya dahil edilebilir. Bununla birlikte, tüm günlük çıktısı standart bir şekilde, tipik olarak Logback aracılığıyla oluşturulur.

Log4j 2 hem bir API hem de bir uygulama sağlar. API, SLF4J'nin nasıl çalıştığına eşdeğer diğer günlük uygulamalarına yönlendirilebilir. SLF4J'den farklı olarak Log4j 2 API, ekstra esneklik için Strings yerine Mesaj nesnelerini günlüğe kaydeder ve ayrıca Java Lambda ifadelerini destekler.

JCL gerçekten bir günlükleme çerçevesi değil, biri için bir paketleyici. Bu nedenle, varsayılan olarak kendi SimpleLog kaydedicisini kullanabilse de, altında bir günlükleme çerçevesi gerektirir .

JCL, SLF4J ve Log4j 2 API, uygulama tarafından kullanılan temel günlük kaydı sistemine yazılması gereken yeniden kullanılabilir kitaplıklar geliştirirken kullanışlıdır. Bu, aynı zamanda, günlükleme çerçevesinin değişme olasılığı bulunan heterojen ortamlarda esneklik sağlar, ancak çoğu durumda, bir günlüğe kaydetme çerçevesi seçildikten sonra, projenin ömrü boyunca onu değiştirmeye çok az ihtiyaç vardır. SLF4J ve Log4j 2 daha yeni olmaktan yararlanır ve eski çerçevelerden öğrenilen dersler üzerine inşa edilir. Dahası, JCL'nin, şimdi JCL'nin yerini alan hangi günlük kitaplığını sarmalaması gerektiğini belirlerken sınıf yükleyicilerle ilgili bilinen sorunları vardır.

Java Logging API, Java ile sağlanır. API teknik olarak Java ile sağlanan varsayılan uygulamadan ayrı olsa da, onu alternatif bir uygulama ile değiştirmek zor olabilir, bu nedenle birçok geliştirici bu uygulamayı Java Logging API ile karıştırır. Yapılandırma, yalnızca anında kolayca değiştirilemeyen harici dosyalar yoluyla yapılır (diğer çerçeveler programlı yapılandırmayı destekler). Varsayılan uygulama yalnızca birkaç İşleyici ve Biçimlendirici sağlar, bu da çoğu kullanıcının kendi yazısını yazması gerektiği anlamına gelir.

Ayrıca bakınız

Referanslar

Dış bağlantılar