Android Logアップグレード版

28626 ワード

今日暇な昼休みに1つのLogの小さいツールを书いて、みんなは仕事の中ですべてandroidのLogに基づいて自分のLogにカプセル化して、自分でLogをカプセル化する原因は以下のいくつかあります:1.使いやすい2.リリース時にログのスイッチ3を自由に制御できる.印刷のフォーマットがより明確である.出力内容はより直感的である.ログによって6を位置決めすることができます.
githubには大神パッケージのLogがたくさんあります.興味のある人は以下を見ることができます.ここでは簡単に以下のパッケージを作り、サポート開発を満たし、性能にあまり影響を与えません.一緒に見てみましょう.
Logsは機能をサポートします:1.androidをサポートします.util.Logすべてのインタフェース仕様2.拡張util.Logは、それぞれのdebugレベルに対してtagを省略可能なリロード方法を1つずつ追加する.JSONフォーマット印刷をサポートする(後に効果図を見る)4.AndroidManifestでサポートxmlにはLogのTagタグ5が配置する.AndroidManifestでサポートxmlでログを制御スイッチ6.Android Studioで位置決め可能なLog印刷位置を使用する、Logをクリックすると対応するLog印刷位置にジャンプする.1つのファイルしかないので、ライブラリで使わずに、このファイルを自分のプロジェクトに直接コピーして、簡単な修正で使えて、とても便利です.
コードは次のとおりです.
package com.mark.lib.log;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;

import com.mark.lib.BaseApplication;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

/** * Created by Mark on 4/5/16. */
public final class Logs {

    public static final int VERBOSE = 2;
    public static final int DEBUG = 3;
    public static final int INFO = 4;
    public static final int WARN = 5;
    public static final int ERROR = 6;
    public static final int ASSERT = 7;

    protected static String mTag = "Logs";
    private static boolean isDebug = false;
    private static final int JSON_INDENT = 4;

