android之日誌庫logger

項目越來越接近上線了,需要一款日誌庫來調試bug。

參考:

https://www.jianshu.com/p/316f065cd00c

https://github.com/orhanobut/logger

 

折騰了一天,終於有點名目了,記錄一下。

我這裏使用的是logger日誌庫。使用方法如下:

我封裝了一下,可以寫文件,也可以直接輸出。

package com.example.loggertest;

import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.orhanobut.logger.AndroidLogAdapter;
import com.orhanobut.logger.CsvFormatStrategy;
import com.orhanobut.logger.DiskLogAdapter;
import com.orhanobut.logger.DiskLogStrategy;
import com.orhanobut.logger.FormatStrategy;
import com.orhanobut.logger.Logger;
import com.orhanobut.logger.PrettyFormatStrategy;

import java.io.File;
import java.lang.reflect.Constructor;
import java.util.Arrays;
import java.util.Comparator;

public  class Tool_Log {

    static int mMaxFilesNum = 10;
    static HandlerThread mWriteThread = null;
    static  int mMaxFiles = 1024*500;

    public static  void startLog(Context ct,String tag){
        stopLog();

        String folder = ct.getExternalFilesDir(null)+"/Logs";
        ClearLogFiles(folder);

        mWriteThread = new HandlerThread("AndroidFileLogger." + folder);
        mWriteThread.start();
        try {
            //通過反射實例化DiskLogStrategy中的內部類WriteHandler
            Class<?> clazz = Class.forName("com.orhanobut.logger.DiskLogStrategy$WriteHandler");
            Constructor constructor = clazz.getDeclaredConstructor(Looper.class, String.class, int.class);
            //開啓強制訪問
            constructor.setAccessible(true);
            //核心:通過構造函數,傳入相關屬性,得到WriteHandler實例
            Handler handler = (Handler) constructor.newInstance(mWriteThread.getLooper(), folder, mMaxFiles);
            //創建緩存策略
            FormatStrategy strategy = CsvFormatStrategy.newBuilder().logStrategy(new DiskLogStrategy(handler)).build();
            DiskLogAdapter adapter = new DiskLogAdapter(strategy);
            Logger.addLogAdapter(adapter);
        } catch (Exception e) {
            e.printStackTrace();
            mWriteThread.quit();
        }
        FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
                .tag(tag)   // (Optional) Global tag for every log. Default PRETTY_LOGGER
                .build();
        Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));

        i(folder);
    }
    static void ClearLogFiles(String folder){
        File file = new File(folder);
        if (false == file.exists()){
            return;
        }
        File[] subFile = file.listFiles();
        if (subFile.length <= mMaxFilesNum){
            return;
        }
        int iDelFileNum = subFile.length - mMaxFilesNum;
        Arrays.sort(subFile, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                if((o1.lastModified()-o2.lastModified()>0)){
                    return 1;
                }
                return -1;
            }
        });
        for (int i=0;i<iDelFileNum;i++){
            subFile[i].delete();
        }
    }
    public  static  void stopLog(){
        Logger.clearLogAdapters();
        if (null ==mWriteThread){
            return;
        }
        mWriteThread.quit();
        mWriteThread = null;
    }

    public static void d(@NonNull String message, @Nullable Object... args) {
        Logger.d(message, args);
    }

    public static void d(@Nullable Object object) {
        Logger.d(object);
    }

    public static void e(@NonNull String message, @Nullable Object... args) {
        Logger.e(null, message, args);
    }

    public static void e(@Nullable Throwable throwable, @NonNull String message, @Nullable Object... args) {
        Logger.e(throwable, message, args);
    }

    public static void i(@NonNull String message, @Nullable Object... args) {
        Logger.i(message, args);
    }

    public static void v(@NonNull String message, @Nullable Object... args) {
        Logger.v(message, args);
    }

    public static void w(@NonNull String message, @Nullable Object... args) {
        Logger.w(message, args);
    }
    /**
     * Tip: Use this for exceptional situations to log
     * ie: Unexpected errors etc
     */
    public static void wtf(@NonNull String message, @Nullable Object... args) {
        Logger.wtf(message, args);
    }

    /**
     * Formats the given json content and print it
     */
    public static void json(@Nullable String json) {
        Logger.json(json);
    }

    /**
     * Formats the given xml content and print it
     */
    public static void xml(@Nullable String xml) {
        Logger.xml(xml);
    }
}

調用方法也比較簡單:

        Tool_Log.startLog(this,"tool_log");

        Tool_Log.d("debug22222");
        Tool_Log.e("error3333333");
        Tool_Log.w("warning44444444");
        Tool_Log.v("verbose555555555");

        Tool_Log.stopLog();

輸出結果如下:

 文件保存路徑如下:

/sdcard/Android/data/com.example.loggertest/files

 權限配置:

    <uses-permission  android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

包引用:

implementation 'com.orhanobut:logger:2.2.0'

目前就計劃引用這個作爲日誌庫進行調試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章