Androidのログパッケージ出力

5966 ワード

Androidの開発では、ログを使用してデバッグの情報を印刷することがよくあります.例えば、次のようなものです.
Log.d(TAG, "xxxxx");

しかし、クラスごとに1つのTAGを定義しなければならず、一般的にTAGはクラス名そのものに等しく、煩雑である.さらに重要なのは、毎回このパラメータを持参することです.印刷する情報が多い場合やクラスのコード数が長い場合は、ログの場所を探すのが不便である.では、上記の問題を解決する方法はありますか?
もんだいぶんせき
  • 各クラスのTAGはクラス名に等しいので、自分でクラス名を探すことができますか?
  • 印刷ロゴの位置を見つけることができますか?

  • 答えは肯定的だ!JavaではThrowableクラスを用いるスタックの情報を取得することができる.
    StackTraceElement[] elements = new Throwable().getStackTrace();
    String className = elements[1].getFileName();
    String methodName = elements[1].getMethodName();
    int lineNumber = elements[1].getLineNumber();
    

    この方法でクラス名、メソッド名、行番号情報を取得することができる.情報を入手して梱包する必要があります.デバグの時のログなのでDlogと名付けましょう.では、Dlogには必ずLogの例があり、v(),d(),e(),w(),i()など、Logの方法と同名の方法がある.次のようになります.
    public class DLog {
        private static String className;            //     
        private static String methodName;           //      
        private static int lineNumber;              //    
    
        /**
         *       
         */
        private DLog() {}
    
        /**
         *         
         */
        public static boolean isDebuggable() {
            return BuildConfig.DEBUG;
        }
    
        /**
         *   Log  
         */
        private static String createLog(String log) {
    
            StringBuffer buffer = new StringBuffer();
            buffer.append("[");
            buffer.append(methodName);
            buffer.append(":");
            buffer.append(lineNumber);
            buffer.append("]");
            buffer.append(log);
    
            return buffer.toString();
        }
    
        /**
         *     ,   ,  
         */
        private static void getMethodNames(StackTraceElement[] sElements) {
            className = sElements[1].getFileName();
            methodName = sElements[1].getMethodName();
            lineNumber = sElements[1].getLineNumber();
        }
        
        public static void v(String message) {
            if (!isDebuggable()) {
                return;
            }
    
            getMethodNames(new Throwable().getStackTrace());
            Log.v(className, createLog(message));
        }
    
        public static void d(String message) {
            if (!isDebuggable()) {
                return;
            }
    
    
            getMethodNames(new Throwable().getStackTrace());
            Log.d(className, createLog(message));
        }
    
        public static void i(String message) {
            if (!isDebuggable()) {
                return;
            }
    
            getMethodNames(new Throwable().getStackTrace());
            Log.i(className, createLog(message));
        }
    
        public static void w(String message) {
            if (!isDebuggable()) {
                return;
            }
    
            getMethodNames(new Throwable().getStackTrace());
            Log.w(className, createLog(message));
        }
        
        public static void e(String message) {
            if (!isDebuggable()) {
                return;
            }
    
            getMethodNames(new Throwable().getStackTrace());
            Log.e(className, createLog(message));
        }
    }
    

    これにより、クラス名を自分で見つけることができ、ログ情報の位置を印刷することができる.もう一つ質問があります
    1つのプロジェクトに多くのログ出力が使用されている場合、プロジェクト終了時にこれらの情報を印刷することは許可されません.1つずつ削除しますか?
    いちいち削除するのが面倒くさいから、誰が怠けたいんだ?なぜ私たちは上のクラスに制御を加えないで、出力したくないのは1つのボタンで遮蔽することができてどんなに良いですか.
    ログの情報にはカテゴリがあり、各カテゴリにシーケンス番号を付け、制御シーケンス番号のレベルを付けることで、表示されるカテゴリを制御することができます.
    /**
     *     Log  ,          LOG
     * @author Administrator
     *
     */
    public class DLog {
        private static String className;            //     
        private static String methodName;           //      
        private static int lineNumber;              //    
        
        public static final int VERBOSE = 1;          //  Verbose    Log
        public static final int DEBUG = 2;          //  Debug    Log
        public static final int INFO = 3;           //  Info    Log
        public static final int WARN = 4;           //  Warn    Log
        public static final int ERROR = 5;          //  Error    Log
        public static final int NOTHING = 6;        //     
        
        public static final int LEVEL = VERBOSE;    //       
    
        private DLog() {
        }
    
        public static boolean isDebuggable() {
            return BuildConfig.DEBUG;
        }
    
        private static String createLog(String log) {
    
            StringBuffer buffer = new StringBuffer();
            buffer.append("[");
            buffer.append(methodName);
            buffer.append(":");
            buffer.append(lineNumber);
            buffer.append("]");
            buffer.append(log);
    
            return buffer.toString();
        }
    
        private static void getMethodNames(StackTraceElement[] sElements) {
            className = sElements[1].getFileName();
            methodName = sElements[1].getMethodName();
            lineNumber = sElements[1].getLineNumber();
        }
        
        public static void v(String message) {
            if (!isDebuggable()) {
                return;
            }
    
            if (LEVEL <= VERBOSE) {
                getMethodNames(new Throwable().getStackTrace());
                Log.v(className, createLog(message));
            }
        }
    
        public static void d(String message) {
            if (!isDebuggable()) {
                return;
            }
    
            if (LEVEL <= DEBUG) {
                getMethodNames(new Throwable().getStackTrace());
                Log.d(className, createLog(message));
            }
        }
    
        public static void i(String message) {
            if (!isDebuggable()) {
                return;
            }
    
            if (LEVEL <= INFO) {
                getMethodNames(new Throwable().getStackTrace());
                Log.i(className, createLog(message));
            }
        }
    
        public static void w(String message) {
            if (!isDebuggable()) {
                return;
            }
    
            if (LEVEL <= WARN) {
                getMethodNames(new Throwable().getStackTrace());
                Log.w(className, createLog(message));
            }
        }
        
        public static void e(String message) {
            if (!isDebuggable()) {
                return;
            }
    
            if (LEVEL <= ERROR) {
                getMethodNames(new Throwable().getStackTrace());
                Log.e(className, createLog(message));
            }
        }
    }