樂樂音樂播放器(四) 日誌文件

源碼下載:http://www.eoeandroid.com/thread-587291-1-1.html

開發應用的時候,我們一般情況下只能在開發的時候可以看到logcat裏面的日誌,但是我們在日常使用應用的時候,不能時時都連電腦看bug,所以我們最好就是有一個 日誌文件功能  可以將日誌保存到 手機內存卡,當我們的應用 出現問題時,我們就可以查看內存卡里的 日誌文件,這樣我們就方便查看我們的應用 出現的問題。

1. 如果要添加日誌到手機內存卡,首先要往 app 添加權限
    <!-- 往sdcard中寫入數據的權限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <!-- 在sdcard中創建/刪除文件的權限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
    </uses-permission>

2.編寫日誌文件類
  1. package com.happy.logger;

  2. import java.io.File;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. import java.util.Hashtable;

  7. import org.apache.log4j.Logger;

  8. import android.content.Context;

  9. import com.happy.common.Constants;

  10. import de.mindpipe.android.logging.log4j.LogConfigurator;

  11. public class LoggerManage {
  12.         /**
  13.          * 是否輸出log
  14.          */
  15.         private final static boolean logFlag = true;

  16.         /**
  17.          * 應用名標籤
  18.          */
  19.         public final static String tag = "[" + Constants.APPNAME + "]";
  20.         private String userName = null;
  21.         /**
  22.          * 保存用戶對應的Logger
  23.          */
  24.         private static Hashtable<String, LoggerManage> sLoggerTable = new Hashtable<String, LoggerManage>();

  25.         private static int SDCARD_LOG_FILE_SAVE_DAYS = 3;// sd卡中日誌文件的最多保存天數
  26.         private static SimpleDateFormat logfile = new SimpleDateFormat("yyyy-MM-dd");// 日誌文件格式
  27.         private static Logger logger;
  28.         private static LogConfigurator logConfigurator;

  29.         public LoggerManage(String userName) {
  30.                 this.userName = userName;
  31.                 if (logger == null) {
  32.                         initLog();
  33.                         logger = Logger.getLogger(tag);
  34.                 }
  35.         }

  36.         /**
  37.          * 初始化log的相關配置
  38.          */
  39.         private void initLog() {
  40.                 logConfigurator = new LogConfigurator();

  41.                 String time = logfile.format(new Date());
  42.                 String fileName = time + ".log";
  43.                 String path = Constants.PATH_LOGCAT + File.separator + fileName;
  44.                 logConfigurator.setFileName(path);
  45.                 // 輸出內容的格式
  46.                 logConfigurator.setFilePattern("%d{yyyy-MM-dd HH:mm:ss} <%m>%n%n");
  47.                 // 文件大小500k
  48.                 logConfigurator.setMaxFileSize(1024 * 500);
  49.                 // 備份
  50.                 logConfigurator.setMaxBackupSize(1);
  51.                 // 表示所有消息都會被立即輸出,設爲false則不輸出,默認值是true。
  52.                 logConfigurator.setImmediateFlush(true);
  53.                 logConfigurator.configure();

  54.                 cleanOldLogFile();

  55.         }

  56.         /**
  57.          * 清除過期的log文件
  58.          */
  59.         private void cleanOldLogFile() {
  60.                 File logFileParent = new File(Constants.PATH_LOGCAT);
  61.                 if (logFileParent.exists()) {
  62.                         String needDelTime = logfile.format(getDateBefore());
  63.                         File[] files = logFileParent.listFiles();
  64.                         if (files != null) {
  65.                                 for (int i = 0; i < files.length; i++) {
  66.                                         String fileName = files[i].getName();
  67.                                         fileName = fileName.substring(0, fileName.lastIndexOf("."));
  68.                                         if (needDelTime.compareTo(fileName) > 0) {
  69.                                                 files[i].delete();
  70.                                         }
  71.                                 }
  72.                         }
  73.                 }
  74.         }

  75.         /**
  76.          * 得到現在時間前的幾天日期,用來得到需要刪除的日誌文件名
  77.          * */
  78.         private Date getDateBefore() {
  79.                 Date nowtime = new Date();
  80.                 Calendar now = Calendar.getInstance();
  81.                 now.setTime(nowtime);
  82.                 now.set(Calendar.DATE, now.get(Calendar.DATE)
  83.                                 - SDCARD_LOG_FILE_SAVE_DAYS);
  84.                 return now.getTime();
  85.         }

  86.         /**
  87.          * 
  88.          * @param userName
  89.          *            用戶名
  90.          * @return
  91.          */
  92.         public static LoggerManage getLogger(String userName) {
  93.                 LoggerManage userLogger = (LoggerManage) sLoggerTable.get(userName);
  94.                 if (userLogger == null) {
  95.                         userLogger = new LoggerManage(userName);
  96.                         sLoggerTable.put(userName, userLogger);
  97.                 }
  98.                 return userLogger;

  99.         }

  100.         /**
  101.          * 創建zhangliangming用法
  102.          * 
  103.          * @return
  104.          */
  105.         public static LoggerManage getZhangLogger(Context mContext) {
  106.                 String name = "zhangliangming";
  107.                 LoggerManage userLogger = (LoggerManage) sLoggerTable.get(name);
  108.                 if (userLogger == null) {
  109.                         userLogger = new LoggerManage(name);
  110.                         sLoggerTable.put(name, userLogger);
  111.                 }
  112.                 return userLogger;
  113.         }

  114.         /**
  115.          * 獲取方法名
  116.          * 
  117.          * @return
  118.          */
  119.         private String getFunctionName() {
  120.                 StackTraceElement[] sts = Thread.currentThread().getStackTrace();
  121.                 if (sts == null) {
  122.                         return null;
  123.                 }
  124.                 for (StackTraceElement st : sts) {
  125.                         if (st.isNativeMethod()) {
  126.                                 continue;
  127.                         }
  128.                         if (st.getClassName().equals(Thread.class.getName())) {
  129.                                 continue;
  130.                         }
  131.                         if (st.getClassName().equals(this.getClass().getName())) {
  132.                                 continue;
  133.                         }
  134.                         return "@" + userName + "[url=home.php?mod=space&uid=2779]@[/url] " + "[ "
  135.                                         + Thread.currentThread().getName() + ": "
  136.                                         + st.getClassName() + ":" + st.getLineNumber() + " "
  137.                                         + st.getMethodName() + " ]";
  138.                 }
  139.                 return null;
  140.         }

  141.         public void i(String str) {
  142.                 if (logFlag) {
  143.                         String name = getFunctionName();
  144.                         if (name != null) {
  145.                                 logger.info(name + " - " + str);
  146.                         } else {
  147.                                 logger.info(str.toString());
  148.                         }
  149.                 }
  150.         }

  151.         public void d(String str) {
  152.                 if (logFlag) {
  153.                         String name = getFunctionName();
  154.                         if (name != null) {
  155.                                 logger.debug(name + " - " + str);
  156.                         } else {
  157.                                 logger.debug(str.toString());
  158.                         }
  159.                 }
  160.         }

  161.         public void f(String str) {
  162.                 if (logFlag) {
  163.                         String name = getFunctionName();
  164.                         if (name != null) {
  165.                                 logger.fatal(name + " - " + str);
  166.                         } else {
  167.                                 logger.fatal(str.toString());
  168.                         }
  169.                 }
  170.         }

  171.         public void w(String str) {
  172.                 if (logFlag) {
  173.                         String name = getFunctionName();
  174.                         if (name != null) {
  175.                                 logger.warn(name + " - " + str);
  176.                         } else {
  177.                                 logger.warn(str.toString());
  178.                         }
  179.                 }
  180.         }

  181.         public void e(String str) {
  182.                 if (logFlag) {
  183.                         String name = getFunctionName();
  184.                         if (name != null) {
  185.                                 logger.error(name + " - " + str);
  186.                         } else {
  187.                                 logger.error(str.toString());
  188.                         }
  189.                 }
  190.         }

  191. }
複製代碼


發佈了50 篇原創文章 · 獲贊 15 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章