因为软件是在机器上跑的,不是在手机上跑的,所以就需要生成日志文件来记录一些比较重要的操作或者状态。
首先用到的是两个相关的工具类:
LocalLog.java
import android.annotation.SuppressLint;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by zcf on 2020/9/18.
*/
final class LocalLog {
private Date mLogTime;
private String mLogTag;
private String mLogMessage;
public LocalLog(String logTag, String logMessage) {
mLogTag = logTag;
mLogMessage = logMessage;
mLogTime = new Date();
}
@SuppressLint("SimpleDateFormat")
private SimpleDateFormat format1 = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
@Override
public String toString() {
String date = format1.format(mLogTime);
return "[" + date + "] [" + mLogTag + "] " + " " + mLogMessage;
}
}
LogHandler.java
import android.text.TextUtils;
import android.util.Log;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by zcf on 2020/9/18.
*/
public class LogHandler {
private static final Lock sLock = new ReentrantLock();
private static ExecutorService mService = Executors.newFixedThreadPool(2);
private static ConcurrentLinkedQueue<String> mQueue = new ConcurrentLinkedQueue<>();
private static File mLogFile;
private LogHandler() {
}
public static void initLogFile(File file) {
//删除目录
if (file.exists() && file.isDirectory()) {
try {
FileUtils.deleteDirectory(file);
} catch (IOException e) {
}
}
//创建文件
if (!file.exists()) {
try {
file.getParentFile().mkdirs();
file.createNewFile();
Log.i("LOGHANDLER","创建日志文件成功");
LogHandler.writeFile("LOGHANDLER","创建日志文件成功");
} catch (IOException e) {
LogHandler.writeFile("LOGHANDLER","创建日志文件失败" + e.getMessage());
}
}
if (file.exists() && file.isFile()) mLogFile = file;
else throw new RuntimeException("is not file :" + file);
}
public static void writeFile(String tag, String string) {
mQueue.add(new LocalLog(tag, string).toString() + "\r\n");
mService.execute(mRunnable);
}
private static Runnable mRunnable = new Runnable() {
@Override
public void run() {
sLock.lock();
try {
StringBuilder msg = new StringBuilder();
while (!mQueue.isEmpty()) {
msg.append(mQueue.poll());
}
if (!TextUtils.isEmpty(msg.toString())) {
FileUtils.writeStringToFile(mLogFile, msg.toString(), true);
msg.delete(0, msg.length());
}
} catch (IOException e) {
e.printStackTrace();
LogHandler.writeFile("LOGHANDLER","创建日志文件失败" + e.getMessage());
} finally {
sLock.unlock();
}
}
};
}
主要就是用到了这两个类。
然后要在你的应用的Application类中(没有的,自己写一个继承Application)。
public static final String LOG_FILE = Environment.getExternalStorageDirectory() + "/logs/goods/goods_" + DateUtils.getDate1() + ".log";
这个是生成的日志文件。
在这个类的onCreate()方法中:
加入
LogHandler.initLogFile(new File(LOG_FILE));
这里是初始化,生成日志文件。
然后就可以在需要的地方写入了:
这个是初始化,每次只调用一次。
这个是往日志文件里写,每次都要调用。
例:
就会在日志文件里看到这句话了。
我这里写的是,每次 重启软件,就是每次调用Application的onCreate()方法,才会去判断是否是新的一天,才会去判断是否要生成新的日志文件。