CodeGym /Java Blogu /Rastgele /Java Günlüğü
John Squirrels
Seviye
San Francisco

Java Günlüğü

grupta yayınlandı
MERHABA! Dersleri yazarken, gerçek çalışmada kesinlikle gerekli olacak belirli bir konu olup olmadığını özellikle vurgularım. Yani, DİNLEYİN! Bugün ele alacağımız konu, işe başladığınız ilk günden itibaren tüm projelerinizde kesinlikle işinize yarayacaktır. Java Logging hakkında konuşacağız. Bu konu hiç de karmaşık değil (hatta kolay bile diyebilirim). Ancak ilk işinizde vurgulamanız gereken yeterince bariz şey olacak, bu yüzden şimdi tam olarak anlamanız daha iyi :) Pekala, başlayalım.

Java'da oturum açmak nedir?

Günlüğe kaydetme, bir programın çalışmasıyla ilgili verileri kaydetme eylemidir. Bu verileri kaydettiğimiz yere "log" denir. Hemen iki soru ortaya çıkıyor: hangi veriler yazılıyor ve nerede? "Nerede" ile başlayalım. Bir programın çalışmasıyla ilgili verileri birçok farklı yere yazabilirsiniz. Örneğin, çalışmalarınız sırasında sıklıkla System.out.println()verileri konsola çıkarmak için. Bu, en basit haliyle de olsa gerçekten günlük kaydıdır. Elbette bu, kullanıcılar veya ürün destek ekibi için pek uygun değil: Açıkçası, bir IDE yükleyip konsolu izlemek istemeyecekler :) Bilgi kaydetmek için daha alışılmış bir biçim var: metin dosyaları. İnsanlar bu formatta verileri okumak için çok daha rahatlar ve kesinlikle verileri depolamak için çok daha uygundur! Şimdi ikinci soru: hangi program verileri kaydedilmeli? Bu tamamen size kalmış! Java'nın kayıt sistemi çok esnektir. Programınızın yaptığı her şeyi günlüğe kaydedecek şekilde yapılandırabilirsiniz. Bir yandan, bu iyi. Ancak öte yandan, her şeyi içlerine yazsalar Facebook veya Twitter günlüklerinin ne kadar büyük olacağını bir düşünün. Bu büyük şirketler muhtemelen bu kadar çok veriyi depolama yeteneğine sahiptir. Ancak 500 gigabaytlık metin günlüklerinde kritik bir hata hakkında bilgi bulmanın ne kadar zor olacağını bir düşünün. Bu samanlıkta iğne aramaktan daha kötü olurdu. Buna göre Java, yalnızca hata verilerini günlüğe kaydedecek şekilde yapılandırılabilir. Veya sadece kritik hatalar! Bununla birlikte, Java'nın yerel kayıt sisteminden bahsetmek tamamen doğru değildir. Gerçek şu ki, bu işlevsellik dile eklenmeden önce programcıların günlüğe kaydetmeye ihtiyacı vardı. Java kendi günlük kitaplığını tanıttığında, herkes zaten log4j kitaplığını kullanıyordu. Java'da oturum açmanın geçmişi aslında çok uzun ve bilgilendiricidir. Kısacası Java'nın kendi loglama kütüphanesi var ama neredeyse kimse kullanmıyor :) Daha sonra, birkaç farklı günlük kitaplığı ortaya çıktığında ve programcılar tarafından kullanılmaya başladığında, uyumluluk sorunları ortaya çıktı. İnsanların tekerleği farklı arabirimlere sahip bir düzine farklı kitaplıkta yeniden icat etmesini engellemek için soyut SLF4J çerçevesi ("Java İçin Hizmet Kaydı Cephesi") oluşturuldu. Buna soyut denir, çünkü SLF4J sınıflarının yöntemlerini kullanıp çağırsanız bile, aslında daha önce gelen tüm günlük tutma çerçevelerini kullanırlar: log4j, standart java.util.logging ve diğerleri. Bir noktada Log4j'nin diğer kitaplıklarda olmayan belirli bir özelliğine ihtiyacınız varsa, ancak projenizi doğrudan bu kitaplığa bağlamak istemiyorsanız, sadece SLF4J'yi kullanın. Ve sonra Log4j yöntemlerini çağırmasına izin verin. Fikrinizi değiştirir ve artık Log4j özelliklerine ihtiyacınız olmadığına karar verirseniz, yalnızca "burada ve Log4j kitaplığı burada . Ardından, arşivi paketinden çıkarın ve JAR dosyalarını sınıf yoluna eklemek için IntelliJ IDEA'yı kullanın. Menü öğeleri: Dosya -> Proje Yapısı -> Kütüphaneler Gerekli JAR dosyalarını seçin ve projeye ekleyin (indirdiğimiz arşivler birçok JAR dosyası içerir — ihtiyacınız olanları görmek için resimlere bakın) Bu talimatın o öğrenciler için olduğunu unutmayın Neden günlüğe kaydetmeye ihtiyacımız var - 2Neden günlüğe kaydetmeye ihtiyacımız var - 3. Maven kullanmayı bilmeyenler. Maven'i nasıl kullanacağınızı biliyorsanız, oradan başlamayı denemek genellikle daha iyidir (çok daha kolaydır). Maven kullanıyorsanız , bu bağımlılığı ekleyin:

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
Harika! Ayarları bulduk :) SLF4J'nin nasıl çalıştığını görelim. Programın çalışmasının bir yere kaydedildiğinden nasıl emin olabiliriz? Bunu yapmak için iki şeye ihtiyacımız var: logger ve appender. İlki ile başlayalım. Kaydedici, günlüğe kaydetmenin tam kontrolünü sağlayan bir nesnedir. Bir kaydedici oluşturmak çok kolaydır: Bunu statik LoggerFactory.getLogger() yöntemlerini kullanarak yaparız . Yöntem parametresi, işlemi günlüğe kaydedilecek sınıftır. Kodumuzu çalıştıralım:

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

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
Konsol çıktısı:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
Burada ne görüyoruz? İlk önce bir hata mesajı görüyoruz. Bu, artık gerekli ayarlara sahip olmadığımız gerçeğinin bir sonucudur. Buna göre, kaydedicimiz şu anda yalnızca hata mesajları (ERROR) ve yalnızca konsola çıktı verebilmektedir. logger.info () yöntemi çalışmadı. Ama logger.error() yaptı! Konsolda, geçerli tarihi, hatanın oluştuğu yöntemi görüyoruz ( ana), "HATA" kelimesi ve mesajımız! ERROR, günlük kaydı düzeyidir. Genel olarak, bir günlük girişi "ERROR" kelimesiyle işaretlenmişse, programın bu noktasında bir hata oluşmuştur. Giriş "BİLGİ" kelimesiyle işaretlenmişse, mesaj sadece programın normal işleyişi hakkında güncel bilgileri temsil eder. SLF4J kitaplığı, günlüğe kaydetmeyi esnek bir şekilde yapılandırmanıza izin veren birçok farklı günlük kaydı düzeyine sahiptir. Yönetmesi çok kolay: gerekli tüm mantık zaten Java Logger sınıfında. Sadece ilgili yöntemleri çağırmanız gerekir. Rutin bir mesajı günlüğe kaydetmek istiyorsanız, logger.info() yöntemini çağırın. Bir hata mesajı için logger.error() kullanın . Bir uyarı için logger.warn() kullanın

