Üst Düzey Programlama Yazılımda Günlükleme (Logging) Üst Düzey Programlama-ders07/ 1
Günlükleme -Logging Tüm büyük çaplı uygulamalarda günlükleme(logging) ihtiyaçları bulunmaktadır. Bir uygulamanın hata yakalama işlemi genellikle debugger lar tarafından yapılmaktadır. Uygulama büyüdüğünde, çoklu iş parçacıklı olduğunda (multi-threaded) veta dağıtılmış (distributed) bir uygulama olduğunda hata yakalama işlemi son derece zordur. Deneyimler sonucunda günlükleme(logging) in uygulama geliştirmede son derece önemli olduğu ortaya çıkmıştır. Üst Düzey Programlama-ders07/ 2
Günlükleme -Logging Kodun içine günlükleme eklendikten sonra artık insan eli değmeden sürekli olarak programın nasıl çalıştığını izleme imkanımız olur. Günlük bilgileri kalıcı olarak saklanabilir ve daha sonra izlenebilir. Günlüklemenin bazı yan etkileride vardır. Kodun içine eklenen çok fazla günlükleme uygulamanın daha yavaş çalışmasına yol açacaktır. Eklenen kodlar ayrıca kodun okunabilirliğini azaltacaktır. Günlükleme için Java API içindeki sınıflar kullanılabileceği gibi başka sınıflarda kullanılır. Üst Düzey Programlama-ders07/ 3
Java Logging Java API içinde java.util.logging.* paketi altında günlükleme için kullanabileceğimiz çeşitli sınıflar vardır. Uygulamalar günlükleme işlemlerini Logger nesnelerini kullanarak yaparlar. Logger nesnesini kullanarak bir mesaj göndeririz. Bu mesaj LogRecord nesnelerine çevrilir ve Handler sınıflarına gönderilir. Handler da eğer mesaj kendini ilgilendiriyorsa bu mesajı bizim tanımladığımız yere kayıt eder. Üst Düzey Programlama-ders07/ 4
Java Logging Bu yer bir dosya, uzaktaki bir makina, konsol olabilir. Hata nesnesi günlüklenirken bu günlüklemenin biçimi (yani nelerin nasıl yazılacağı) Formatter nesneleri ile değiştirilebilir. Ayrıca Filter nesneleri ile nelerin günlüklenip nelerin günlüklenmeyeceğine belirleyebiliriz. Üst Düzey Programlama-ders07/ 5
Java Logging-Örnek Üst Düzey Programlama-ders07/ 6
Java Logging Uygulamada görüldüğü gibi çeşitli günlükleme seviyeleri bulunmaktadır. Bunlar severe,warning,info,config,fine,finer,finest dır. Önem dereceleri soldan sağa doğru azalmaktadır. Uygulamamızda günlükleme kodunu eklerken eklediğimiz yerin ve günlüklenecek olayın önemine göre bir günlükleme seviyesi seçer ve günlüklenecek olan bilgiyi günlükleriz. Uygulama çalıştığı zaman sadece severe, warning ve info günlükleme seviyesindeki günlükler konsola yazdırılır. Üst Düzey Programlama-ders07/ 7
Java Logging Bunun nedeni Logger nesnesinin varsayılan günlükleme seviyesinin info olmasıdır. Yani en az info seviyesindeki günlükler değerlendirilir, diğerleri önemsenmez. Konsola yazılan günlüğün biçimi (format) : zaman,sınıf,metot,seviye ve mesaj şeklindedir. Yazdığımız günlükleri konsola değilde bir dosyaya yazmak için Handler nesnesini günlüğe ekleriz. Dosya için FileHandler nesnesi kullanılır. Üst Düzey Programlama-ders07/ 8
(Logging)FileHandler-Ornek Üst Düzey Programlama-ders07/ 9
Günlükleme Seviyesinin Değiştirilmesi Seviyeler hangi mesajların yazılacağına (günlüklenmesi) karar veren birinci mekanizmadır. Varsayılan günlükleme seviyesi info dur. Her günlükleme nesnesinin (Logger) kendi seviyesi vardır. Bu seviyeleri değiştirmek için Örn: logger.setlevel(level.warning); şeklinde metot kullanılabilir. Günlükleme seviyesi Logger nesnesinde olduğu gibi ayrıca Handler nesnelerinde de bulunmaktadır. Üst Düzey Programlama-ders07/ 10
Günlükleme Seviyesinin Değiştirilmesi Log() metodunun bizim kullanacağımız daha ayrıntılı parametreleri bulunmaktadır. Örneğin; günlüklemeye bir Exception ekleyebiliriz. logger.log(level.severe, Oluşturma hatası-cok ciddi, new RuntimeException( oluşturma hatası!!! )); Üst Düzey Programlama-ders07/ 11
Logger Nesnelerinde Kalıtım Her logger nesnesini bir adı bulunmaktadır. Bu adın hiyerarşisine göre Logger nesneleride bir hiyerarşi oluştururlar ve üst sınıfta bulunan Logger'ın günlükleme seviyesini miras alır; isterse bu seviyeyi kendisi değiştirebilir. Üst Düzey Programlama-ders07/ 12
Logger Nesnelerinde Kalıtım Üst Düzey Programlama-ders07/ 13
Java Günlüklemenin Çalışma Mekanizması Uygulama mesaj Logger (Level) Handler Çıktı Filter Filter Üst Düzey Programlama-ders07/ 14
Java Günlüklemenin Çalışma Mekanizması Logger nesnesine bir mesaj gönderildiğinde, Logger mesajın seviyesini kontrol eder; eğer seviye > veya = ise bu mesaj LogRecord nesnesine çevrilir ve kendisinde bulunan Filter nesnesine test edilmesi için gönderir. Logger'ın Filter nesnesinde LogRecord geçerse bu nesne Logger nesnesine eklenmiş olan bir Ya da daha fazla sayıdaki Handler nesnelerine gönderilir. Üst Düzey Programlama-ders07/ 15
Java Günlüklemenin Çalışma Mekanizması Handler nesneleride gelen LogRecord nesnesinin seviyesini kendi seviyeleri ile kontrol ederler. Eğer > veya = ise kendilerindeki Filter nesnesine gönderirler. Filter nesnesinden mesaj nesnesi LogRecord geçerse bu LogRecord nesnesi Handler'ın yazabileceği yere günlüklenir. Kullanılan Filter nesnelerine kendimizde bir Filter nesnesi ekleyebiliriz. Bunun için Filter interface'i implement eden bir sınıf oluşturmamız gereklidir. Üst Düzey Programlama-ders07/ 16
Java Günlüklemenin Çalışma Mekanizması Örn; aşağıdaki Filter nesnesi aynı mesaja sahip olan mesaj nesnelerinden sadece birinin günlüklenmesine izin verir. Bu mesajlar arka arkaya gönderilmiş ise sadece birini yazar. Üst Düzey Programlama-ders07/ 17
Java Günlüklemenin Çalışma Mekanizması Üst Düzey Programlama-ders07/ 18
Java Günlüklemenin Çalışma Mekanizması Üst Düzey Programlama-ders07/ 19
Yöneticiler (Handlers) ConsoleHandler: System.err'ye günlükleri yazar. Genelde System.err konsolu gösterdiği için konsola yazar. Üst Düzey Programlama-ders07/ 20
Yöneticiler (Handlers) FileHandler: Dosyaya günlükleri yazar. Yazılacak olan dosya adı yapıcısında verilir. 2. parametre olarak dosyaya ekleme yapılıp yapılmayacağı belirtilir. Üst Düzey Programlama-ders07/ 21
Yöneticiler (Handlers) FileHandler: Dosya isminde çeşitli şablonlar kullanılabilir ve yazılacak dosyanın yerini ve adını dinamik değiştirebilirsiniz. %t: geçici klasöre (Temp) %h: kullanıcının ev dizinine %g: Log rotasyonundaki oluşum numarası %u: teklik numarası Log rotasyonu sürekli çalışan uygulamalarda kullanılır. Uygulama günlük dosyası belirli bir büyüklüğe ulaşınca ya da belirli bir zaman sonr a yeni günlük dosyasına kayıtlar yapılır. Üst Düzey Programlama-ders07/ 22
Yöneticiler (Handlers) Üst Düzey Programlama-ders07/ 23
SocketHandler: Günlük dosyalarını ağ üzerinden XML formatlı olarak başka bir bilgisayara gönderir. Örn: SocketHandler sh = new SocketHandler( 127.0.01,5044); logger.addhandler(sh); Yöneticiler (Handlers) Üst Düzey Programlama-ders07/ 24
Yöneticiler (Handlers) Üst Düzey Programlama-ders07/ 25
Yöneticiler (Handlers) Üst Düzey Programlama-ders07/ 26
Yöneticiler (Handlers) MemoryHandler: Günlükleri belleğe yazar. Belirli bir olay olduğunda (Örneğin; severe seviyeli bir mesaj geldiğinde) tüm günlüğü başka Handler a aktarır. Örn; Logger logger = Logger.getLogger( com.comu.my ); Handler socket= new SocketHandler( 127.0.0.1,5044); Handler memory = new MemoryHandler(socket,1000,Level.SEVERE); logger.addhandler(memory); 1000 mesaj gelince ya da severe seviyeli bir mesaj gelince günlükleme socket Handlerına gönderilir. Üst Düzey Programlama-ders07/ 27
Formatter (Biçimleyici) Logger ve Handler hangi mesajın nereye yazılacağını belirler. Formatter nesnesi ise yazma işleminin biçimini belirtir. Kendi biçimlememizi oluşturmak için Formatter sınıfından kendi sınıfınızı oluşturmanız gereklidir. Üst Düzey Programlama-ders07/ 28
Formatter (Biçimleyici) Üst Düzey Programlama-ders07/ 29
Ayar Dosyası Günlükleme işlemlerinde kodda yaptığımız ayarlamaları bir dosyada yaparak uygulamamızın günlükleme ayarlarını koddan bağımsız olarak dinamik değiştirebiliriz. Ayar Dosyası = /jre/lib klasörü içinde logging.properties dosyasıdır. Üst Düzey Programlama-ders07/ 30
Üst Düzey Programlama Yazılımda Günlükleme (Logging) Üst Düzey Programlama-ders07/ 31