Saya memiliki banyak pernyataan logging untuk debug misalnya.
Log.v(TAG, "Message here");
Log.w(TAG, " WARNING HERE");
saat menggunakan aplikasi ini di ponsel perangkat saya ingin mematikan logging verbose dari mana saya dapat mengaktifkan / menonaktifkan logging.
Jawaban:
Cara yang umum adalah membuat int bernama loglevel, dan menentukan level debug berdasarkan loglevel.
Kemudian, Anda bisa mengubah LOGLEVEL untuk semua level output debug.
sumber
The Dokumentasi Android mengatakan berikut tentang Log Tingkat :
Jadi, Anda mungkin ingin mempertimbangkan menghapus pernyataan log Verbose logout, mungkin menggunakan ProGuard seperti yang disarankan dalam jawaban lain .
Menurut dokumentasi, Anda dapat mengonfigurasi pencatatan pada perangkat pengembangan menggunakan Properti Sistem. Properti untuk set
log.tag.<YourTag>
dan harus ditetapkan ke salah satu dari nilai berikut:VERBOSE
,DEBUG
,INFO
,WARN
,ERROR
,ASSERT
, atauSUPPRESS
. Informasi lebih lanjut tentang ini tersedia dalam dokumentasi untukisLoggable()
metode ini.Anda dapat mengatur properti sementara menggunakan
setprop
perintah. Sebagai contoh:Atau, Anda dapat menentukannya di file '/ data / local.prop' sebagai berikut:
Versi Android yang lebih baru tampaknya mengharuskan / data / lokal.prop hanya dibaca . File ini dibaca saat boot sehingga Anda harus memulai ulang setelah memperbaruinya. Jika
/data/local.prop
dunia dapat ditulis, itu kemungkinan akan diabaikan.Akhirnya, Anda dapat mengaturnya secara terprogram menggunakan
System.setProperty()
metode ini .sumber
android.util.Config
konstanta yang ditinggalkan. Nilai-nilai hardcoded yang ditentukan dalam API API tidak berguna karena ini (seharusnya) bervariasi berdasarkan build. Karenanya rute ProGuard sepertinya solusi terbaik bagi kami.Cara termudah adalah menjalankan JAR yang dikompilasi melalui ProGuard sebelum penerapan, dengan konfigurasi seperti:
Itu akan - terlepas dari semua optimisasi ProGuard lainnya - menghapus pernyataan log verbose langsung dari bytecode.
sumber
Saya mengambil rute sederhana - membuat kelas wrapper yang juga menggunakan daftar parameter variabel.
sumber
Cara yang lebih baik adalah dengan menggunakan SLF4J API + beberapa implementasinya.
Untuk aplikasi Android Anda dapat menggunakan yang berikut:
sumber
logback-android
(karena yanglogback
tepat tidak kompatibel).logback-android-1.0.10-1.jar
adalah 429 KB, yang tidak terlalu buruk mengingat fitur yang disediakan, tetapi sebagian besar pengembang akan menggunakan Proguard untuk mengoptimalkan aplikasi mereka.Kamu harus menggunakan
sumber
Menghapus penebangan dengan proguard (lihat jawaban dari @Christopher) mudah dan cepat, tetapi itu menyebabkan tumpukan jejak dari produksi ke ketidakcocokan sumber jika ada debug logging di file.
Alih-alih, inilah teknik yang menggunakan tingkat penebangan yang berbeda dalam pengembangan vs produksi, dengan asumsi bahwa proguard hanya digunakan dalam produksi. Ia mengenali produksi dengan melihat apakah proguard telah mengubah nama kelas yang diberikan (dalam contoh, saya menggunakan "com.foo.Bar" - Anda akan menggantinya dengan nama kelas yang sepenuhnya memenuhi syarat yang Anda tahu akan diganti namanya dengan proguard).
Teknik ini memanfaatkan logging umum.
sumber
Log4j atau slf4j juga dapat digunakan sebagai kerangka kerja logging di Android bersama dengan logcat. Lihat proyek android-logging-log4j atau dukungan log4j di android
sumber
Ada pengganti drop-in kecil untuk kelas Log android standar - https://github.com/zserge/log
Pada dasarnya yang harus Anda lakukan adalah mengganti impor dari
android.util.Log
menjaditrikita.log.Log
. Kemudian di AndaApplication.onCreate()
atau di beberapa pemeriksa statis memeriksa untukBuilConfig.DEBUG
atau bendera lain dan menggunakanLog.level(Log.D)
atauLog.level(Log.E)
untuk mengubah tingkat log minimal. Anda dapat menggunakanLog.useLog(false)
untuk menonaktifkan logging sama sekali.sumber
Mungkin Anda dapat melihat kelas ekstensi Log ini: https://github.com/dbauduin/Android-Tools/tree/master/logs .
Ini memungkinkan Anda untuk memiliki kontrol yang baik pada log. Misalnya Anda dapat menonaktifkan semua log atau hanya log dari beberapa paket atau kelas.
Selain itu, ia menambahkan beberapa fungsi yang berguna (misalnya Anda tidak harus melewati tag untuk setiap log).
sumber
Saya membuat Utilitas / Pembungkus yang memecahkan masalah ini + masalah umum lainnya di sekitar Penebangan.
Utilitas Debugging dengan fitur-fitur berikut:
Cara Penggunaan?
Saya telah mencoba membuat dokumentasi mandiri.
Saran untuk meningkatkan Utilitas ini dipersilakan.
Bebas digunakan / dibagikan.
Unduh dari GitHub .
sumber
Berikut ini solusi yang lebih kompleks. Anda akan mendapatkan jejak tumpukan penuh dan metode toString () akan dipanggil hanya jika diperlukan (Kinerja). Atribut BuildConfig.DEBUG akan salah dalam mode produksi sehingga semua jejak dan log debug akan dihapus. Kompilator hot spot memiliki kesempatan untuk menghapus panggilan karena sifat statis final.
gunakan seperti ini:
sumber
Dalam skenario pencatatan yang sangat sederhana, di mana Anda benar-benar hanya mencoba menulis ke konsol selama pengembangan untuk keperluan debugging, mungkin lebih mudah untuk hanya melakukan pencarian dan penggantian sebelum produksi Anda membangun dan berkomentar semua panggilan ke Log atau Sistem. print.nl.
Misalnya, dengan asumsi Anda tidak menggunakan "Log." di mana saja di luar panggilan ke Log.d atau Log.e, dll, Anda bisa mencari dan mengganti seluruh solusi untuk mengganti "Log." dengan "// Log." untuk mengomentari semua panggilan logging Anda, atau dalam kasus saya saya hanya menggunakan System.out.println di mana-mana, jadi sebelum pergi ke produksi saya hanya akan melakukan pencarian penuh dan ganti untuk "System.out.println" dan ganti dengan "//System.out.println".
Saya tahu ini tidak ideal, dan alangkah baiknya jika kemampuan untuk menemukan dan berkomentar panggilan ke Log dan System.out.println dibangun ke Eclipse, tetapi sampai itu terjadi cara termudah dan tercepat dan terbaik untuk melakukan ini adalah mengomentari dengan mencari dan mengganti. Jika Anda melakukan ini, Anda tidak perlu khawatir tentang ketidakcocokan nomor baris jejak stack, karena Anda mengedit kode sumber Anda, dan Anda tidak menambahkan overhead dengan memeriksa beberapa konfigurasi level log, dll.
sumber
Dalam aplikasi saya, saya memiliki kelas yang membungkus kelas Log yang memiliki boolean var statis yang disebut "negara". Sepanjang kode saya, saya memeriksa nilai variabel "state" menggunakan metode statis sebelum benar-benar menulis ke Log. Saya kemudian memiliki metode statis untuk mengatur variabel "state" yang memastikan nilainya umum di semua instance yang dibuat oleh aplikasi. Ini berarti saya dapat mengaktifkan atau menonaktifkan semua logging untuk Aplikasi dalam satu panggilan - bahkan ketika Aplikasi sedang berjalan. Berguna untuk panggilan dukungan ... Ini berarti Anda harus tetap menggunakan senjata saat melakukan debug dan tidak mundur menggunakan kelas Log standar ...
Ini juga berguna (mudah) bahwa Java mengartikan boolean var sebagai false jika belum diberi nilai, yang artinya dapat dibiarkan sebagai false sampai Anda perlu menyalakan logging :-)
sumber
Kita dapat menggunakan kelas
Log
di komponen lokal kita dan mendefinisikan metodenya sebagai v / i / e / d. Berdasarkan kebutuhan kita dapat melakukan panggilan lebih lanjut.contoh ditunjukkan di bawah ini.
di sini pesan untuk
string
dan danargs
merupakan nilai yang ingin Anda cetak.sumber
Bagi saya seringkali berguna untuk mengatur level log yang berbeda untuk setiap TAG.
Saya menggunakan kelas wrapper yang sangat sederhana ini:
Sekarang cukup atur level log per TAG di awal setiap kelas:
sumber
Cara lain adalah dengan menggunakan platform logging yang memiliki kemampuan membuka dan menutup log. Ini dapat memberikan banyak fleksibilitas kadang-kadang bahkan pada aplikasi produksi yang lognya harus terbuka dan yang ditutup tergantung pada masalah yang Anda miliki misalnya:
sumber