Şimdi apender hakkında konuşalım

Ekleyici, verilerinizin gittiği yerdir. Bir bakıma tam tersi bir veri kaynağı, yani "B noktası". Varsayılan olarak, veriler konsola gönderilir. Önceki örnekte hiçbir şeyi yapılandırmamız gerekmediğini unutmayın: metin konsolda göründü ve Log4j kitaplığının kaydedicisi konsola yalnızca ERROR düzeyinde mesajlar verebilir. Açıkçası, insanların bir metin dosyasında günlükleri okuması ve yazması daha uygundur. Kaydedicinin varsayılan davranışını değiştirmek için dosya ekleyicimizi yapılandırmamız gerekir. Başlamak için doğrudan src klasöründe bir log4j.xml dosyası oluşturmanız gerekir. XML formatına zaten aşinasınız: Geçenlerde bununla ilgili bir ders aldık :) İşte dosyanın içeriği:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
Burada özellikle özel veya zor bir şey yok :) Ama yine de içeriği gözden geçirelim.
<Configuration status="INFO">
Bu sözde StatusLogger'dır. Kaydedicimizle ilgisi yoktur ve Log4j'nin iç süreçlerinde kullanılır. Status="INFO" yerine status="TRACE" ayarlarsanız ve Log4j'nin dahili çalışmasıyla ilgili tüm bilgiler konsolda görüntülenecektir (StatusLogger, ekleyicimiz bir dosya olsa bile verileri konsolda görüntüler). Şimdi buna ihtiyacımız yok, o yüzden olduğu gibi bırakalım.