    public static int v(String msg) {
        if (isDebug) {
            return Log.v(mTag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int v(String tag, String msg) {
        if (isDebug) {
            return Log.v(tag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int v(String tag, String msg, Throwable tr) {
        if (isDebug) {
            return Log.v(tag, logMsg(msg), tr);
        } else {
            return 0;
        }
    }

    public static int d(String msg) {
        if (isDebug) {
            return Log.d(mTag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int d(String tag, String msg) {
        if (isDebug) {
            return Log.d(tag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int d(String tag, String msg, Throwable tr) {
        if (isDebug) {
            return Log.d(tag, logMsg(msg), tr);
        } else {
            return 0;
        }
    }

    public static int i(String msg) {
        if (isDebug) {
            return Log.i(mTag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int i(String tag, String msg) {
        if (isDebug) {
            return Log.i(tag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int i(String tag, String msg, Throwable tr) {
        if (isDebug) {
            return Log.i(tag, logMsg(msg), tr);
        } else {
            return 0;
        }
    }

    public static int w(String msg) {
        if (isDebug) {
            return Log.w(mTag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int w(String tag, String msg) {
        if (isDebug) {
            return Log.w(tag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int w(String tag, Throwable tr) {
        if (isDebug) {
            return Log.w(tag, tr);
        } else {
            return 0;
        }
    }

    public static int w(String tag, String msg, Throwable tr) {
        if (isDebug) {
            return Log.w(tag, logMsg(msg), tr);
        } else {
            return 0;
        }
    }

    public static int e(String msg) {
        if (isDebug) {
            return Log.e(mTag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int e(String tag, String msg) {
        if (isDebug) {
            return Log.e(tag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static int e(String tag, String msg, Throwable tr) {
        if (isDebug) {
            return Log.e(tag, logMsg(msg), tr);
        } else {
            return 0;
        }
    }

    public static String getStackTraceString(Throwable tr) {
        if (isDebug) {
            return Log.getStackTraceString(tr);
        } else {
            return "";
        }
    }

    public static int println(int priority, String tag, String msg) {
        if (isDebug) {
            return Log.println(priority, tag, logMsg(msg));
        } else {
            return 0;
        }
    }

    public static String formatJson(String msg) {

        if(TextUtils.isEmpty(msg)) {
            w("Empty or Null message content");
            return msg;
        }

        try {
            if (msg.startsWith("{")) {
                JSONObject jsonObject = new JSONObject(msg);
                return jsonObject.toString(JSON_INDENT);
            } else if (msg.startsWith("[")) {
                JSONArray jsonArray = new JSONArray(msg);
                return jsonArray.toString(JSON_INDENT);
            } else {
                return msg;
            }
        } catch (JSONException e) {
            e(e.getCause().getMessage() + "
"
+ msg); return msg; } } @Deprecated public static String formatXml(String xml) { if (TextUtils.isEmpty(xml)) { d("Empty/Null xml content"); return xml; } try { Source xmlInput = new StreamSource(new StringReader(xml)); StreamResult xmlOutput = new StreamResult(new StringWriter()); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); transformer.transform(xmlInput, xmlOutput); return xmlOutput.getWriter().toString().replaceFirst(">", ">
"
); } catch (TransformerException e) { e(e.getCause().getMessage() + "
"
+ xml); return xml; } } private static String logMsg(String msg) { return locationLog() + "
"
+ formatJson(msg); } private static String locationLog() { StringBuilder sb = new StringBuilder(); sb.append("(") .append(getStacks()[1]) .append(":") .append(getStacks()[4]) .append(")#") .append(getStacks()[3]); return sb.toString(); } /** * <li>string[0]:PackageName </li> * <li>string[1]:FileName </li> * <li>string[2]:ClassName </li> * <li>string[3]:MethodName </li> * <li>string[4]:Line </li> */ private static String[] getStacks() { StackTraceElement ste = Thread.currentThread().getStackTrace()[6]; String[] stackInfo = new String[5]; stackInfo[0] = BaseApplication.getAppContext().getPackageName(); stackInfo[1] = ste.getFileName(); String className = ste.getClassName(); stackInfo[2] = className; stackInfo[3] = ste.getMethodName(); stackInfo[4] = ste.getLineNumber() + ""; return stackInfo; } static { Context context = BaseApplication.getAppContext(); try { ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); if (null != appInfo) { if (null != appInfo.metaData) { // get tag String tag = appInfo.metaData.getString("tag"); if (null == tag || tag.equals("")) { mTag = "Logs"; } else { mTag = tag; } // get isDebug isDebug = appInfo.metaData.getBoolean("isDebug", false); } } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } }

コードは非常に簡単です.自分のプロジェクトに進むには、コードの後ろに静的なコードブロックがあり、その中に1行あることに注意してください.
注意事項
AndroidManifest.xml構成
<!-- Log tag  ,name tag value     -->
<meta-data android:name="tag" android:value="Mark's Log" />
<!-- Log   ,name isDebug value true  false-->
<meta-data android:name="isDebug" android:value="true" />

Logsのデフォルトtagは「Logs」であり、閉じた状態、すなわちisDebugはfalseであるため、上記の内容を構成する必要がある場合があります.この場合、Logは印刷されません.
Context context = BaseApplication.getAppContext();

その中のBaseApplication.getAppContext()を自分のプロジェクトのApplication Contextに変更すればよい.
効果を見てみましょう.
android.util.ログの使い方
Log.d(tag, msg);

tagとmsgの2つのパラメータを設定する必要があります.
Logsの使い方
Logs.d(msg);

msgパラメータを1つ作成するだけで、tagパラメータはAndroidManifestにあります.xmlで統一的に指定します.個々の場所でTagを指定する必要がある場合は、対応するリロードメソッドを呼び出せばよい.
android.util.ログ印刷効果
オリジナルロゴの印刷効果は以下の通りです.
04-05 14:40:22.005 4060-4060/com.mark D/Android Log: {     "people":[         {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},         {"firstName":"Jason","lastName":"Hunter","email":"bbbb"},         {"firstName":"Elliotte","lastName":"Harold","email":"cccc"}     ] }

android studioで見たときの一行は、とても不便でした.
Logs印刷効果
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: (LogsTestActivity.java:31)#onClick 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: {
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: "people": [ 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log:         {
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: "firstName": "Brett", 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log:             "lastName": "McLaughlin",
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: "email": "aaaa" 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log:         },
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: { 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log:             "firstName": "Jason",
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: "lastName": "Hunter", 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log:             "email": "bbbb"
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: }, 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log:         {
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: "firstName": "Elliotte", 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log:             "lastName": "Harold",
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: "email": "cccc" 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log:         }
04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: ] 04-05 14:40:22.006 4060-4060/com.mark D/Mark's Log: }

LogsはJSON形式のデータをフォーマットして印刷し、効果をより直感的に確認し、1行目にファイル名+印刷先の行番号+印刷先のメソッド名を印刷します.Android Studioではこの行をクリックできますが、クリックするとログを印刷するファイルの対応する行番号の位置に直接位置決めされます.