Projelerde Neden Log Yönetimi Kullanmalıyız?
Müşteriniz için hazırladığınız proje hazır bir duruma geldikten sonra teslim ettiniz. Müşteri kullanıma başladığı projede çeşitli hatalar ile karşılaşmaya başladı. Sizi arıyor ve bu hataları gidermenizi istiyor. Log dosyası kayıtlarına bakarak hatanın sizden mi yoksa kullanıcıdan mı kaynaklı olduğunu tespit edebilir ve sorunu çözümleyebilirsiniz.
Log yönetimi sadece hata yönetiminde kullanılmaz. Kullanıcı giriş çıkışları, veritabanı bağlantısı açılıp kapanması gibi akla gelecebilecek birçok olaya dair bilgileri edinmenizi sağlayabilirsiniz.
Bir Java projesinde kendinize özgü log yönetimi yapmak isteyebilirsiniz. Yada varolan bir sistemde değişiklikler yapabilirsiniz. Java da log yönetimi için Log4j kütüphanesi kullanılmaktadır.
Aşağıda yaptığımız Singleton Tasarım Deseni örneğinde Log4j 2 yapısını özelleştirerek konsola hata oluşması sonucunda oluşan log kayıtlarını yazdırdık.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
package SingletonLoggingOrnek; import javax.security.auth.login.Configuration; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.config.Configurator; public class SingletonLogging { //singleton kuralları private static SingletonLogging instance=null; private static Object lock=new Object();//synchronized e giren threadler bu değişkeni tutacak sonrasında serbest bırakacak private SingletonLogging(Logger logger){//Log kayıtlarını Logger sınıfı ile oluşturulacak setLogger(logger); //yapıcı methoda aktarılan geçici logger nesnesi setLogger metodu ile kalıcı olarak logger değişkenine aktarılacak } //logging field public enum LogLevel {DEBUG, INFO, WARNING, ERROR, FATAL};//log hata seviyeleri private Logger logger;//logları tutan değişken //metoda parametre olarak gelen logger nesnesi kalıcı olarak logger değişkenine atanıyor public void setLogger(Logger logger){ this.logger=logger; } //singleton kurallarına uygun olarak tek nesne üretiyoruz public static SingletonLogging getLogger(){ if(instance==null){ synchronized (lock) { if(instance==null){ instance=new SingletonLogging(LogManager.getLogger(SingletonLogging.class)); } } } return instance; } //log düzeylerine göre mesajları yaz public void Log(String msg, LogLevel logLevel){ switch (logLevel) { case DEBUG: logger.debug(msg); break; case INFO: logger.info(msg); break; case WARNING: logger.warn(msg); break; case ERROR: logger.error(msg); break; case FATAL: logger.fatal(msg); break; default: } } } |
Hazırladığımzı sınıfı test edelim. Testimizin sonucunda ekran çıktısı olarak hata mesajı verecek. Herhangi bir dosya tanımlamadığımız için error döndürecek ve hata mesajımız yazdırılacak.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
package SingletonLoggingOrnek; import SingletonLoggingOrnek.SingletonLogging.LogLevel; public class Test { public static void main(String[] args) { SingletonLogging.getLogger().Log("main metodu başlayamadı", LogLevel.ERROR); } } |
Ekran Çıktısı:
İndirmek İçin: GitHub – Onur ARSLAN





