Android应用如何巧妙合理的控制Log

来源:互联网 发布:惠众金融网络借贷 编辑:程序博客网 时间:2024/05/16 00:25

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

0 0
原创粉丝点击