2.1 İlk kaydedici - log4j

Bildiğiniz gibi, günlüklerin tarihi, System.err.println()bir kaydın konsola çıktısı ile başladı. Hata ayıklama için hala aktif olarak kullanılmaktadır, örneğin Intellij IDEA, hata mesajlarını konsola görüntülemek için kullanır. Ancak bu seçeneğin herhangi bir ayarı yoktur, o yüzden devam edelim.

İlk ve en popüler kaydedici çağrıldı Log4j. İyi ve son derece özelleştirilebilir bir çözümdü. Çeşitli koşullar nedeniyle bu karar, tüm topluluğu büyük ölçüde üzen JDK'ya asla ulaşmadı.

Bu günlükçü yalnızca günlüğe kaydetmekle kalmadı, programcılar tarafından programcılar için oluşturuldu ve günlük kaydıyla bağlantılı olarak sürekli olarak ortaya çıkan sorunları çözmelerine olanak sağladı.

Bildiğiniz gibi, günlükler sonunda yazılır, böylece birileri onları okur ve programın çalışması sırasında ne olduğunu - beklendiği gibi neyin ve ne zaman ters gittiğini anlamaya çalışır.

log4jBunun için üç şey vardı :

  • alt paket kaydı;
  • ekleyici seti (sonuçlar);
  • sıcak yeniden yükleme ayarları.

İlk olarak, ayarlar, log4jbir pakette oturum açmayı etkinleştirecek ve diğerinde devre dışı bırakacak şekilde yazılabilir. com.codegym.serverÖrneğin, içinde oturum açmayı etkinleştirmek , ancak içinde devre dışı bırakmak mümkündü com.codegym.server.payment. Bu, gereksiz bilgilerin günlükten hızla kaldırılmasını mümkün kıldı.

İkincisi, log4jgünlük sonuçlarının aynı anda birkaç günlük dosyasına yazılmasına izin verdi. Ve her birinin çıktısı ayrı ayrı yapılandırılabilir. Örneğin, bir dosyada yalnızca ciddi hatalar hakkında bilgi, diğerinde - belirli bir modülden günlükler ve üçüncüsünde - belirli bir süre için günlükler yazmak mümkündü.

Böylece her günlük dosyası, belirli bir beklenen sorun türüne ayarlandı. Bu, gigabayt günlük dosyalarına manuel olarak bakmaktan hoşlanmayan programcıların hayatını büyük ölçüde kolaylaştırır.

Ve son olarak, üçüncü olarak, log4jprogram çalışırken, yeniden başlatmadan doğrudan günlük ayarlarının değiştirilmesine izin verdi. Bu, belirli bir hata hakkında ek bilgi bulmak için günlüklerin çalışmasını düzeltmek gerektiğinde çok kullanışlıydı.

Önemli! Günlüğün iki sürümü vardır : log4jbirbiriyle uyumsuz olan 1.2.x ve 2.xx.

Kaydediciyi projeye şu kodu kullanarak bağlayabilirsiniz:

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
  </dependency>

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
  </dependency>
</dependencies>

2.2 İlk resmi günlükçü - TEMMUZ: java.util.logging

Java topluluğunda günlükçüler hayvanat bahçesi göründükten sonra, geliştiriciler JDKherkesin kullanacağı bir standart günlükçü yapmaya karar verdiler. Günlükçü şu şekilde göründü JUL: paket java.util.logging.

Bununla birlikte, geliştirilmesi sırasında, kaydedicinin yaratıcıları temel olarak değil log4j, gelişimini etkileyen IBM'den kaydedicinin bir çeşidini aldı. İyi haber, kaydedicinin JULdahil edilmiş olması JDK, kötü haber ise çok az kişinin kullanması.

TEMMUZ

Geliştiriciler yalnızca "başka bir evrensel standart"JUL oluşturmakla kalmadılar , aynı zamanda bunun için o dönemde popüler kaydediciler tarafından kabul edilenlerden farklı olan kendi günlük kaydı seviyelerini de oluşturdular.

