Log是开发人员调试很重要的检查点,所以呢,巧妙控制Log 是优秀码农必须掌握好的技能之一!
第一步:写过Util工具类,如下:
public class Utils { /** * 用来获取Application meta data(这个在AndroidManifest中设置) */ public static Object getApplicationMeta(String key) { Object applicationMeta = null; try { ApplicationInfo applicationInfo = getPackageInfo().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); if(applicationInfo != null) { applicationMeta = applicationInfo.metaData.get(key); } } catch (NameNotFoundException e) { L.e("can not found the meta in the application attributes:"+key); } return applicationMeta; } }第二步:设置debug开关
public class AppConfigs { //设定一个debug开关,控制是否打印log private static boolean init = false; private static boolean mDebug = false; public static void loadConfig() { if(!init) { //load the debug switch Object debug = Utils.getApplicationMeta("debug"); if(debug!=null) { try { mDebug = (Boolean)debug; } catch (Exception e) { L.e("debug tag is error"); } } init = true; } } public static boolean isDebug() { if(!init) { loadConfig(); } return mDebug; } }
第三步:重写Log的打印方法,以及保存名称:如 log_20140228
public class L { private static final String TAG = Constants.APP_NAME; /** * log文件名字 */ public static final String filename= Constants.LOG_DIR + File.separator + "log"; /** *根据Log不同等级 */ public static void v(String text) { if (AppConfigs.isDebug()) { Log.v(TAG, text); write(text, Log.VERBOSE); } } public static void d(String text) { if (AppConfigs.isDebug()) { Log.d(TAG, text); write(text, Log.DEBUG); } } public static void i(String text) { if (AppConfigs.isDebug()) { Log.i(TAG, text); write(text, Log.INFO); } } public static void w(String text) { if (AppConfigs.isDebug()) { Log.w(TAG, text); write(text, Log.WARN); } } public static void e(String text) { if (AppConfigs.isDebug()) { Log.e(TAG, text); write(text, Log.ERROR); } } public static void e(String text, Throwable throwable) { StackTraceElement[] elements = throwable.getStackTrace(); for (StackTraceElement e : elements) { e(e.toString()); } } /** * 将Log写到日志文件中 * @param text * @param level */ private static synchronized void write(String text, int level) { StringBuilder sb = new StringBuilder(); sb.append("[" + DateUtil.toTime(System.currentTimeMillis(), DateUtil.DATE_FORMATE_ALL) + "]"); switch (level) { case Log.VERBOSE: sb.append("[V]\t"); break; case Log.DEBUG: sb.append("[D]\t"); break; case Log.INFO: sb.append("[I]\t"); break; case Log.WARN: sb.append("[W]\t"); break; case Log.ERROR: sb.append("[E]\t"); break; } //可以任意的访问文件的任何地方 RandomAccessFile raf = null; try { String fileName =filename+ "_" + DateUtil.toTime(System.currentTimeMillis(), DateUtil.DATE_DEFAULT_FORMATE); File logFile = new File(fileName); if (!logFile.exists()) { Utils.initExternalDir(false); logFile.createNewFile(); } raf = new RandomAccessFile(fileName, "rw"); raf.seek(raf.length());//将文件记录指针定位到pos位置。 raf.writeBytes(sb.toString() + text + "\r\n"); } catch (IOException e) { e.printStackTrace(); } finally { if (raf != null) { try { raf.close(); } catch (IOException e) { } } } } }
最后:在AndroidManifest文件中设置meta data:
<application android:name="XXXApplication" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > //控制是否打印Log <meta-data android:name="debug" android:value="true" /> </application>
写入文件效果 大概如下 有详细的时间,log等级,内容可以自己控制。
[2014-02-28 16:49:35][E] ### getItemViewType TYPE_ONE_IMAGE 3
[2014-02-28 16:49:35][E] ### position 3
[2014-02-28 16:49:35][E] ### getItemViewType TYPE_ONE_IMAGE 3
[2014-02-28 16:49:35][E] ### getItemViewType TYPE_ONE_IMAGE 3
[2014-02-28 16:49:35][E] ### getItemViewType TYPE_ADS 0
[2014-02-28 16:49:35][E] ### getItemViewType TYPE_ONE_IMAGE 1
[2014-02-28 16:49:35][E] ### getItemViewType TYPE_ONE_IMAGE 2
[2014-02-28 16:49:35][E] ### getItemViewType TYPE_ONE_IMAGE 3
[2014-02-28 16:49:36][I] network state:WIFI
[2014-02-28 16:49:36][I] network state:WIFI
[2014-02-28 16:49:38][I] network state:WIFI