Parametreli Logging
Verimli ileti biçimlendirme
Parametreli Logging, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Dizgi Birleştirmenin Sorunu
Bir günlük iletisini birleştirmek, seviye devre dışı olsa bile çağrıdan önce dizginin tamamını oluşturur.
log.debug("id=" + id + " name=" + name), DEBUG kapalıyken CPU'yu boşa harcar; çünkü dizgi, ne olursa olsun oluşturulur.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
String name = "Ada"; int id = 7;
// Bad: string is built even if DEBUG is disabled
log.debug("id=" + id + " name=" + name);
}
}{} ile Yer Tutucular
SLF4J, yer tutucu olarak {} kullanır. Değerleri ek bağımsız değişkenler olarak geçirin.
İleti yalnızca seviye etkinse birleştirilir; bu nedenle devre dışı günlüklerin maliyeti neredeyse yoktur.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
String name = "Ada"; int id = 7;
// Good: no string built unless DEBUG is on
log.debug("id={} name={}", id, name);
}
}Birden Çok Yer Tutucu
Yer tutucular sırayla doldurulur. İlk {} ilk bağımsız değişkeni, ikinci yer tutucu ikinci bağımsız değişkeni alır ve bu şekilde devam eder.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("order {} for user {} totaling {} cents", "A-1", 42, 1599);
}
}Neden Verimlidir?
Çerçeve önce seviyeyi denetler. Seviye devre dışıysa herhangi bir bağımsız değişkende toString() çağırmadan hemen geri döner.
Maliyetli bölüm olan biçimlendirme, yalnızca ileti gerçekten üretilecekse tembel olarak gerçekleştirilir.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
static String describe(Object o) { System.out.println("toString called"); return o.toString(); }
public static void main(String[] args) {
// Note: passing describe(...) still evaluates eagerly; pass the raw object instead
log.trace("value={}", new int[]{1, 2, 3});
}
}Önceden Biçimlendirilmiş Dizgiler Yerine Ham Nesneleri Geçirin
Tembel değerlendirme avantajından yararlanmak için, onu biçimlendiren bir metot çağrısı yerine ham nesneyi geçirin.
log.debug("{}", buildReport()) yazarsanız buildReport() yine hemen çalışır. Günlükçünün kendi başına biçimlendirebileceği bağımsız değişkenleri geçirin.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
Object user = new Object();
// Logger calls user.toString() only if DEBUG is enabled
log.debug("current user: {}", user);
}
}Ağır İşlemler İçin Tembel Sağlayıcılar
Biçimlendirme gerçekten maliyetliyse, işlemi ertelemek için Supplier ile SLF4J 2.x'in akıcı API'sini kullanın.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
static String heavyReport() { return "...expensive..."; }
public static void main(String[] args) {
log.atDebug()
.setMessage("report: {}")
.addArgument(() -> heavyReport())
.log();
}
}Değişmez Süslü Parantezden Kaçış
İletide değişmez bir {} gerekiyorsa, ters eğik çizgiyle kaçış uygulayın: \\{}.
Bu nadiren gerekir; ancak JSON benzeri metinleri günlüklerken kullanışlıdır.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
// Logs a literal {} then the value
log.info("empty object is \\{} and id is {}", 7);
}
}İstisna ve Yer Tutucular
Yer tutucuları, son sıradaki bir istisnayla birleştirebilirsiniz. SLF4J, son bağımsız değişkenin bir Throwable olduğunu algılar ve yığın izini yazdırır.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
int id = 99;
try {
throw new RuntimeException("db down");
} catch (Exception e) {
log.error("failed processing record {}", id, e);
}
}
}Çok Fazla Bağımsız Değişkenden Kaçının
Yer tutucu sayısıyla bağımsız değişken sayısı uyuşmazsa SLF4J elinden geleni yapar; ancak çıktı hatalı görünebilir.
Sayıları eşleşir durumda tutun. Birkaç değerden fazlası için bunun yerine yapılandırılmış bağlamı (MDC) kullanmayı değerlendirin.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
// Two placeholders, two arguments: correct
log.info("user {} did {}", "ada", "login");
}
}MDC ile Bağlam Ekleme
İstek kimliği gibi birçok satırda paylaşılan değerleri her iletiye eklemek yerine MDC içine koyun.
Ardından desen düzeni, MDC değerini her satırda otomatik olarak yazdırabilir.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
MDC.put("requestId", "req-1234");
try {
log.info("handling request");
log.info("request done");
} finally {
MDC.clear();
}
}
}En İyi Uygulamaların Özeti
Verimli günlükleme kuralları:
- Her zaman
{}yer tutucularını kullanın;+ile birleştirme yapmayın. - Önceden oluşturulmuş dizgiler yerine ham nesneleri geçirin.
- Gerçekten ağır işlemler için sağlayıcıları veya
isXEnabled()kullanın. - Kesitler arası bağlam için MDC kullanın.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("processed {} items in {} ms", 1000, 42);
}
}Hızlı Kontrol
Parametreli günlükleme bilginizi sınayın.
Özet
Parametreli günlüklemeyi öğrendiniz:
- Ek bağımsız değişkenlerle
{}yer tutucularını kullanın. - İletiler yalnızca seviye açıkken tembel olarak oluşturulur.
- Ham nesneleri geçirin; ağır işlemler için sağlayıcıları kullanın.
- Paylaşılan bağlamsal değerler için MDC kullanın.
Sırada Logback arka ucunu yapılandırmak var.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("Parameterized logging recap: {}", "done");
}
}Sıkça Sorulan Sorular
“Parametreli Logging” dersi ücretsiz mi?
Evet — “Parametreli Logging” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Parametreli Logging” dersinde ne öğreneceğim?
Verimli ileti biçimlendirme Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Parametreli Logging” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Yapılandırılmış Logging Neden Gerekli
- SLF4J Cephe Arayüzü ve Logger'lar
- Parametreli Logging
- Logback Yapılandırma