Ve bu büyük bir problemdi. Sonuçta, ürünler Javagenellikle çok sayıda kitaplıktan toplanır ve bu tür kitaplıkların her birinin kendi kaydedicisi vardır. Bu nedenle, uygulamadaki tüm kaydedicileri yapılandırmak gerekiyordu.

Kaydedicinin kendisi oldukça iyi olmasına rağmen. Bir kaydedici oluşturmak aşağı yukarı aynıdır. Bunu yapmak için şunları içe aktarmanız gerekir:


java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggingJul.class.getName());

Günlüğün nereden geldiğini bilmek için sınıf adı özel olarak iletilir.

Yalnızca sürümle birlikte, geliştiriciler önemli sorunları çözdüler ve ardından JULkullanımı gerçekten uygun hale geldi. Ondan önce, bir tür ikinci sınıf kayıt cihazıydı.

Bu kaydedici ayrıca lambda ifadelerini ve tembel değerlendirmeyi destekler. ile başlayarak Java 8geçebilirsiniz Supplier<String>. Bu, daha önce olduğu gibi her seferinde değil, yalnızca gerçekten ihtiyaç duyulduğu anda bir dize okumaya ve oluşturmaya yardımcı olur.

Bağımsız değişkenli yöntemler Supplier<String> msgSupplierşöyle görünür:

public void info(Supplier msgSupplier) {
   log(Level.INFO, msgSupplier);
}

2.3 İlk kaydedici sarmalayıcı - JCL: jakarta commons günlüğü

Uzun bir süre, kaydediciler arasında tek bir standart yoktu, JULtek bir standart olması gerekiyordu ama daha da kötüsüydü log4j, bu yüzden hiçbir zaman tek bir standart ortaya çıkmadı. Ancak, her biri aynı olmak isteyen bütün bir ağaç kesici hayvanat bahçesi ortaya çıktı.

JCL

Bununla birlikte, sıradan Java geliştiricileri, hemen hemen her kitaplığın kendi kaydedicisine sahip olmasını ve bir şekilde özel bir şekilde yapılandırılması gerektiğini sevmedi. Bu nedenle topluluk, diğer günlükçüler üzerinde özel bir sarmalayıcı oluşturmaya karar verdi - işte böyleJCL: jakarta commons logging

Ve yine lider olmak için yaratılan proje lider olmadı. Bir kazanan yaratamazsınız, sadece kazanan olabilirsiniz. İşlevsellik JCLçok zayıftı ve kimse onu kullanmak istemedi. Tüm kaydedicilerin yerini alacak şekilde tasarlanan kaydedici, JULkullanılmadığı için aynı kaderi paylaştı.

Apache topluluğu tarafından yayınlanan birçok kitaplığa eklenmiş olmasına rağmen, günlükçüler hayvanat bahçesi yalnızca büyümüştür.

2.4 İlk son kaydedici - Logback

Ama hepsi bu kadar değil. Geliştirici, kendisinin en zeki olduğuna karar verdi (ne de olsa çoğu insan onun kaydedicisini kullandı) ve diğer kaydedicilerin log4javantajlarını birleştirecek yeni bir geliştirilmiş kaydedici yazmaya karar verdi .log4j

Yeni kaydedici çağrıldı Logback. Gelecekte herkesin kullanacağı tekli kaydedici olması beklenen bu kaydediciydi. ile aynı fikre dayanıyordu log4j.

Bu kaydediciyi şu kodu kullanarak projeye bağlayabilirsiniz:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.6</version>
</dependency>

Farklılıklar şunlardı Logback:

  • geliştirilmiş performans;
  • yerel destek eklendi slf4j;
  • genişletilmiş filtreleme seçeneği.

Bu kaydedicinin bir başka avantajı da çok iyi varsayılan ayarlara sahip olmasıydı. Ve kaydediciyi yalnızca içindeki bir şeyi değiştirmek istiyorsanız yapılandırmanız gerekiyordu. Ayrıca, ayarlar dosyası kurumsal yazılıma daha iyi uyarlandı - tüm yapılandırmaları xml/.

