有时候,不知道为什么,android 的log 会打印不出来。怀疑是某一个时刻,log 打印太多导致。或者有其他原因。
这时候,如果不能调试,只能看log 的话,那么真的需要log 排查问题。但是log 老是在关键的地方不打印,怎么办?
package com.example.util;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* =======================================================================================
* 作 者:caoxinyu
* 创建日期:2020/3/17.
* 类的作用:
* 修订历史:
* =======================================================================================
*/
public class LogToFile {
private static final String TAG = "LogToFile";
private static ExecutorService executorService;
private static String filePath;
static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd_HH");
static SimpleDateFormat simpleDateFormat_Prefix = new SimpleDateFormat("MM-dd HH:mm:ss.SSSZ");
private static final boolean Enable = true;
// private static final ReentrantLock LOCK = new ReentrantLock();
public static void init(Context context){
if (!Enable) {
return;
}
init(context,"");
executorService = Executors.newSingleThreadExecutor();
}
public static void init(Context context, String path){
if (context != null) {
path = context.getExternalCacheDir() + "/logs/";
}
if (path != null) {
File file = new File(path);
if (!file.isDirectory()) {
file.mkdirs();
}
}
filePath = path;
}
public static void log(String tag, String msg){
if (!Enable) {
return;
}
if (executorService == null) {
// not init
return;
}
executorService.submit(new Runnable() {
@Override
public void run() {
//写文件的时候 要有个锁 防止多线程 有问题
//我这里不需要用锁 是因为我的线程池是单线程池
if (TextUtils.isEmpty(filePath)) {
Log.d(TAG,"do you init ?");
}
String fileName = filePath + "log_" + simpleDateFormat.format(new Date()) +".txt";
File file = new File(fileName);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
if (file.exists()) {
try (PrintStream printStream = new PrintStream(new FileOutputStream(fileName, true), true)) {
printStream.println(simpleDateFormat_Prefix.format(new Date())+ " " + tag + ":" + msg);
printStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
});
}
}
在你的打印log 的地方,用这个工具类,帮助你打印log 的时候,直接写到文件里面。这样就不会丢掉任何的log。
方便快速排查问题。