Android 在指定目录以当前日期为粒度写入日志文件

2026/04/09Android 59 阅读
package com.xxx.app;

import android.content.Context;
import android.util.Log;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class DailyLog {
    private static final String TAG = "DailyLog";
    private final File logDir;
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.US);
    private final SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US);
    private final ExecutorService executor = Executors.newSingleThreadExecutor(); // 用于异步写文件

    public DailyLog(Context context) {
        // 使用内部私有存储作为日志目录
        //保存到目录 /storage/emulated/0/Android/data/com.xxx.app/files
        try{
            logDir = new File(context.getExternalFilesDir(null), "logs");
            if (!logDir.exists()) {
                logDir.mkdirs();
                Log.i(TAG,"创建logs文件夹成功");
            }
        } catch (Exception e) {
            Log.i(TAG,"DailyLog初始化失败:"+e);
            throw new RuntimeException(e);
        }
    }

    /**
     * 写入日志(异步,不会阻塞主线程)
     * @param level 日志级别,如 "INFO", "ERROR"
     * @param tag 标签
     * @param message 消息
     */
    public void writeLog(final String level, final String tag, final String message) {
        executor.execute(() -> {
            File todayFile = getTodayFile();
            try (FileWriter fw = new FileWriter(todayFile, true);
                 PrintWriter pw = new PrintWriter(fw)) {
                String time = timeFormat.format(new Date());
                pw.printf("%s [%s] %s: %s%n", time, level, tag, message);
            } catch (IOException e) {
                Log.e(TAG, "Failed to write log", e);
            }
        });
    }

    // 获取当天的日志文件(按日期命名,如 2026-02-28.txt)
    private File getTodayFile() {
        String today = dateFormat.format(new Date());
        return new File(logDir, today + ".txt");
    }

    // 可选:获取日志目录路径,方便查看
    public String getLogDirPath() {
        return logDir.getAbsolutePath();
    }
}