Hindari printStackTrace (); gunakan panggilan logger sebagai gantinya

Jawaban:

139

Ini berarti Anda harus menggunakan kerangka kerja logging seperti atau dan alih-alih mencetak pengecualian secara langsung:

e.printStackTrace();

Anda harus mencatatnya menggunakan API kerangka kerja ini:

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

Kerangka kerja pencatatan memberi Anda banyak fleksibilitas, misalnya Anda dapat memilih apakah Anda ingin masuk ke konsol atau file - atau mungkin melewatkan beberapa pesan jika Anda merasa tidak lagi relevan di beberapa lingkungan.

Tomasz Nurkiewicz
sumber
39

Jika Anda memanggil printStackTrace()pengecualian, pelacakan akan ditulis System.errdan sulit untuk merutekannya ke tempat lain (atau memfilternya). Alih-alih melakukan ini, Anda disarankan untuk menggunakan kerangka kerja logging (atau pembungkus di sekitar beberapa kerangka kerja logging, seperti Apache Commons Logging) dan mencatat pengecualian menggunakan kerangka itu (misalnya logger.error("some exception message", e)).

Melakukan itu memungkinkan Anda untuk:

  • tulis pernyataan log ke lokasi yang berbeda sekaligus, misalnya konsol dan file
  • memfilter pernyataan log berdasarkan tingkat keparahan (kesalahan, peringatan, info, debug, dll.) dan asal (biasanya berbasis paket atau kelas)
  • memiliki pengaruh pada format log tanpa harus mengubah kode
  • dll.
Thomas
sumber
17

Program kualitas produksi harus menggunakan salah satu dari banyak alternatif pencatatan (misalnya log4j, logback, java.util.logging) untuk melaporkan kesalahan dan diagnostik lainnya. Ini memiliki sejumlah keuntungan:

  • Pesan log masuk ke lokasi yang dapat dikonfigurasi.
  • Pengguna akhir tidak melihat pesan kecuali Anda mengkonfigurasi logging sehingga dia bisa.
  • Anda dapat menggunakan logger dan level logging yang berbeda, dll untuk mengontrol seberapa banyak atau banyak logging dicatat.
  • Anda dapat menggunakan format appender berbeda untuk mengontrol tampilan logging.
  • Anda dapat dengan mudah menyambungkan keluaran logging ke kerangka kerja pemantauan / logging yang lebih besar.
  • Semua hal di atas dapat dilakukan tanpa mengubah kode Anda; yaitu dengan mengedit file konfigurasi logging aplikasi yang diterapkan.

Sebaliknya, jika Anda hanya menggunakan printStackTrace, deployer / pengguna akhir memiliki sedikit kontrol jika ada, dan pesan pencatatan dapat hilang atau ditampilkan kepada pengguna akhir dalam keadaan yang tidak tepat. (Dan tidak ada yang lebih menakutkan bagi pengguna yang pemalu selain pelacakan tumpukan acak.)

Stephen C
sumber
6

Dalam Simple, e.printStackTrace () bukanlah praktik yang baik, karena hanya mencetak jejak tumpukan ke kesalahan standar. Karena itu, Anda tidak dapat benar-benar mengontrol kemana arah keluaran ini.

Sandip S.
sumber
0

Hampir setiap kerangka kerja logging menyediakan metode di mana kita bisa meneruskan objek yang bisa dibuang bersama dengan pesan. Suka:

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

Mereka mencetak pelacakan tumpukan dari objek yang dapat dibuang.

abhi shukla
sumber
Ini tidak menjawab pertanyaan itu.
Stephen C
-1

Mari kita bicara dari konsep perusahaan. Log memberi Anda level yang fleksibel (lihat Perbedaan antara logger.info dan logger.debug ). Orang yang berbeda ingin melihat level yang berbeda, seperti QA, pengembang, pebisnis. Tapi e.printStackTrace () akan mencetak semuanya. Juga, seperti jika metode ini akan disebut restful, kesalahan yang sama ini dapat dicetak beberapa kali. Maka orang Devops atau Tech-Ops di perusahaan Anda mungkin gila karena mereka akan menerima pengingat kesalahan yang sama. Saya pikir pengganti yang lebih baik bisa jadi log.error("errors happend in XXX", e) Ini juga akan mencetak seluruh informasi yang mudah dibaca daripada e.printStackTrace ()

Qiyu Zhang
sumber
-3

Alasan utamanya adalah Proguard akan menghapus panggilan Log dari produksi. Karena dengan mencatat atau mencetak StackTrace, Anda dapat melihatnya (informasi di dalam stack trace atau Log) di dalam ponsel Android, misalnya dengan aplikasi Logcat Reader. Sehingga ini adalah praktik yang buruk untuk keamanan. Selain itu, kami tidak mengaksesnya selama produksi, akan lebih baik jika dihapus dari produksi. Karena ProGuard menghapus semua panggilan Log, bukan stackTrace, maka lebih baik menggunakan Log in catch block dan biarkan mereka dihapus dari Production by Proguard.

Amirhossein Hashemi
sumber