log4j - Hızlı Kılavuz

log4j, Apache Yazılım Lisansı altında dağıtılan, Java dilinde yazılmış, güvenilir, hızlı ve esnek bir günlükleme çerçevesidir (API'ler).

log4j, C, C ++, C #, Perl, Python, Ruby ve Eiffel dillerine taşınmıştır.

log4j, çalışma zamanında harici yapılandırma dosyaları aracılığıyla yüksek düzeyde yapılandırılabilir. Günlüğe kaydetme sürecini öncelik seviyeleri açısından görüntüler ve günlük bilgilerini bir veritabanı, dosya, konsol, UNIX Syslog vb. Gibi çok çeşitli hedeflere yönlendirmek için mekanizmalar sunar.

log4j'nin üç ana bileşeni vardır:

  • loggers: Günlük bilgilerini yakalamaktan sorumludur.

  • appenders: Günlük bilgilerini çeşitli tercih edilen hedeflerde yayınlamaktan sorumludur.

  • layouts: Günlük bilgilerini farklı stillerde biçimlendirmekten sorumludur.

Log4j tarihi

  • 1996 yılının başlarında EU SEMPER (Avrupa için Güvenli Elektronik Pazar Yeri) projesi için izleme API'si olarak başladı.

  • Sayısız geliştirme ve birkaç enkarnasyondan sonra, ilk API, Java için popüler bir günlük kaydı paketi olan log4j'ye dönüştü.

  • Paket, açık kaynak girişimi tarafından onaylanmış tam teşekküllü bir açık kaynak lisansı olan Apache Yazılım Lisansı altında dağıtılır.

  • Tam kaynak kodu, sınıf dosyaları ve dokümantasyon dahil en son log4j sürümü şu adreste bulunabilir: http://logging.apache.org/log4j/.

log4j Özellikleri

  • İş parçacığı açısından güvenlidir.

  • Hız için optimize edilmiştir.

  • Adlandırılmış bir günlükçü hiyerarşisine dayanır.

  • Kaydedici başına birden çok çıktı ekleyiciyi destekler.

  • Uluslararasılaşmayı destekler.

  • Önceden tanımlanmış bir tesis setiyle sınırlı değildir.

  • Günlük davranışı, bir yapılandırma dosyası kullanılarak çalışma zamanında ayarlanabilir.

  • Başlangıçtan itibaren Java İstisnalarını ele almak için tasarlanmıştır.

  • ALL, TRACE, DEBUG, INFO, WARN, ERROR ve FATAL olmak üzere birden çok seviye kullanır.

  • Günlük çıktısının biçimi, Layout sınıfı genişletilerek kolayca değiştirilebilir .

  • Günlük çıktısının hedefi ve yazma stratejisi, Appender arayüzünün uygulamalarıyla değiştirilebilir.

  • Başarısızlıktır. Ancak, kesinlikle teslimatı sağlamaya çalışsa da, log4j her log ifadesinin hedefine teslim edileceğini garanti etmez.

Günlük Kaydının Artıları ve Eksileri

Loglama, yazılım geliştirmenin önemli bir bileşenidir. İyi yazılmış bir günlük kaydı kodu, hızlı hata ayıklama, kolay bakım ve bir uygulamanın çalışma zamanı bilgilerinin yapılandırılmış depolanmasını sağlar.

Günlük tutmanın da dezavantajları vardır. Bir uygulamayı yavaşlatabilir. Çok ayrıntılı olursa, kaydırma körlüğüne neden olabilir. Bu endişeleri gidermek için log4j güvenilir, hızlı ve genişletilebilir olacak şekilde tasarlanmıştır.

Günlüğe kaydetme, nadiren bir uygulamanın ana odak noktası olduğundan, log4j API'sinin anlaşılması ve kullanılması basit olmaya çalışır.

log4j API paketi, açık kaynak girişimi tarafından onaylanmış tam teşekküllü bir açık kaynak lisansı olan Apache Yazılım Lisansı altında dağıtılır.

Tam kaynak kodu, sınıf dosyaları ve belgeler dahil en son log4j sürümü şu adreste bulunabilir: http://logging.apache.org/log4j/.

Sisteminize log4j yüklemek için apache-log4j-xxxtar.gz dosyasını belirtilen URL'den indirin ve aşağıda verilen adımları izleyin.

Aşama 1

İndirilen dosyayı / usr / local / dizininde aşağıdaki gibi açın ve açın:

$ gunzip apache-log4j-1.2.15.tar.gz
$ tar -xvf apache-log4j-1.2.15.tar
apache-log4j-1.2.15/tests/input/
apache-log4j-1.2.15/tests/input/xml/
apache-log4j-1.2.15/tests/src/
apache-log4j-1.2.15/tests/src/java/
apache-log4j-1.2.15/tests/src/java/org/
.......................................

Dizini kaldırırken, aşağıdaki gibi apache-log4j-xxx adıyla bir dizin hiyerarşisi oluşturur:

-rw-r--r--  1 root root   3565 2007-08-25 00:09 BUILD-INFO.txt
-rw-r--r--  1 root root   2607 2007-08-25 00:09 build.properties.sample
-rw-r--r--  1 root root  32619 2007-08-25 00:09 build.xml
drwxr-xr-x 14 root root   4096 2010-02-04 14:09 contribs
drwxr-xr-x  5 root root   4096 2010-02-04 14:09 examples
-rw-r--r--  1 root root   2752 2007-08-25 00:09 INSTALL
-rw-r--r--  1 root root   4787 2007-08-25 00:09 KEYS
-rw-r--r--  1 root root  11366 2007-08-25 00:09 LICENSE
-rw-r--r--  1 root root 391834 2007-08-25 00:29 log4j-1.2.15.jar
-rw-r--r--  1 root root    160 2007-08-25 00:09 NOTICE
-rwxr-xr-x  1 root root  10240 2007-08-25 00:27 NTEventLogAppender.dll
-rw-r--r--  1 root root  17780 2007-08-25 00:09 pom.xml
drwxr-xr-x  7 root root   4096 2007-08-25 00:13 site
drwxr-xr-x  8 root root   4096 2010-02-04 14:08 src
drwxr-xr-x  6 root root   4096 2010-02-04 14:09 tests

Adım 2

Bu adım isteğe bağlıdır ve log4j çerçevesinden hangi özellikleri kullanacağınıza bağlıdır. Makinenizde halihazırda aşağıdaki paketler yüklüyse sorun değil, aksi takdirde log4j'nin çalışması için bunları yüklemeniz gerekir.

  • JavaMail API:Log4j'deki e-posta tabanlı günlük kaydı özelliği, Java Mail API'nin (mail.jar) glassfish.dev'den makinenize yüklenmesini gerektirir .

  • JavaBeans Activation Framework: Java Mail API ayrıca JavaBeans Aktivasyon Çerçevesinin (activation.jar) makinenize şuradan yüklenmesini gerektirecektir: http://java.sun.com/products/javabeans/jaf/index.jsp.

  • Java Message Service: Log4j'nin JMS uyumlu özellikleri, hem JMS hem de Java Adlandırma ve Dizin Arayüzü JNDI'nin makinenize şuradan yüklenmesini gerektirir: http://java.sun.com/products/jms.

  • XML Parser:Log4j'yi kullanmak için JAXP uyumlu bir XML ayrıştırıcısına ihtiyacınız vardır. Bilgisayarınızda Xerces.jar'ın kurulu olduğundan emin olun.http://xerces.apache.org/xerces-j/install.html.

Aşama 3

Şimdi kurmanız gerekiyor CLASSPATH ve PATHuygun şekilde değişkenler. Burada sadece log4j.xxxjar dosyası için ayarlayacağız.

$ pwd
/usr/local/apache-log4j-1.2.15
$ export CLASSPATH= \
      $CLASSPATH:/usr/local/apache-log4j-1.2.15/log4j-1.2.15.jar
$ export PATH=$PATH:/usr/local/apache-log4j-1.2.15/

log4j API, her katmanın farklı görevleri gerçekleştirmek için farklı nesneler sağladığı katmanlı bir mimariyi takip eder. Bu katmanlı mimari, tasarımı esnek ve gelecekte genişletmeyi kolaylaştırır.

Log4j çerçevesi ile kullanılabilen iki tür nesne vardır.

  • Core Objects:Bunlar çerçevenin zorunlu nesneleridir. Çerçeveyi kullanmaları gerekir.

  • Support Objects:Bunlar çerçevenin isteğe bağlı nesneleridir. Ek ancak önemli görevleri gerçekleştirmek için temel nesneleri desteklerler.

Çekirdek Nesneler

Çekirdek nesneler aşağıdaki nesne türlerini içerir:

Logger Nesnesi

En üst düzey katman, Logger nesnesini sağlayan Logger'dır. Logger nesnesi, günlük bilgilerinin yakalanmasından sorumludur ve bir ad alanı hiyerarşisinde depolanır.

Düzen Nesnesi

Düzen katmanı, günlük bilgilerini farklı stillerde biçimlendirmek için kullanılan nesneler sağlar. Günlük bilgilerini yayınlamadan önce nesneleri eklemek için destek sağlar.

Düzen nesneleri, günlük bilgilerinin insan tarafından okunabilir ve yeniden kullanılabilir bir şekilde yayınlanmasında önemli bir rol oynar.

Ekleyen Nesne

Bu, Appender nesnelerini sağlayan alt düzey bir katmandır. Appender nesnesi, günlük bilgilerini bir veritabanı, dosya, konsol, UNIX Syslog vb. Gibi çeşitli tercih edilen hedeflerde yayınlamaktan sorumludur.

Aşağıdaki sanal diyagram, log4J çerçevesinin bileşenlerini gösterir:

Destek Nesneleri

Log4j çerçevesinde, günlükleme çerçevesinde hayati bir rol oynayan başka önemli nesneler vardır:

Seviye Nesnesi

Level nesnesi, tüm günlük bilgilerinin ayrıntı düzeyini ve önceliğini tanımlar. API içinde tanımlanan yedi günlük kaydı seviyesi vardır: KAPALI, HATA AYIKLA, BİLGİ, HATA, UYARI, ÖNEMLİ ve TÜMÜ.

Nesneyi Filtrele

Filtre nesnesi, günlük bilgilerini analiz etmek ve bu bilgilerin günlüğe kaydedilip kaydedilmeyeceği konusunda daha fazla karar vermek için kullanılır.

Bir Appender nesnesinin kendileriyle ilişkilendirilmiş birkaç Filtre nesnesi olabilir. Günlük bilgileri belirli bir Appender nesnesine aktarılırsa, bu Appender ile ilişkili tüm Filtre nesnelerinin, eklenen hedefe yayınlanmadan önce günlük bilgilerini onaylaması gerekir.

ObjectRenderer

ObjectRenderer nesnesi, günlük çerçevesine geçirilen farklı nesnelerin String temsilini sağlamada uzmanlaşmıştır. Bu nesne, son günlük kaydı bilgilerini hazırlamak için Layout nesneleri tarafından kullanılır.

LogManager

LogManager nesnesi, günlük çerçevesini yönetir. Sistem genelinde bir yapılandırma dosyasından veya bir yapılandırma sınıfından ilk yapılandırma parametrelerini okumaktan sorumludur.

Önceki bölüm log4j'nin temel bileşenlerini açıkladı. Bu bölüm, bir yapılandırma dosyası kullanarak temel bileşenleri nasıl yapılandırabileceğinizi açıklar. Log4j'yi yapılandırmak, Seviye atamayı, Appender'ı tanımlamayı ve bir yapılandırma dosyasında Layout nesnelerini belirtmeyi içerir.

Log4j.properties dosya anahtarı değer çiftleri özelliklerini tutan bir log4j yapılandırma dosyasıdır. Varsayılan olarak, LogManager bir dosya adında arar log4j.properties içindeCLASSPATH.

  • Kök kaydedicinin seviyesi DEBUG olarak tanımlanır. DEBUG, X adlı ekleyiciyi buna ekler.

  • X adlı ekleyiciyi geçerli bir ekleyici olarak ayarlayın.

  • Ekleyici X için düzeni ayarlayın.

log4j.properties Sözdizimi:

Ekleyici X için log4j.properties dosyasının sözdizimi aşağıdadır :

# Define the root logger with appender X
log4j.rootLogger = DEBUG, X

# Set the appender named X to be a File appender
log4j.appender.X=org.apache.log4j.FileAppender

# Define the layout for X appender
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.conversionPattern=%m%n

log4j.properties Örnek

Yukarıdaki sözdizimini kullanarak, log4j.properties dosyasında aşağıdakileri tanımlarız :

  • Kök kaydedicinin seviyesi, DEBUG olarak tanımlanır, DEBUG ekleyicisi FILE olarak adlandırılır.

  • Ekleyici FILE, org.apache.log4j.FileAppender olarak tanımlanır . İçinde bulunan "log.out" adlı bir dosyaya yazar.log dizin.

  • Tanımlanan düzen kalıbı % m% n , yani yazdırılan günlük mesajının ardından bir satırsonu karakteri gelecektir.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Log4j'nin $ {variableName} gibi UNIX tarzı değişken değiştirmeyi desteklediğine dikkat etmek önemlidir.

Hata ayıklama düzeyi

Her iki ek ile de DEBUG kullandık. Olası tüm seçenekler şunlardır:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • ALL

Bu seviyeler log4j Logging Seviyelerinde açıklanacaktır .

Ekler

Apache log4j, öncelikle günlük mesajlarını konsollar, dosyalar, soketler, NT olay günlükleri vb. Gibi farklı hedeflere yazdırmaktan sorumlu olan Appender nesneleri sağlar.

Her Appender nesnesinin kendisiyle ilişkili farklı özellikleri vardır ve bu özellikler, o nesnenin davranışını gösterir.

Emlak Açıklama
Yerleşim Appender, günlük bilgilerini biçimlendirmek için Düzen nesnelerini ve bunlarla ilişkili dönüştürme modelini kullanır.
hedef Hedef, ekleyiciye bağlı olarak bir konsol, dosya veya başka bir öğe olabilir.
seviye Seviye, günlük mesajlarının filtrelemesini kontrol etmek için gereklidir.
eşik Ekleyici, kaydedici düzeyinden bağımsız olarak kendisiyle ilişkilendirilmiş bir eşik düzeyine sahip olabilir. Appender, eşik seviyesinden daha düşük bir seviyeye sahip tüm günlük mesajlarını yok sayar.
filtre Filtre nesneleri, günlük bilgilerini seviye eşleştirmesinin ötesinde analiz edebilir ve günlükleme isteklerinin belirli bir Ekleyici tarafından ele alınmasına veya yok sayılmasına karar verebilir.

Aşağıdaki yöntemle yapılandırma dosyasına aşağıdaki ayarı ekleyerek Logger'a bir Appender nesnesi ekleyebiliriz:

log4j.logger.[logger-name]=level, appender1,appender..n

Aynı yapılandırmayı XML biçiminde aşağıdaki gibi yazabilirsiniz:

<logger name="com.apress.logging.log4j" additivity="false">
   <appender-ref ref="appender1"/>
   <appender-ref ref="appender2"/>
</logger>

Programınızın içine Appender nesnesi eklemek istiyorsanız, aşağıdaki yöntemi kullanabilirsiniz:

public void addAppender(Appender appender);

AddAppender () yöntemi, Logger nesnesine bir Appender ekler. Örnek yapılandırmanın gösterdiği gibi, birçok Appender nesnesini virgülle ayrılmış bir listede bir kaydediciye eklemek mümkündür, her bir günlük bilgilerini ayrı hedeflere yazdırır.

Yukarıdaki örneğimizde yalnızca bir ekleyici FileAppender kullandık . Tüm olası ekleyici seçenekleri şunlardır:

  • AppenderSkeleton
  • AsyncAppender
  • ConsoleAppender
  • DailyRollingFileAppender
  • ExternallyRolledFileAppender
  • FileAppender
  • JDBCAppender
  • JMSAppender
  • LF5Appender
  • NTEventLogAppender
  • NullAppender
  • RollingFileAppender
  • SMTPAppender
  • SocketAppender
  • SocketHubAppender
  • SyslogAppender
  • TelnetAppender
  • WriterAppender

FileAppender'ı Logging in Files'da ve JDBC Appender Veritabanında Logging'de ele alacağız .

Yerleşim

Ekleyicimizle PatternLayout'u kullandık. Olası tüm seçenekler şunlardır:

  • DateLayout
  • HTMLLayout
  • PatternLayout
  • SimpleLayout
  • XMLLayout

HTMLLayout ve XMLLayout kullanarak, HTML ve XML biçiminde de günlük oluşturabilirsiniz.

Düzen Biçimlendirme

Günlük mesajını nasıl biçimlendireceğinizi şu bölümde öğreneceksiniz: Günlük Biçimlendirme .

Bir yapılandırma dosyasının nasıl oluşturulacağını gördük. Bu bölüm, hata ayıklama mesajlarının nasıl oluşturulacağını ve bunların basit bir metin dosyasına nasıl kaydedileceğini açıklar.

Aşağıda, örneğimiz için oluşturulmuş basit bir yapılandırma dosyası verilmiştir. Bir kez daha gözden geçirelim:

  • Kök kaydedicinin seviyesi DEBUG olarak tanımlanır ve FILE adlı ekleyiciyi ona ekler.

  • Ekleyici FILE org.apache.log4j.FileAppender olarak tanımlanır ve şurada bulunan "log.out" adlı bir dosyaya yazar. log dizin.

  • Tanımlanan düzen kalıbı% m% n, yani yazdırılan günlük mesajının ardından bir satırsonu karakteri gelecektir.

Log4j.properties dosyasının içeriği aşağıdaki gibidir:

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Java Programında log4j kullanma

Aşağıdaki Java sınıfı, Java uygulamaları için Log4J günlük kitaplığını başlatan ve daha sonra kullanan çok basit bir örnektir.

import org.apache.log4j.Logger;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class log4jExample{
   /* Get actual class name to be printed on */
   static Logger log = Logger.getLogger(log4jExample.class.getName());
   
   public static void main(String[] args)throws IOException,SQLException{
      log.debug("Hello this is a debug message");
      log.info("Hello this is an info message");
   }
}

Derleyin ve Çalıştırın

İşte yukarıda bahsedilen programı derlemek ve çalıştırmak için adımlar. Ayarladığınızdan emin olunPATH ve CLASSPATH derleme ve yürütme için ilerlemeden önce uygun şekilde.

Tüm kütüphaneler şurada bulunmalıdır: CLASSPATHve log4j.properties dosyanız PATH içinde bulunmalıdır. Aşağıda verilen adımları izleyin:

  • Yukarıda gösterildiği gibi log4j.properties oluşturun.

  • Log4jExample.java'yı yukarıda gösterildiği gibi oluşturun ve derleyin.

  • Programı çalıştırmak için log4jExample ikili dosyasını çalıştırın.

/Usr/home/log4j/log.out dosyasında aşağıdaki sonucu alırsınız:

Hello this is a debug message
Hello this is an info message

Logger sınıfı, günlüğe kaydetme etkinliklerini işlemek için çeşitli yöntemler sağlar. Logger sınıfı, yeni bir Logger örneğini başlatmamıza izin vermez, ancak bir Logger nesnesi elde etmek için iki statik yöntem sağlar:

  • public static Logger getRootLogger();
  • public static Logger getLogger(String name);

İki yöntemden ilki, uygulama örneğinin kök günlüğünü döndürür ve bir adı yoktur.

Diğer adlandırılmış Logger nesnesi örneği, kaydedicinin adını ileterek ikinci yöntemle elde edilir. Kaydedicinin adı geçebileceğiniz herhangi bir dizge olabilir, genellikle bir sınıf veya son bölümde kullandığımız gibi bir paket adı ve aşağıda bahsedilmektedir:

static Logger log = Logger.getLogger(log4jExample.class.getName());

Günlük Yöntemleri

Adlandırılmış bir kaydedicinin bir örneğini elde ettiğimizde, mesajları günlüğe kaydetmek için günlükçünün çeşitli yöntemlerini kullanabiliriz. Logger sınıfı, günlük bilgilerini yazdırmak için aşağıdaki yöntemlere sahiptir.

Sr.No Yöntemler ve Açıklama
1 public void debug(Object message)

Level.DEBUG ile mesajları yazdırır.

2 public void error(Object message)

Level.Hata ile iletileri yazdırır.

3 public void fatal(Object message);

Level.FATAL seviyesi ile mesajları yazdırır.

4 public void info(Object message);

Level.INFO ile mesajları yazdırır.

5 public void warn(Object message);

Level.WARN düzeyine sahip iletileri yazdırır.

6 public void trace(Object message);

Level.TRACE ile iletileri yazdırır.

Tüm seviyeler org.apache.log4j.Level sınıfında tanımlanır ve yukarıda belirtilen yöntemlerden herhangi biri şu şekilde çağrılabilir:

import org.apache.log4j.Logger;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   
   public static void main(String[] args) {
      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

LogClass programını derleyip çalıştırdığınızda, aşağıdaki sonucu üretir:

Debug Message!
Info Message!
Warn Message!
Error Message!
Fatal Message!

Tüm hata ayıklama mesajları, seviyelerle birlikte kullanıldıklarında daha anlamlıdır. Bir sonraki bölümde seviyeleri ele alacağız ve ardından, bu yöntemleri farklı hata ayıklama seviyeleriyle birlikte nasıl kullanacağınızı iyi bir şekilde anlayacaksınız.

Org.apache.log4j.Level sınıfı aşağıdaki seviyeleri sağlar. Seviye sınıfını alt sınıflandırarak özel seviyelerinizi de tanımlayabilirsiniz.

Seviye Açıklama
HERŞEY Özel seviyeler dahil tüm seviyeler.
HATA AYIKLA Bir uygulamada hata ayıklamak için en yararlı olan ayrıntılı bilgi olaylarını belirtir.
BİLGİ Uygulamanın ilerlemesini kaba düzeyde vurgulayan bilgi mesajlarını belirtir.
UYARI Potansiyel olarak zararlı durumları belirtir.
HATA Uygulamanın çalışmaya devam etmesine hala izin verebilecek hata olaylarını belirtir.
ÖLÜMCÜL Muhtemelen uygulamanın iptal edilmesine neden olacak çok ciddi hata olaylarını belirtir.
KAPALI Mümkün olan en yüksek derece ve günlük kaydını kapatması amaçlanmıştır.
İZLEME DEBUG'tan daha ayrıntılı bilgi olaylarını belirtir.

Seviyeler Nasıl Çalışır?

Seviye günlük isteği p seviyeli bir kaydedicide qp> = q ise etkindir. Bu kural log4j'nin kalbindedir. Seviyelerin sıralandığını varsayar. Standart seviyeler için TÜM <DEBUG <INFO <WARN <ERROR <FATAL <OFF var.

Aşağıdaki örnek, tüm DEBUG ve INFO mesajlarımıza nasıl filtre uygulayabileceğimizi gösterir. Bu program, istenen günlük kaydı seviyesini ayarlamak için setLevel (Level.X) logger yöntemini kullanır:

Bu örnek, Debug ve Info dışındaki tüm mesajları yazdırır:

import org.apache.log4j.*;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   
   public static void main(String[] args) {
      log.setLevel(Level.WARN);

      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

LogClass programını derleyip çalıştırdığınızda, aşağıdaki sonucu üretir:

Warn Message!
Error Message!
Fatal Message!

Yapılandırma Dosyasını Kullanarak Düzeyleri Ayarlama

log4j, hata ayıklama seviyesini değiştirmek istediğinizde kaynak kodunu değiştirmekten sizi özgür kılan konfigürasyon dosyası tabanlı seviye ayarı sağlar.

Aşağıda, yukarıdaki örnekte log.setLevel (Level.WARN) yöntemini kullanarak yaptığımızla aynı görevi gerçekleştirecek örnek bir yapılandırma dosyası verilmiştir .

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Şimdi aşağıdaki programımızı kullanalım:

import org.apache.log4j.*;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   public static void main(String[] args) {
      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

Şimdi yukarıdaki programı derleyin ve çalıştırın ve /usr/home/log4j/log.out dosyasında aşağıdaki sonucu alacaksınız:

Warn Message!
Error Message!
Fatal Message!

Apache log4j, her biri günlük verilerini çeşitli düzenlere göre biçimlendirebilen çeşitli Layout nesneleri sağlar. Günlük verilerini uygulamaya özel bir şekilde biçimlendiren bir Layout nesnesi oluşturmak da mümkündür.

Tüm Layout nesneleri, Appender nesnelerinden bir LoggingEvent nesnesi alır. Layout nesneleri daha sonra LoggingEvent'ten mesaj bağımsız değişkenini alır ve mesajın String temsilini elde etmek için uygun ObjectRenderer'ı uygular.

Düzen Türleri

Hiyerarşideki en üst düzey sınıf soyut sınıf org.apache.log4j.Layout'tur. Bu, log4j API'sindeki diğer tüm Layout sınıfları için temel sınıftır.

Layout sınıfı bir uygulama içinde soyut olarak tanımlanır, bu sınıfı asla doğrudan kullanmayız; bunun yerine aşağıdaki gibi alt sınıfları ile çalışıyoruz:

  • DateLayout

  • HTMLLayout

  • PatternLayout.

  • SimpleLayout

  • XMLLayout

Düzen Yöntemleri

Bu sınıf, diğer tüm Layout nesnelerindeki tüm ortak işlemlerin iskelet uygulamasını sağlar ve iki soyut yöntemi bildirir.

Sr.No. Yöntemler ve Açıklama
1 public abstract boolean ignoresThrowable()

Günlük bilgilerinin, günlük olayının bir parçası olarak kendisine iletilen java.lang.Throwable nesnesini işleyip işlemediğini gösterir. Layout nesnesi Throwable nesnesini işliyorsa, Layout nesnesi onu yok saymaz ve false değerini döndürür.

2 public abstract String format(LoggingEvent event)

Bireysel düzen alt sınıfları, düzene özgü biçimlendirme için bu yöntemi uygular.

Bu soyut yöntemlerin dışında Layout sınıfı, aşağıda listelenen yöntemler için somut uygulama sağlar:

Sr.No. Yöntemler ve Açıklama
1 public String getContentType()

Layout nesneleri tarafından kullanılan içerik türünü döndürür. Temel sınıf, varsayılan içerik türü olarak metin / düz döndürür.

2 public String getFooter()

Günlük mesajının altbilgi bilgisini belirtir.

3 public String getHeader()

Günlük mesajının başlık bilgisini belirtir.

Her alt sınıf, bu yöntemlerin somut uygulamasını geçersiz kılarak sınıfa özgü bilgileri döndürebilir.

Günlük bilgilerinizi bir dosyaya yazmak için org.apache.log4j.FileAppender'ı kullanmanız gerekir .

FileAppender Yapılandırması

FileAppender aşağıdaki yapılandırılabilir parametrelere sahiptir:

Emlak Açıklama
instantFlush Bu bayrak varsayılan olarak true değerine ayarlıdır; bu, her ekleme işlemiyle temizlenen dosyaya yönelik çıkış akışı anlamına gelir.
kodlama Herhangi bir karakter kodlamasını kullanmak mümkündür. Varsayılan olarak, platforma özgü kodlama şemasıdır.
eşik Bu ekleyici için eşik seviyesi.
Dosya adı Günlük dosyasının adı.
fileAppend Bu, varsayılan olarak true değerine ayarlıdır; bu, günlük bilgilerinin aynı dosyanın sonuna ekleneceği anlamına gelir.
bufferedIO Bu bayrak, arabelleğe alınmış yazmanın etkinleştirilmesine ihtiyacımız olup olmadığını gösterir. Varsayılan olarak, false değerine ayarlanmıştır.
bufferSize Arabelleğe alınan G / Ç etkinleştirilirse, arabellek boyutunu gösterir. Varsayılan olarak 8kb olarak ayarlanmıştır.

Aşağıdaki örnek bir yapılandırma dosyası log4j.properties FileAppender için.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, overwrite
log4j.appender.FILE.Append=false

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Yukarıdaki log4j.properties dosyasına eşdeğer bir XML yapılandırma dosyasına sahip olmak istiyorsanız , içerik şu şekildedir :

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

<appender name="FILE" class="org.apache.log4j.FileAppender">
   <param name="file" value="${log}/log.out"/>
   <param name="immediateFlush" value="true"/>
   <param name="threshold" value="debug"/>
   <param name="append" value="false"/>
   <layout class="org.apache.log4j.PatternLayout">
      <param name="conversionPattern" value="%m%n"/>
   </layout>
</appender>

<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="FILE"/>
</logger>

</log4j:configuration>

Log4j - Örnek Program'ı yukarıdaki yapılandırmayla deneyebilirsiniz .

Birden Çok Dosyada Oturum Açma

Günlük mesajlarınızı belirli nedenlerle birden çok dosyaya yazmak isteyebilirsiniz, örneğin dosya boyutu belirli bir eşiğe ulaştıysa.

Günlük bilgilerinizi birden çok dosyaya yazmak için , FileAppender sınıfını genişleten ve tüm özelliklerini devralan org.apache.log4j.RollingFileAppender sınıfını kullanmanız gerekir .

FileAppender için yukarıda belirtilenlere ek olarak aşağıdaki yapılandırılabilir parametrelere sahibiz:

Emlak Açıklama
Maksimum Dosya Boyutu Bu, dosyanın üzerine alınacağı kritik dosyanın boyutudur. Varsayılan değer 10 MB'dir.
maxBackupIndex Bu özellik, oluşturulacak yedekleme dosyalarının sayısını belirtir. Varsayılan değer 1'dir.

Aşağıdaki örnek bir yapılandırma dosyası log4j.properties RollingFileAppender için.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true

# Set the maximum file size before rollover
log4j.appender.FILE.MaxFileSize=5MB

# Set the the backup index
log4j.appender.FILE.MaxBackupIndex=2

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Bir XML yapılandırma dosyasına sahip olmak istiyorsanız, ilk bölümde anlatılanların aynısını oluşturabilir ve yalnızca RollingFileAppender ile ilgili ek parametreleri ekleyebilirsiniz .

Bu örnek yapılandırma, her günlük dosyasının izin verilen maksimum boyutunun 5 MB olduğunu gösterir. Maksimum boyut aşıldığında, yeni bir günlük dosyası oluşturulacaktır. Yana maxBackupIndex 2 olarak tanımlanan ikinci bir dosya en büyük boyutuna ulaştığı zaman, birinci kayıt dosyası silinir ve daha sonra, tüm günlük bilgi birinci günlük dosyasına geri alınır.

Log4j - Örnek Program'ı yukarıdaki yapılandırmayla deneyebilirsiniz .

Günlük Günlük Dosyası Oluşturma

Günlük bilgilerinizin temiz bir kaydını tutmak için günlük dosyalarınızı günlük olarak oluşturmanız gerekebilir.

Günlük bilgilerinizi günlük olarak dosyalara yazmak için , FileAppender sınıfını genişleten ve tüm özelliklerini devralan org.apache.log4j.DailyRollingFileAppender sınıfını kullanmanız gerekir .

FileAppender için yukarıda belirtilenlere ek olarak yalnızca bir önemli yapılandırılabilir parametre vardır:

Emlak Açıklama
DatePattern Bu, dosyanın ne zaman devredileceğini ve izlenecek adlandırma kuralını gösterir. Varsayılan olarak, devir her gün gece yarısında gerçekleştirilir.

DatePattern, aşağıdaki modellerden birini kullanarak rollover programını kontrol eder:

DatePattern Açıklama
"." yyyy-MM Her ayın sonunda ve sonraki ayın başında devir yapın.
"." yyyy-AA-gg Her gün gece yarısı çevirin. Bu varsayılan değerdir.
"." yyyy-AA-gg-a Her gün öğlen ve gece yarısı döndürün.
"." yyyy-AA-gg-HH Her saat başı dönün.
"." yyyy-AA-gg-HH-mm Her dakika çevirin.
"." yyyy-ww Yerel ayara bağlı olarak her haftanın ilk gününde çevirin.

Aşağıda, her gün öğlen ve gece yarısında günlük dosyaları oluşturmak için örnek bir yapılandırma dosyası log4j.properties verilmiştir.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true

# Set the DatePattern
log4j.appender.FILE.DatePattern='.' yyyy-MM-dd-a

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Bir XML yapılandırma dosyasına sahip olmak isterseniz, ilk bölümde anlatılanların aynısını oluşturabilir ve yalnızca DailyRollingFileAppender ile ilgili ek parametreleri ekleyebilirsiniz .

Log4j - Örnek Program'ı yukarıdaki yapılandırmayla deneyebilirsiniz .

Log4j API'si, belirli bir veritabanına günlük bilgilerini koyabilen org.apache.log4j.jdbc.JDBCAppender nesnesini sağlar .

JDBCAppender Yapılandırması

Emlak Açıklama
bufferSize Arabellek boyutunu ayarlar. Varsayılan boyut 1'dir.
sürücü Sürücü sınıfını belirtilen dizeye ayarlar. Sürücü sınıfı belirtilmezse, varsayılan olarak sun.jdbc.odbc.JdbcOdbcDriver olur.
Yerleşim Kullanılacak düzeni ayarlar. Varsayılan düzen org.apache.log4j.PatternLayout şeklindedir.
parola Veritabanı şifresini ayarlar.
sql Her günlüğe kaydetme olayı gerçekleştiğinde yürütülecek SQL ifadesini belirtir. Bu INSERT, UPDATE veya DELETE olabilir.
URL JDBC URL'sini ayarlar.
kullanıcı Veritabanı kullanıcı adını ayarlar.

Günlük Tablo Yapılandırması

JDBC tabanlı günlük kaydını kullanmaya başlamadan önce, tüm günlük bilgilerini korumak için bir tablo oluşturmalısınız. LOGS tablosunu oluşturmak için SQL İfadesi aşağıdadır:

CREATE TABLE LOGS
   (USER_ID VARCHAR(20) NOT NULL,
    DATED   DATE NOT NULL,
    LOGGER  VARCHAR(50) NOT NULL,
    LEVEL   VARCHAR(10) NOT NULL,
    MESSAGE VARCHAR(1000) NOT NULL
   );

Örnek Yapılandırma Dosyası

Aşağıda, mesajları bir LOGS tablosuna kaydetmek için kullanılacak olan JDBCAppender için örnek bir yapılandırma dosyası log4j.properties bulunmaktadır.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, DB

# Define the DB appender
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender

# Set JDBC URL
log4j.appender.DB.URL=jdbc:mysql://localhost/DBNAME

# Set Database Driver
log4j.appender.DB.driver=com.mysql.jdbc.Driver

# Set database user name and password
log4j.appender.DB.user=user_name
log4j.appender.DB.password=password

# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')

# Define the layout for file appender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

MySQL veritabanı için, LOGS tablosunu oluşturduğunuz gerçek DBNAME, kullanıcı kimliği ve parolayı kullanmanız gerekir. SQL deyimi, LOGS tablo adı ve tabloya girilecek değerlerle bir INSERT deyimi yürütmek içindir.

JDBCAppender'ın açıkça tanımlanması için bir düzene ihtiyacı yoktur. Bunun yerine, kendisine iletilen SQL ifadesi bir PatternLayout kullanır.

Yukarıdaki log4j.properties dosyasına eşdeğer bir XML yapılandırma dosyasına sahip olmak istiyorsanız , içerik şu şekildedir :

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
   <param name="url" value="jdbc:mysql://localhost/DBNAME"/>
   <param name="driver" value="com.mysql.jdbc.Driver"/>
   <param name="user" value="user_id"/>
   <param name="password" value="password"/>
   <param name="sql" value="INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')"/>
   <layout class="org.apache.log4j.PatternLayout">
   </layout>
</appender>

<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="DB"/>
</logger>

</log4j:configuration>

Örnek Program

Aşağıdaki Java sınıfı, Java uygulamaları için Log4J günlük kitaplığını başlatan ve daha sonra kullanan çok basit bir örnektir.

import org.apache.log4j.Logger;
import java.sql.*;
import java.io.*;
import java.util.*;

public class log4jExample{
   /* Get actual class name to be printed on */
   static Logger log = Logger.getLogger(log4jExample.class.getName());
   
   public static void main(String[] args)throws IOException,SQLException{
      log.debug("Debug");
      log.info("Info");
   }
}

Derleyin ve Çalıştırın

İşte yukarıda bahsedilen programı derlemek ve çalıştırmak için adımlar. Ayarladığınızdan emin olunPATH ve CLASSPATH derleme ve yürütme için ilerlemeden önce uygun şekilde.

Tüm kütüphaneler şurada bulunmalıdır: CLASSPATHve log4j.properties dosyanız PATH içinde bulunmalıdır. Verilen adımları izleyin:

  • Yukarıda gösterildiği gibi log4j.properties oluşturun.
  • Log4jExample.java'yı yukarıda gösterildiği gibi oluşturun ve derleyin.
  • Programı çalıştırmak için log4jExample ikili dosyasını çalıştırın.

Şimdi DBNAME veritabanı içindeki LOGS tablonuzu kontrol edin ve aşağıdaki girişleri bulacaksınız:

mysql >  select * from LOGS;
+---------+------------+--------------+-------+---------+
| USER_ID | DATED      | LOGGER       | LEVEL | MESSAGE |
+---------+------------+--------------+-------+---------+
|         | 2010-05-13 | log4jExample | DEBUG | Debug   |
|         | 2010-05-13 | log4jExample | INFO  | Info    |
+---------+------------+--------------+-------+---------+
2 rows in set (0.00 sec)

Note:Burada x, günlüğe kaydetme olayını oluşturan iş parçacığı ile ilişkili Yuvalanmış Tanılama Bağlamını (NDC) çıkarmak için kullanılır. Birden çok istemciyi işleyen sunucu tarafı bileşenlerinde istemcileri ayırt etmek için NDC kullanıyoruz. Bununla ilgili daha fazla bilgi için Log4J Kılavuzu'na bakın.