項目越來越接近上線了,需要一款日誌庫來調試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'
目前就計劃引用這個作爲日誌庫進行調試。