Android 之 LogDog
生活随笔
收集整理的這篇文章主要介紹了
Android 之 LogDog
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在寫Android程序時(shí),經(jīng)常碰到在模擬器和調(diào)試器中無(wú)法捕捉的exception。有時(shí)自己運(yùn)行好好的程序到了其他機(jī)器上就出現(xiàn)了問(wèn)題。雖然Google Play有錯(cuò)誤堆棧上傳功能,但是沒(méi)有辦法把整個(gè)運(yùn)行的過(guò)程記錄下來(lái)。為此我寫了一個(gè)LogDog類來(lái)試圖解決這個(gè)問(wèn)題。
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);}}
在使用時(shí)所有的日志就全記錄在一個(gè)文件中,直到最后的異常。每次異常都會(huì)單獨(dú)被記錄在一個(gè)文件中,連帶所有需要知道的信息。要是正常運(yùn)行,這個(gè)文件下次就被覆蓋,不會(huì)造成空間問(wèn)題。要是調(diào)試,只要把_debug改一下,所有日志就在LogCat中顯示出來(lái),非常方便。
轉(zhuǎn)載于:https://blog.51cto.com/bluefeather/1606120
總結(jié)
以上是生活随笔為你收集整理的Android 之 LogDog的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华为Dorado固态存储技术手册合集
- 下一篇: C语言中的void指针