Spring Boot Logging nedir?
Loglama kısaca bir projedeki uygulama geçmişini takip etmektir.Uygulamada arkaplanda çalışan her adımı her zaman görmek istemeyebiliriz.Bazen çok detay bilgiler gereklidir hata tespiti için bazen sadece hata oluştuğu sürece log görmek yeterlidir.Bunun için loglama yaparken log seviyelerini ayarlamak gereklidir. Log4j Java’da yazılmış, Apache Yazılım Lisansı altında paylaşılan; hızlı, güvenilir ve esnek bir loglama framework’üdür. Java dışında C, C++, C#, Perl, Python, Ruby, and Eiffel dillerine de taşınmıştır.
Log Seviyeleri:

Log Yazıcılar(Appenders)
Loglama bilgilerini veritabanı,dosya,console vb. gibi istenilen yerde çıktı alınmasını sağlar.Ben örnek projemde FileAppender ve ConsoleAppender beraber kullandım.
FileAppender
ConsoleAppender
SocketAppender
SyslogAppender
NTEventLogAppender
SMTPAppender
Log Düzeni(Layouts)
Loglama yaparken detay bilgileri vermek için (Tarih saat,log atılan sınıf,Log seviyesi) belirli bir düzen verebiliriz.Log çıktısının düzenlenmesi olarak düşünebilriz.
Kısaltma
Anlamı
%r
Loglama başlayana kadar ne kadar zaman harcandı.
%t
Loglama olayını üreten thread’in ismi.
%p
Logun seviyesi.
%c
c(1) getLogger() ile ayarladığımız loglama adı.örneğin HelloBean
%x
Logun bazı kontrolleri için.
%m
Mesaj içeriği
%n
Mesaj içeriği geldiğinde alt satıra geç
%L
Hangi satırda olduğu bilgisi.
%d
Logun üretildiği zaman. {yaylı parantez içinde format verilebilir}
Loglamanin Avantajlari
Belki ilk dusundugumuzde loglama islemi cok gereksiz durabilir, sonucta bu yapinin kurulmasi icin de sistematik bir yapi kurmak, kod yazmak, kontrol etmek, bakim gibi ek islemler getirecektir. Peki bu ek islemler karsiligini alabilecek miyiz ?
Hizli hata ayiklamak(debug): Bir problemle karsilastigimizda , log kayitlari bize sorunun nereden kaynaklandigini gosterecektir. Iyi yazilmis bir loglama kodu ,sorunun asil kaynaginin nereden ciktigini daha kisa surede bulmamizi saglayacaktir bu da bize debug isleminde vakit kazandiracaktir.
Kolay bakim: Iyi yazilmis loglama yapisi ile uygulamamizin bakimi/devam edilebilirligi kolay olacaktir. Loglama kodlarinin sadece debug icin tutulmadigini biliyoruz. Bu log kayitlari bize sistem hakkinda bilgi verecektir bu bilgiler isiginda sistem bakimi daha kolay olacaktir.
Gecmis: Loglama bilgileri istenilen bir dizinde , istenilen bir dosya isminde ornegin tarihsel bir ek olarak levent_log_29_12_2013 seklinde tutulabilir. Icerik olarak da farkli formatlara uygun sekilde tutabilecegimizi belirtmistik.Geriye donuk olarak bu loglanan dosyalar tutulur herhangi bir soruna veya farkli bir duruma karsi tutulabilir.
Maliyet ve Zaman kazanci: Iyi yazilmis loglama yapisi ile , hizli hata ayiklama, kolay bakim gibi zaman ve maliyet kazanci saglanabilir.
Loglamanin Dezavantajlari
Kotu tasarlanmis/yazilmis loglama yapisi sistem performasinda dusukluge neden olabilir.
Kullanissiz/gereksiz ciktilar ise yaramaz.Kotu cikti/output karisikliga neden olabilir.
Loglama islemi uygulamamiza fazladan kod yazilmasini gerektirecektir , bu nedenle yukaridaki 2 maddedeki durumlar soz konusu oldugunda maliyet ve zaman kaybina neden olabilir.
Genel logging bilgileri:
-Spring Boot , log altyapısı olarak Logback,Log42 ve Java Util Logging kütüphanelerini desteklemektedir.
-Varsayılan durumda aktif log kütüphanesi Logback dir.
-Spring Boot,Logging API olarak da Commons Logging API ile çalışmaktadır.
-Herhangi başka bir 3rd party log kütüphanesi de kullanılabilir.
Slf4j nedir?
Slf4j, bizleri loglama frameworklerinden yalıtan, bağımsız olarak çalışmamızı sağlayan bir arayüzdür. Örneğin Logback kullanırken bir paketin altındaki LoggerFactory’e bağımlılığınız olur. Sonraki bir zaman Log4j’ye geçilmek istenirse tüm sınıflarınızdaki factory’lerinizi tek tek Log4j’ye ait factory ile değiştirilmesi gerekir (her sınıfın üzerinde constant olarak tanımlanan Logger instance’ı). Slf4j’nin görevi burada başlar. Spesifik frameworklere ait sınıflara bağımlı olmak yerine kendi sınıflarına bağımlı kılarak bizleri arka tarafta hangi loglama frameworkü olduğundan bihaber tutarak loglama yapılabilmesini sağlar.
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="LOG_PATH" value="./logs" /> //Değişken oluşturuyoruz "LOG_PATH" adında "LOG_PATH" /logs adında bir klasör altında tutulsun
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> // "STDOUT" Bizim console appenderımız
<encoder>
<pattern>
%d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n
</pattern>
</encoder>
</appender>
//Appenderlar formatlama yapıyor renkleri tarihleri vs
<appender name="FILEOUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/spring-boot-logging.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</encoder>
//RollingFileAppender da renklendirme falan değilde sadece data lazım
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/archive/spring-boot-logging-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize> //bir dosyanın size ı en fazla 10 mb olucak 10 mb olduktan sonra farklı bir dosyanın içine devam edilir
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<springProfile name="dev"> //Eğer "dev" profile ile uygulamamı çalıştırırsam hem console a hemde dosyaya yazıcak
<root level="info"> //root konfigurasyonu tüm libraryler için infoda olucak ama ben kendi geliştirdiğim kodlarda loglamamı debug logda yapıcam
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILEOUT"/>
</root>
<logger name="com.example.springbootlogging.api" additivity="false" level="debug"> //ben kendi geliştirdiğim kodlarda loglamamı debug logda yapıcam
<appender-ref ref="STDOUT"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILEOUT"/>
</logger>
</springProfile>
<springProfile name="prod">
<root level="error">
<appender-ref ref="FILEOUT"/>
</root>
<logger name="com.example.springbootlogging.api" additivity="false" level="debug">
<appender-ref ref="FILEOUT"/>
</logger>
</springProfile>
</configuration>
//uygulamanın "dev" ile yada "prod" ile calısmasını application.propertiesden kodlayabiliriz
Last updated
Was this helpful?