Cara mencetak nomor baris ke log. Katakanlah ketika mengeluarkan beberapa informasi ke log, saya juga ingin mencetak nomor baris di mana keluaran itu dalam kode sumber. Seperti yang dapat kita lihat di tumpukan jejak, ini menampilkan nomor baris di mana pengecualian telah terjadi. Jejak tumpukan tersedia pada objek pengecualian.
Alternatif lain bisa seperti secara manual termasuk nomor baris saat mencetak ke log. Apakah ada cara lain?
Jawaban:
Dari Angsuman Chakraborty :sumber
Kami akhirnya menggunakan kelas khusus seperti ini untuk pekerjaan Android kami:
sumber
getStackTrace()[3]
bukangetStackTrace()[2]
Cara cepat dan kotor:
Dengan beberapa perincian lebih lanjut:
Itu akan menampilkan sesuatu seperti ini:
sumber
System.out.println("i am here: " + new Exception().getStackTrace()[0]);
memberi saya semua detail yang saya butuhkan :)Saya terpaksa menjawab dengan tidak menjawab pertanyaan Anda. Saya berasumsi bahwa Anda mencari nomor baris semata-mata untuk mendukung debugging. Ada cara yang lebih baik. Ada cara hack untuk mendapatkan baris saat ini. Semua yang saya lihat lambat. Anda lebih baik menggunakan kerangka kerja logging seperti itu di paket java.util.logging atau log4j . Menggunakan paket-paket ini Anda dapat mengkonfigurasi informasi logging Anda untuk memasukkan konteks ke nama kelas. Maka setiap pesan log akan cukup unik untuk mengetahui dari mana asalnya. Akibatnya, kode Anda akan memiliki variabel 'logger' yang Anda hubungi
dari pada
sumber
Log4J memungkinkan Anda untuk memasukkan nomor baris sebagai bagian dari pola outputnya. Lihat http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html untuk detail tentang cara melakukan ini (elemen kunci dalam pola konversi adalah "L"). Namun, Javadoc meliputi:
sumber
Kode yang diposting oleh @ simon.buchan akan berfungsi ...
Tetapi jika Anda memanggilnya dalam suatu metode, ia akan selalu mengembalikan nomor baris dari garis dalam metode, jadi alih-alih gunakan potongan inline kode.
sumber
Saya akan merekomendasikan menggunakan toolkit logging seperti log4j . Logging dapat dikonfigurasi melalui file properti saat runtime, dan Anda dapat menghidupkan / mematikan fitur seperti nomor baris / nama file logging.
Melihat javadoc untuk PatternLayout memberi Anda daftar lengkap opsi - yang Anda cari adalah% L.
sumber
Saya menggunakan metode kecil ini yang menampilkan jejak dan nomor baris dari metode yang memanggilnya.
Klik dua kali output untuk pergi ke baris kode sumber!
Anda mungkin perlu menyesuaikan nilai level tergantung di mana Anda meletakkan kode Anda.
sumber
Util
berasal?Anda tidak dapat menjamin konsistensi nomor baris dengan kode, terutama jika dikompilasi untuk rilis. Saya tidak akan merekomendasikan menggunakan nomor baris untuk tujuan itu, akan lebih baik untuk memberikan payload tempat di mana pengecualian dimunculkan (metode sepele adalah mengatur pesan untuk memasukkan rincian dari pemanggilan metode).
Anda mungkin ingin melihat pengayaan pengecualian sebagai teknik untuk meningkatkan penanganan pengecualian http://tutorials.jenkov.com/java-exception-handling/exception-enrichment.html
sumber
Jika sudah dikompilasi untuk rilis ini tidak mungkin. Anda mungkin ingin melihat sesuatu seperti Log4J yang secara otomatis akan memberi Anda informasi yang cukup untuk menentukan dengan cermat di mana kode yang dicatat.
sumber
pertama metode umum (dalam kelas utilitas, dalam kode java1.4 tua biasa, Anda mungkin harus menulis ulang untuk java1.5 dan lebih banyak lagi)
Kemudian metode utilitas khusus untuk mendapatkan stackElement yang tepat:
sumber
Berikut adalah logger yang kami gunakan.
itu membungkus Android Logger dan menampilkan nama kelas, nama metode, dan nomor baris.
http://www.hautelooktech.com/2011/08/15/android-logging/
sumber
Lihatlah tautan ini . Dalam metode itu Anda dapat melompat ke kode baris Anda, ketika Anda mengklik dua kali pada baris LogCat.
Anda juga dapat menggunakan kode ini untuk mendapatkan nomor baris:
sumber
sumber
Ini semua memberi Anda nomor baris utas dan metode Anda saat ini yang bekerja sangat baik jika Anda menggunakan try catch di mana Anda mengharapkan pengecualian. Tetapi jika Anda ingin menangkap pengecualian tidak tertangani maka Anda menggunakan penangan pengecualian tidak tertangkap default dan utas saat ini akan mengembalikan nomor baris dari fungsi penangan, bukan metode kelas yang melempar pengecualian. Alih-alih menggunakan Thread.currentThread () cukup gunakan Throwable yang diteruskan oleh handler pengecualian:
Dalam penggunaan di atas, gunakan e.getStackTrace () [0] pada fungsi handler Anda (fShowUncaughtMessage) untuk mendapatkan pelaku.
sumber
Kode di bawah ini adalah kode yang diuji untuk jalur logging, tanpa nama kelas dan nama metode dari mana metode logging dipanggil
sumber
The
stackLevel
tergantung pada kedalaman Anda memanggil metode ini. Anda dapat mencoba dari 0 hingga banyak untuk melihat perbedaannya.Jika
stackLevel
legal, Anda akan mendapatkan string sepertijava.lang.Thread.getStackTrace(Thread.java:1536)
sumber
Ini persis fitur yang saya terapkan dalam lib XDDLib ini . (Tapi, ini untuk android)
Satu klik pada teks yang digarisbawahi untuk menavigasi ke tempat perintah log
Itu
StackTraceElement
ditentukan oleh elemen pertama di luar perpustakaan ini. Dengan demikian, di manapun di luar lib ini akan menjadi hukum, termasuklambda expression
,static initialization block
, dllsumber
Cara saya bekerja untuk saya
sumber
Anda dapat menggunakan -> Reporter.log ("");
sumber