android 輸出異常資訊到檔案

來源:互聯網
上載者:User

當程式在開發階段,可以通過開發環境查看錯誤,異常等相關資訊,但是在程式交給測試或者脫離開發環境在真實裝置中運行,出現錯誤就無法得知了。

唯一的辦法就是記錄日誌到文字檔中,可以查看錯誤原因。因此記錄日至到外部存放裝置十分重要了。

日誌的記錄有幾種方法,下面一一介紹。

方法一:使用android內建Log類實現:

這是轉載的

package com.sample;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import android.util.Log;/** * 帶記錄檔輸入的,又可控開關的日誌調試 *  * @author BaoHang * @version 1.0 * @data 2012-2-20 */public class MyLog {private static Boolean MYLOG_SWITCH=true; // 記錄檔總開關private static Boolean MYLOG_WRITE_TO_FILE=true;// 日誌寫入檔案開關private static char MYLOG_TYPE='v';// 輸入日誌類型,w代表只輸出警示資訊等,v代表輸出所有資訊private static String MYLOG_PATH_SDCARD_DIR="/sdcard/";// 記錄檔在sdcard中的路徑private static int SDCARD_LOG_FILE_SAVE_DAYS = 0;// sd卡中記錄檔的最多儲存天數private static String MYLOGFILEName = "Log.txt";// 本類輸出的記錄檔名稱private static SimpleDateFormat myLogSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 日誌的輸出格式private static SimpleDateFormat logfile = new SimpleDateFormat("yyyy-MM-dd");// 記錄檔格式public static void w(String tag, Object msg) { // 警告資訊log(tag, msg.toString(), 'w');}public static void e(String tag, Object msg) { // 錯誤資訊log(tag, msg.toString(), 'e');}public static void d(String tag, Object msg) {// 調試資訊log(tag, msg.toString(), 'd');}public static void i(String tag, Object msg) {//log(tag, msg.toString(), 'i');}public static void v(String tag, Object msg) {log(tag, msg.toString(), 'v');}public static void w(String tag, String text) {log(tag, text, 'w');}public static void e(String tag, String text) {log(tag, text, 'e');}public static void d(String tag, String text) {log(tag, text, 'd');}public static void i(String tag, String text) {log(tag, text, 'i');}public static void v(String tag, String text) {log(tag, text, 'v');}/** * 根據tag, msg和等級,輸出日誌 *  * @param tag * @param msg * @param level * @return void * @since v 1.0 */private static void log(String tag, String msg, char level) {if (MYLOG_SWITCH) {if ('e' == level && ('e' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) { // 輸出錯誤資訊Log.e(tag, msg);} else if ('w' == level && ('w' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {Log.w(tag, msg);} else if ('d' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {Log.d(tag, msg);} else if ('i' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {Log.i(tag, msg);} else {Log.v(tag, msg);}if (MYLOG_WRITE_TO_FILE)writeLogtoFile(String.valueOf(level), tag, msg);}}/** * 開啟記錄檔並寫入日誌 *  * @return * **/private static void writeLogtoFile(String mylogtype, String tag, String text) {// 建立或開啟記錄檔Date nowtime = new Date();String needWriteFiel = logfile.format(nowtime);String needWriteMessage = myLogSdf.format(nowtime) + "    " + mylogtype+ "    " + tag + "    " + text;File file = new File(MYLOG_PATH_SDCARD_DIR, needWriteFiel+ MYLOGFILEName);try {FileWriter filerWriter = new FileWriter(file, true);//後面這個參數代表是不是要接上檔案中原來的資料,不進行覆蓋BufferedWriter bufWriter = new BufferedWriter(filerWriter);bufWriter.write(needWriteMessage);bufWriter.newLine();bufWriter.close();filerWriter.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 刪除制定的記錄檔 * */public static void delFile() {// 刪除記錄檔String needDelFiel = logfile.format(getDateBefore());File file = new File(MYLOG_PATH_SDCARD_DIR, needDelFiel + MYLOGFILEName);if (file.exists()) {file.delete();}}/** * 得到現在時間前的幾天日期,用來得到需要刪除的記錄檔名 * */private static Date getDateBefore() {Date nowtime = new Date();Calendar now = Calendar.getInstance();now.setTime(nowtime);now.set(Calendar.DATE, now.get(Calendar.DATE)- SDCARD_LOG_FILE_SAVE_DAYS);return now.getTime();}}

方法二:

採用第三方提供的日誌管理,例如Apache下的Log4j是一個比較強大的日誌管理功能,通過簡單的配置即可實現,使用起來很是比較方便,在android中使用需要兩個.jar檔案

分別是Apache下的log4j-1.2.17.jar,還有android-logging-log4j-1.0.3.jar檔案(android中需要協助工具輔助)

我已上傳:1,點擊開啟連結  2,點擊開啟連結

下面是我自己封裝的一個簡單的日誌管理類,對於簡單的日誌記錄足夠了。

代碼如下:

package com.zhongxin.stock.util;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import org.apache.log4j.Logger;import android.os.Environment;import android.util.Log;import de.mindpipe.android.logging.log4j.LogConfigurator;public class LoggerManager {private static int SDCARD_LOG_FILE_SAVE_DAYS = 3;// sd卡中記錄檔的最多儲存天數private static SimpleDateFormat logfile = new SimpleDateFormat("yyyy-MM-dd");// 記錄檔格式 private static Logger logger ; private LoggerManager(){}/** * 擷取日誌輸出執行個體 * @return */public static Logger getLoggerInstance(){if(logger==null){initLog();logger = Logger.getLogger(LoggerManager.class.getClass());       //    logger.debug("init log4j log\n");}return logger;}private static void initLog(){ LogConfigurator logConfigurator = new LogConfigurator();      File sdPath=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"ZhongXinLog"); if(!sdPath.exists()){ sdPath.mkdirs(); }  File logFile = new File(sdPath,logfile.format(new Date())+"AppLog"+".txt"); if(!logFile.exists()){ try { logFile.createNewFile();} catch (IOException e) {e.printStackTrace();} }         logConfigurator.setFileName(logFile.getAbsolutePath());      //    logConfigurator.setRootLevel(Level.DEBUG);                 logConfigurator.setFilePattern("%d %-5p [%c{2}]-[%L] %m%n");          logConfigurator.setMaxFileSize(1024 * 1024 * 5);          logConfigurator.setImmediateFlush(true);          logConfigurator.configure();          }public static void cleanFile() {// 如果只須要刪除檔案中的一部分內容則須要在這裡對字串做一些操作String cleanStr = "";FileOutputStream fileOutputStream = null;File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"ZhongXinLog","AppProplemLog"+".txt");try {fileOutputStream = new FileOutputStream(file);fileOutputStream.write(cleanStr.getBytes());fileOutputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static String getExceptionMessage(Exception ex){String result="";StackTraceElement[] stes = ex.getStackTrace();for(int i=0;i<stes.length;i++){result=result+stes[i].getClassName() + "." + stes[i].getMethodName() + "  " + stes[i].getLineNumber() +"line"+"\r\n";}return result;} /**      * 刪除制定的記錄檔      * */  public static void clearCacheFile(final String dir) { String needDelFiel = logfile.format(getDateBefore());  File cacheDir = new File(dir);if (!cacheDir.exists()) {return;}Log.e(dir,"--------共有"+cacheDir.listFiles().length+"個快取檔案");// 防止listFiles()導致ANRFile[] files = cacheDir.listFiles();for (int i = 0; i < files.length; i++) {files[i].delete();}}        /**      * 得到現在時間前的幾天日期,用來得到需要刪除的記錄檔名      * */      private static Date getDateBefore() {          Date nowtime = new Date();          Calendar now = Calendar.getInstance();          now.setTime(nowtime);          now.set(Calendar.DATE, now.get(Calendar.DATE)                  - SDCARD_LOG_FILE_SAVE_DAYS);          return now.getTime();      }      }

loggerM=LoggerManager.getLoggerInstance();try {                //可能產生異常代碼} catch (Exception e) {loggerM.debug(LoggerManager.getExceptionMessage(e));}

日誌結果:

2013-04-18 13:08:57,678 DEBUG [lang.Class]-[28] init log4j log2013-04-18 13:24:07,679 DEBUG [lang.Class]-[237] org.apache.http.conn.scheme.PlainSocketFactory.connectSocket  121lineorg.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection  144lineorg.apache.http.impl.conn.AbstractPoolEntry.open  164lineorg.apache.http.impl.conn.AbstractPooledConnAdapter.open  119lineorg.apache.http.impl.client.DefaultRequestDirector.execute  365lineorg.apache.http.impl.client.AbstractHttpClient.execute  555lineorg.apache.http.impl.client.AbstractHttpClient.execute  487lineorg.apache.http.impl.client.AbstractHttpClient.execute  465linecom.zhongxin.stock.ActivityMain$ThreadReadStock.run  231linejava.lang.Thread.run  856line2013-04-18 13:24:07,682 DEBUG [lang.Class]-[237] org.apache.http.conn.scheme.PlainSocketFactory.connectSocket  121lineorg.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection  144lineorg.apache.http.impl.conn.AbstractPoolEntry.open  164lineorg.apache.http.impl.conn.AbstractPooledConnAdapter.open  119lineorg.apache.http.impl.client.DefaultRequestDirector.execute  365lineorg.apache.http.impl.client.AbstractHttpClient.execute  555lineorg.apache.http.impl.client.AbstractHttpClient.execute  487lineorg.apache.http.impl.client.AbstractHttpClient.execute  465linecom.zhongxin.stock.ActivityMain$ThreadReadStock.run  231linejava.lang.Thread.run  856line

可以看到記錄的還是很清晰明了的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.