日志保存SD卡并上传服务器的工具类

日志本地写入过于频繁或者积累太多会导致应用卡顿和GC,应当及时或者定期清除文件。

package com.bliss.yang.signingapplication.utils;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.util.Log;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @autor YangTianFu
 * @Date 2019/4/12  17:20
 * @Description 日志保存SD卡并上传服务器的工具类
 */
public class LogUtil {
    private static final String TAG = "LogUtil";
    // 是否需要打印bug,在application的onCreate函数里面初始化
    public static boolean isDebug;
    private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/CrashKZ/log/";
    private static final String FILE_NAME = "crash";
    private static final String FILE_NAME_SUFFIX = ".txt";
    private static Context mContext;

    public static void init(Context context) {
        mContext = context.getApplicationContext();
    }

    // 下面四个是默认tag的函数
    public static void i(String msg) {
        if (isDebug) {
            Log.i(TAG, msg);
//            dumpLogErrorToSDCard(msg);
        }
    }

    public static void d(String msg) {
        if (isDebug) {
            Log.d(TAG, msg);
        }
    }

    public static void e(String msg) {
        if (isDebug) {
            Log.e(TAG, msg);
//            dumpLogErrorToSDCard(msg);
        }
    }

    public static void e(String tag, String msg) {
        if (isDebug) {
            Log.e(tag, msg);
//            dumpLogErrorToSDCard(msg);
        }
    }

    public static void v(String msg) {
        if (isDebug) {
            Log.v(TAG, msg);
        }
    }

    // 下面是传入自定义tag的函数
    public static void i(String tag, String msg) {
        if (isDebug) {
            Log.i(tag, msg);
//            dumpLogErrorToSDCard(msg);
        }
    }

    /**
     * 截断输出日志
     * @param msg
     */
    public static void eLength(String tag, String msg) {
        if (isDebug) {
            if (tag == null || tag.length() == 0
                    || msg == null || msg.length() == 0) {
                return;
            }
            int segmentSize = 3 * 1024;
            long length = msg.length();
            if (length <= segmentSize) {// 长度小于等于限制直接打印
                Log.e(tag, msg);
            } else {
                while (msg.length() > segmentSize) {// 循环分段打印日志
                    String logContent = msg.substring(0, segmentSize);
                    msg = msg.replace(logContent, "");
                    Log.e(tag, logContent);
                }
                Log.e(tag, msg);// 打印剩余日志
            }
        }
    }

    /**
     * 分段打印出较长log文本
     * @param log 原log文本
     * @param
     */
    public static void showLogCompletion(String string, String log) {
        if (log.length() > 4000) {
            for (int i = 0; i < log.length(); i += 4000) {
                if (i + 4000 < log.length()) {
                    Log.i(string + i, log.substring(i, i + 4000));
                } else {
                    Log.i(string + i, log.substring(i, log.length()));
                }
            }
        } else {
            Log.i(string, log);
        }
    }

    /**
     * @Author:yangtianfu
     * @Date:{2019/4/16 16:36}
     * @Description 将崩溃日志和自定义错误日志写入SD卡根目录
     */
    public static void dumpLogErrorToSDCard(String msg) {
        //如果SD卡不存在或无法使用,则无法把异常信息写入SD卡
        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            if (isDebug) {
                Log.e(TAG, "sdcard unmounted,skip dump exception");
                return;
            }
        }
        long current = System.currentTimeMillis();
        String time = new SimpleDateFormat("yyyy-MM-dd HH:MM:SS").format(new Date(current));
        File dir = new File(PATH);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File file = new File(PATH + FILE_NAME + FILE_NAME_SUFFIX);
        try {
            PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file, true)));
            pw.println(time);
//            dumpPhoneInfo(pw);
            pw.println(msg);
            pw.println();
            pw.close();
//            Log.e(TAG, "日志写入成功");
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
//            Log.e(TAG, "日志写入失败");
        }
    }

    /**
     * @Author:yangtianfu
     * @Date:{2019/4/16 16:37}
     * @Description 获取当前设备信息
     */
    private static void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException {
        PackageManager pm = mContext.getPackageManager();
        PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
        pw.print("App Version: ");
        pw.print(pi.versionName);
        pw.print('_');
        pw.println(pi.versionCode);
        //Android版本号
//        pw.print("OS Version: ");
//        pw.print(Build.VERSION.RELEASE);
//        pw.print("_");
//        pw.print(Build.VERSION.SDK_INT);
        //手机制造商
//        pw.print("Vendor: ");
//        pw.print(Build.MANUFACTURER);
        //手机型号
//        pw.print("Model: ");
//        pw.println(Build.MODEL);
        //CPU架构
//        pw.print("CPU ABI: ");
//        pw.println(Build.CPU_ABI);
    }
}

发布了316 篇原创文章 · 获赞 63 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/ytfunnysite/article/details/103158779