Saya berasumsi sebagian besar dari Anda mengetahui android.util.Log Semua metode logging menerima 'String tag' sebagai argumen pertama.
Dan pertanyaan saya adalah Bagaimana Anda biasanya menandai log di aplikasi Anda? Saya telah melihat beberapa hardcode seperti ini:
public class MyActivity extends Activity {
private static final String TAG = "MyActivity";
//...
public void method () {
//...
Log.d(TAG, "Some logging");
}
}
Ini tidak terlihat bagus karena banyak alasan:
- Anda dapat memberi tahu saya bahwa kode ini tidak memiliki hardcode, tetapi memang demikian.
- Aplikasi saya dapat memiliki sejumlah kelas dalam paket berbeda dengan nama yang sama. Jadi akan sulit untuk membaca log.
- Itu tidak fleksibel. Anda selalu menempatkan TAG bidang pribadi ke kelas Anda.
Apakah ada cara yang rapi untuk mendapatkan TAG untuk kelas?
Jawaban:
Saya menggunakan TAG, tetapi saya menginisialisasinya seperti ini:
Dengan cara ini ketika saya memfaktor ulang kode saya, tag juga akan berubah sesuai.
sumber
"MyActivity.class.getName();"
. Saya selalu berpikir "TAG" hanyalah placeholder dalam contoh dari Google dll ... bukanStatic
variabel sebenarnya ! Ini adalah solusi yang jauh lebih baik terima kasih :)this.getClass().getName()
untuk membuatnya lebih umum?Saya biasanya membuat
App
kelas yang berada dalam paket yang berbeda dan berisi metode statis yang berguna. Salah satu caranya adalahgetTag()
metode, dengan cara ini saya bisa mendapatkan TAG dimana-mana.App
kelas terlihat seperti ini:EDIT : Peningkatan per komentar massa (Terima kasih :))
Dan ketika saya ingin menggunakannya:
Keluaran dari
getTag
metode ini adalah nama kelas pemanggil (dengan nama paket), dan nomor baris tempat pemanggilangetTag
, untuk memudahkan debug.sumber
getStackTrace()
kerjanya. Tapi saya tidak akan menggunakannya karena mahalMasuk ke Android Studio -> preferensi -> Live Templates -> AndroidLog lalu pilih Log.d (TAG, String) .
Di teks Template ganti
android.util.Log.d(TAG, "$METHOD_NAME$: $content$");
dengan
android.util.Log.d("$className$", "$METHOD_NAME$: $content$");
Kemudian klik Edit variabel dan masukkan className () di kolom Expression di sebelah kolom ClassName Name .
Sekarang ketika Anda mengetik pintasan
logd
itu akan dimasukkanAnda tidak perlu lagi mendefinisikan TAG.
sumber
Saya ingin meningkatkan jawaban Yaniv jika Anda memiliki log dalam format ini (namafile.java:XX) nomor baris xx Anda dapat menautkan pintasan dengan cara yang sama terhubung ketika ada kesalahan, dengan cara ini saya bisa langsung ke baris yang dimaksud hanya dengan mengklik logcat
Saya meletakkan ini di dalam Aplikasi tambahan saya sehingga saya dapat menggunakan di setiap file lainnya
Tangkapan layar:
sumber
AndroidStudio memiliki
logt
template secara default (Anda dapat mengetiklogt
dan menekan tab agar template dapat diperluas menjadi kode yang sama). Saya sarankan menggunakan ini untuk menghindari menyalin menempel definisi TAG dari kelas lain dan lupa untuk mengubah kelas yang Anda rujuk. Template meluas secara default keprivate static final String TAG = "$CLASS_NAME$"
Untuk menghindari penggunaan nama kelas lama setelah pemfaktoran ulang, Anda dapat mengubahnya menjadi
private static final String TAG = $CLASS_NAME$.class.getSimpleName();
Ingatlah untuk memeriksa tombol "Edit variabel" dan pastikan bahwa
CLASS_NAME
variabel ditentukan untuk menggunakanclassName()
Ekspresi dan "Lewati jika ditentukan" dicentang.sumber
Saya telah membuat kelas variabel Statis, metode, dan kelas bernama
S
.Berikut ini adalah metode logging:
Ini dipanggil di kelas mana pun karena
S.L(this, whaterver_object);
ThegetClass().getName()
juga menambahkan nama paket, oleh karena itu, saya menghapusnya untuk menghindari pembuatan tag yang terlalu panjang.Keuntungan:
Log.d(TAG,
toString
Log.d
karena saya hanya perlu menghapus metode dan lokasi semua log ditandai merah.CCC
(string yang pendek dan mudah diketik) sehingga mudah untuk hanya mencantumkan log Anda di monitor android di Android Studio. Terkadang Anda menjalankan layanan atau kelas lain secara bersamaan. Jika Anda harus mencari berdasarkan nama aktivitas saja maka Anda tidak dapat melihat dengan tepat kapan respons layanan diperoleh dan kemudian tindakan dari aktivitas Anda telah terjadi. Awalan seperti CCC membantu karena memberi Anda log secara kronologis dengan aktivitas yang terjadisumber
Context ctx
olehObject ctx
danctx.getClass().getName().replace(ctx.getPackageName(), "")
olehctx.getClass().getSimpleName()
. Dengan begitu, saya bisa menelepon keS.L(Object, Object)
mana saja (termasuk diFragment
s yang tidak diperpanjangContext
, untuk seketika).Anda dapat menggunakan
this.toString()
untuk mendapatkan pengenal unik untuk kelas tertentu tempat Anda mencetak ke log.sumber
toString()
dilakukannya.Dengan mengorbankan memperbarui string ini ketika saya memindahkan kode antar metode atau mengganti nama metode, saya suka melakukan hal berikut. Secara filosofis juga tampaknya lebih baik untuk menyimpan "lokasi" atau "konteks" dalam tag, bukan pesannya.
Manfaatnya di sini adalah Anda dapat memfilter satu metode meskipun isinya tidak statis, mis
Satu-satunya kelemahan adalah bahwa ketika saya mengganti nama
f()
menjadig()
saya perlu mengingat string itu. Selain itu, pemfaktoran ulang IDE otomatis tidak akan menangkapnya.Untuk sementara saya adalah penggemar menggunakan nama kelas pendek, maksud saya
LOG_TAG = MyClass.class.getSimpleName()
. Saya menemukan mereka lebih sulit untuk difilter di log karena lebih sedikit yang harus dilakukan.sumber
Ini adalah pertanyaan yang sangat lama, tetapi meskipun jawaban yang diperbarui untuk Juli 2018 lebih disukai menggunakan Kayu. Untuk Mencatat logging yang benar, error dan peringatan dapat dikirim ke pustaka error pihak ketiga, seperti Firebase atau Crashlytics.
Di kelas yang mengimplementasikan Aplikasi Anda harus menambahkan ini:
Jangan lupakan ketergantungan Timber.
sumber
Untuk pengguna yang mengunjungi pertanyaan ini:
sumber
mereka menggunakan Timber untuk aplikasi IOsched 2019 untuk menampilkan info debug:
implementation 'com.jakewharton.timber:timber:4.7.1'
pemakaian
perhatikan bahwa ini membuat Log hanya tersedia selama status DEBUG dan memfasilitasi tugas Anda untuk menghapusnya secara manual untuk peluncuran di Google Play -
lihat artikel ini https://medium.com/mindorks/better-logging-in-android-using-timber-72e40cc2293d
sumber
Saya biasanya menggunakan nama metode sebagai tag tetapi dari Thread
Ini menghindari Pengecualian baru.
sumber
sumber
RuntimeException
hanya untuk mendapatkan nama kelas saat ini? Sangat buruk.this.getClass().getName()
meskipun Anda harus menghapus cakupan statis dariTAG