Varsayılan olarak, Logbackherhangi bir ayar gerektirmez ve seviye DEBUGve üzerindeki tüm günlükleri kaydeder. xmlFarklı bir davranışa ihtiyacınız varsa, yapılandırma yoluyla yapılandırılabilir :

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>app.log</file>
        <encoder>
            <pattern>%d{HH:mm:ss,SSS} %-5p [%c] - %m%n</pattern>
        </encoder>
    </appender>
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.type.descriptor.sql" level="TRACE" />
    <root level="info">
        <appender-ref ref="FILE" />
    </root>
</configuration>

2.5 En yeni evrensel günlükçü - SLF4J: Java için Basit Günlüğe Kaydetme Cephesi

Altın ortayı bulmak ne kadar uzun sürebilir...

2006 yılında, yaratıcılardan biri log4jprojeden ayrıldı ve evrensel bir kaydedici oluşturmak için tekrar denemeye karar verdi. Ancak bu sefer yeni bir kaydedici değil, farklı kaydedicilerin birlikte etkileşime girmesine izin veren yeni bir evrensel standart (sarmalayıcı) idi.

Bu kaydedicinin adı , , , etrafındaki slf4j — Simple Logging Facade for Javabir sarmalayıcıydı . Bu kaydedici gerçek bir sorunu çözdü - bir günlükçüler hayvanat bahçesini yönetmek, böylece herkes onu hemen kullanmaya başladı.log4jJULcommon-loggins and logback

Kendimiz için yarattığımız sorunları kahramanca çözeriz. Gördüğünüz gibi ilerleme öyle bir noktaya geldi ki sarmalayıcının üzerine sarmalayıcı oluşturduk...

Sargının kendisi iki bölümden oluşur:

  • API, uygulamalarda kullanılan;
  • Her bir günlükçü için ayrı bağımlılıklar olarak eklenen uygulamalar.

Kaydediciyi projeye şu kodu kullanarak bağlayabilirsiniz:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.17.2</version>
</dependency>

Doğru uygulamayı bağlamak yeterlidir ve bu kadar: tüm proje onunla çalışacaktır.

2.6 slf4j'de optimizasyon

Slf4jgünlük kaydı için dize biçimlendirme gibi tüm yeni özellikleri destekler . Bundan önce böyle bir sorun vardı. Günlüğe bir mesaj yazdırmak istediğinizi varsayalım:

log.debug("User " + user + " connected from " + request.getRemoteAddr());

Bu kodla ilgili bir sorun var. Diyelim ki uygulamanız üzerinde çalışıyor productionve günlüğe herhangi bir şey yazmıyor DEBUG-messages, ancak yöntem log.debug()yine de çağrılacak ve çağrıldığında aşağıdaki yöntemler de çağrılacak:

  • user.toString();
  • request.getRemoteAddr();

Bu yöntemlerin çağrılması uygulamayı yavaşlatır. Çağrıları yalnızca hata ayıklama sırasında gereklidir, ancak yine de çağrılırlar.

Mantık açısından, bu sorunun günlük kitaplığının kendisinde çözülmesi gerekiyordu. Ve log4j'nin ilk versiyonunda çözüm geldi:

if (log.isDebugEnabled()) {
    log.debug("User " + user + " connected from " + request.getRemoteAddr());
}

Günlük için bir satır yerine artık üç satır yazmak gerekiyordu. Bu da kodun okunabilirliğini önemli ölçüde kötüleştirdi ve log4j.

Günlükçü, slf4jakıllı günlük kaydı sunarak durumu biraz iyileştirmeyi başardı. Şuna benziyordu:

log.debug("User {} connected from {}", user, request.getRemoteAddr());

burada, {}yöntemde iletilen bağımsız değişkenlerin eklenmesini belirtir. Yani, birincisi {}kullanıcıya, ikincisi {}ise request.getRemoteAddr().

Bu parametreler, yalnızca günlük kaydı düzeyi günlüğe kaydetmeye izin veriyorsa tek bir mesajda birleştirilir. Mükemmel değil ama diğer tüm seçeneklerden daha iyi.

Bundan sonra SLF4Jpopülaritesi hızla artmaya başladı, şu anda bu en iyi çözüm.

Bu nedenle, bir paket örneğini kullanarak günlüğe kaydetmeyi ele alacağız slf4j-log4j12.