<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Burada apenderimizi oluşturuyoruz. <File> etiketi , bir dosya ekleyici olacağını belirtir. name="MyFileAppender", ekleyicinin adını ayarlar. fileName="C:\Users\Username\Desktop\testlog.txt", tüm verilerin yazılacağı günlük dosyasının yolunu belirtir. append="true", verilerin dosyanın sonuna yazılması gerekip gerekmediğini belirtir. Bizim durumumuzda, tam olarak yapacağımız şey bu. Değeri false olarak ayarlarsanız, program her başlatıldığında günlük dosyasının eski içeriği silinir. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>biçimlendirme ayarlarını gösterir. Burada, günlüğümüzde metnin nasıl biçimlendirildiğini özelleştirmek için normal ifadeler kullanabiliriz.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Burada kök seviyesini belirtiyoruz. "BİLGİ" seviyesini belirledik, yani seviyeleri BİLGİ'den (yukarıda incelediğimiz tabloya göre) daha yüksek olan tüm mesajlar günlüğe kaydedilmeyecek. Programımızda 3 mesaj olacaktır: bir BİLGİ, bir UYARI ve bir HATA. Mevcut yapılandırma ile 3 mesajın tümü günlüğe kaydedilecektir. Kök düzeyini ERROR olarak değiştirirseniz, günlükte yalnızca LOGGER.error() yöntem çağrısından gelen son mesaj sona erer. Ek olarak, ekleyiciye bir referans da buraya gelir. Böyle bir referans oluşturmak için, <Root> etiketi içinde bir <ApprenderRef> etiketi oluşturmanız ve buna ref='your appender's name' niteliğini eklemeniz gerekir. Unuttuysanız, ekleyenin adını burada ayarlıyoruz: <. Ve işte kodumuz!

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

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
Tabii ki biraz çılgınca (bir RuntimeException yakalamak şüpheli bir fikir), ama bizim amacımız için mükemmel :) Ana() yöntemimizi arka arkaya 4 kez çalıştıralım ve testlog.txt dosyamıza bakalım. Önceden oluşturmanıza gerek yoktur: kitaplık bunu otomatik olarak yapacaktır. Her şey çalıştı! :) Artık yapılandırılmış bir kaydediciniz var. Her yönteme kaydedici çağrıları ekleyerek eski programlarınızın bazılarıyla oynayabilirsiniz. Sonra ortaya çıkan loga bakın :) Loglama konusunu derinlemesine ele alıyor. Hepsini bir oturuşta okumak zor olurdu. Bununla birlikte, pek çok ek yararlı bilgi içerir. Örneğin, testlog.txt dosyamız belirli bir boyuta ulaşırsa yeni bir metin dosyası oluşturacak şekilde kaydediciyi nasıl yapılandıracağınızı öğreneceksiniz :) Ve böylece dersimiz sona eriyor! Bugün çok önemli bir konuya aşina oldunuz ve bu bilgi kesinlikle gelecekteki çalışmalarınızda size yardımcı olacaktır. Bir sonrakine kadar! :)
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION