PrintStackTrace (); bunun yerine bir kaydedici çağrısı kullanın


Yanıtlar:


139

Bu, günlük çerçevesini aşağıdaki gibi kullanmanız gerektiği anlamına gelir: veya ve istisnaları doğrudan yazdırmak yerine:

e.printStackTrace();

bu çerçevelerin API'sini kullanarak bunları günlüğe kaydetmelisiniz:

log.error("Ops!", e);

Günlüğe kaydetme çerçeveleri size çok fazla esneklik sağlar, örneğin konsolda mı yoksa dosyada mı oturum açmak istediğinizi seçebilir veya bazı ortamlarda artık alakalı olmadığını düşünürseniz bazı mesajları atlayabilirsiniz.


39

Bir printStackTrace()istisnayı çağırırsanız , iz yazılır System.errve onu başka bir yere yönlendirmek (veya filtrelemek) zordur. Bunu yapmak yerine, bir günlükleme çerçevesi (veya Apache Commons Logging gibi birden çok günlük çerçevesi etrafında bir sarmalayıcı) kullanmanız ve bu çerçeveyi kullanarak istisnayı günlüğe kaydetmeniz önerilir (örn.logger.error("some exception message", e) ).

Bunu yapmak şunları yapmanızı sağlar:

  • günlük ifadesini aynı anda farklı konumlara yazın, örneğin konsol ve bir dosya
  • Günlük ifadelerini önem derecesine (hata, uyarı, bilgi, hata ayıklama vb.) ve kökene (normalde paket veya sınıf temelli) göre filtreleyin
  • kodu değiştirmek zorunda kalmadan günlük biçimi üzerinde biraz etkiye sahip
  • vb.

17

Bir üretim kalitesi programı, hataları ve diğer teşhisleri bildirmek için birçok günlük alternatiflerinden birini (örn. Log4j, logback, java.util.logging) kullanmalıdır. Bunun birçok avantajı vardır:

  • Günlük mesajları yapılandırılabilir bir konuma gider.
  • Son kullanıcı, siz günlüğe kaydetmeyi kendisi yapacak şekilde yapılandırmadıkça mesajları görmez.
  • Ne kadar az veya çok günlük kaydı kaydedileceğini kontrol etmek için farklı kaydediciler ve kayıt seviyeleri vb. Kullanabilirsiniz.
  • Günlüğe kaydetmenin neye benzediğini kontrol etmek için farklı ekleyici biçimleri kullanabilirsiniz.
  • Günlük çıktısını daha büyük bir izleme / günlüğe kaydetme çerçevesine kolayca takabilirsiniz.
  • Yukarıdakilerin tümü kodunuzu değiştirmeden yapılabilir; yani konuşlandırılan uygulamanın günlük kaydı yapılandırma dosyasını düzenleyerek.

Bunun aksine, sadece printStackTrace kullanırsanız, konuşlandırıcı / son kullanıcı çok az kontrole sahip olur ve günlük mesajları, uygunsuz durumlarda kaybolabilir veya son kullanıcıya gösterilebilir. (Ve hiçbir şey çekingen bir kullanıcıyı rastgele bir yığın izlemeden daha fazla korkutamaz.)


6

Basit'te, e.printStackTrace () iyi bir uygulama değildir, çünkü sadece yığın izini standart hataya yazdırır. Bu nedenle, bu çıktının nereye gittiğini gerçekten kontrol edemezsiniz.


0

Hemen hemen her kayıt çerçevesi, atılabilir nesneyi bir mesajla birlikte iletebileceğimiz bir yöntem sağlar. Sevmek:

public trace(Marker marker, String msg, Throwable t);

Fırlatılabilir nesnenin yığın izini yazdırırlar.


Bu soruya cevap vermiyor.
Stephen C

-1

Şirket konseptinden konuşalım. Günlük size esnek seviyeler sunar (bkz . Logger.info ve logger.debug arasındaki fark ). Farklı insanlar, QA'lar, geliştiriciler, iş adamları gibi farklı seviyeleri görmek ister. Ancak e.printStackTrace () her şeyi yazdıracaktır. Ayrıca, bu yöntem dinlendirici çağrılacaksa, aynı hata birkaç kez yazdırılabilir. O zaman şirketinizdeki Devops veya Tech-Ops çalışanları aynı hata hatırlatıcılarını alacakları için deli olabilir. Sanırım daha iyi bir yedek olabilir log.error("errors happend in XXX", e) Bu aynı zamanda e.printStackTrace () 'den daha kolay okunabilen tüm bilgileri yazdıracaktır


-3

Bunun ana nedeni, Proguard'ın Log çağrılarını üretimden kaldırmasıdır. Çünkü StackTrace'i günlüğe kaydederek veya yazdırarak, bunları (yığın izleme veya Günlük içindeki bilgiler) Android telefonun içinde, örneğin Logcat Reader uygulamasıyla görmek mümkündür. Bu yüzden güvenlik için kötü bir uygulamadır. Ayrıca üretim sırasında onlara ulaşmıyoruz, üretimden çıkarılsak daha iyi olur. ProGuard, stackTrace dışındaki tüm Günlük çağrılarını kaldırdığından, Oturum açma yakalama bloklarını kullanmak ve bunların Proguard tarafından Üretimden kaldırılmasına izin vermek daha iyidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.