Android 之 LogDog
生活随笔
收集整理的這篇文章主要介紹了
Android 之 LogDog
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在寫Android程序時,經(jīng)常碰到在模擬器和調(diào)試器中無法捕捉的exception。有時自己運行好好的程序到了其他機器上就出現(xiàn)了問題。雖然Google Play有錯誤堆棧上傳功能,但是沒有辦法把整個運行的過程記錄下來。為此我寫了一個LogDog類來試圖解決這個問題。
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.lang.Thread.UncaughtExceptionHandler; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.HashSet;import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Build; import android.os.Environment; import android.os.Looper; //import android.util.Log; import android.util.Log;public class LogDog implements UncaughtExceptionHandler {public static String TAG = "LogDog";private static HashSet _tags = new HashSet();private static boolean _debug = false;static {// add tags to be captured_tags.add(PDFMaster.TAG);_tags.add(RecentlyUsedActivity.TAG);_tags.add(DB.TAG);}public static LogDog instance() {return _instance;}public static void i(String tag, String message) {if(_debug) {Log.i(tag, message);return;}PrintWriter writer = _instance.getWriter();if(writer != null && _tags.contains(tag)) {_instance._writer.println("i:" + tag + ":" + message);}}public static void e(String tag, String message) {if(_debug) {Log.i(tag, message);return;}PrintWriter writer = _instance.getWriter();if(writer != null && _tags.contains(tag)) {_instance._writer.println("e" + tag + ":" + message);}}public static void w(String tag, String message) {if(_debug) {Log.i(tag, message);return;}PrintWriter writer = _instance.getWriter();if(writer != null && _tags.contains(tag)) {_instance._writer.println("w" + tag + ":" + message);}}public void init(Context context) {_context = context;_fileName = _context.getString(R.string.app_name) + ".log";_defaultHandler = Thread.getDefaultUncaughtExceptionHandler();Thread.setDefaultUncaughtExceptionHandler(this);}public void close() {if(_writer != null) {_writer.close();_writer = null;}}// privateprivate static LogDog _instance = new LogDog();private static final String PATH =Environment.getExternalStorageDirectory().getPath() + "/log";private Context _context;private String _fileName;private Thread.UncaughtExceptionHandler _defaultHandler;private PrintWriter _writer = null;private LogDog() {}private PrintWriter getWriter() {if(_writer != null)return _writer;// check if we have SD cardif (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//Log.w(TAG, "sdcard unmounted,skip dump exception");return null;}File dir = new File(PATH);if (!dir.exists()) {dir.mkdirs();}File file = new File(PATH + "/" + _fileName);try {_writer = new PrintWriter(new BufferedWriter(new FileWriter(file)));} catch (IOException e) {//Log.e(TAG, "Failed to open " + PATH + "/" + FILE_NAME);_writer = null;}return _writer;}@Overridepublic void uncaughtException(Thread thread, Throwable ex) {// first display a toast messagenew Thread() {@Overridepublic void run() {Looper.prepare();PDFMarkerApp.instance().showToast("Sorry for the trouble, dumping uncaught exeption to SD card");}}.start();try {dump(ex);} catch (Exception e) {//Log.e(TAG, "Failed to dump because " + e.getMessage());e.printStackTrace();}if (_defaultHandler != null) { _defaultHandler.uncaughtException(thread, ex); } else {// sleep so the toast can have time to displaytry {Thread.sleep(3000);} catch (InterruptedException e) {}android.os.Process.killProcess(android.os.Process.myPid()); }}private void dump(Throwable ex) throws IOException, NameNotFoundException {PrintWriter writer = _instance.getWriter();if(writer == null)return;long current = System.currentTimeMillis();String time = new SimpleDateFormat("yyyyMMdd.HHmmss").format(new Date(current));_writer.println(time);PackageManager pm = _context.getPackageManager();PackageInfo pi = pm.getPackageInfo(_context.getPackageName(), PackageManager.GET_ACTIVITIES);_writer.print("App Version: ");_writer.print(pi.versionName);_writer.print('_');_writer.println(pi.versionCode); _writer.print("OS Version: ");_writer.print(Build.VERSION.RELEASE);_writer.print("_");_writer.println(Build.VERSION.SDK_INT);_writer.print("Vendor: ");_writer.println(Build.MANUFACTURER);_writer.print("Model: ");_writer.println(Build.MODEL);_writer.print("CPU ABI: ");_writer.println(Build.CPU_ABI);_writer.println();ex.printStackTrace(_writer);close();File file = new File(PATH + "/" + _fileName);File file2 = new File(PATH + "/" + _fileName + "." + time + ".txt");file.renameTo(file2);}}
在使用時所有的日志就全記錄在一個文件中,直到最后的異常。每次異常都會單獨被記錄在一個文件中,連帶所有需要知道的信息。要是正常運行,這個文件下次就被覆蓋,不會造成空間問題。要是調(diào)試,只要把_debug改一下,所有日志就在LogCat中顯示出來,非常方便。
轉(zhuǎn)載于:https://blog.51cto.com/bluefeather/1606120
總結
以上是生活随笔為你收集整理的Android 之 LogDog的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为Dorado固态存储技术手册合集
- 下一篇: [原]Android打包之Gradle打