一个Log的工具类

由于项目是属于专项定制,在私有网络中运行,有一天突然说程序出问题了,现场没有自己人,无法定位问题,一脸蒙蔽。因为项目可以把崩溃日志存储到文件,于是想把log日志保存一下,以便方便定位。

public class LogUtils {
    private static String TAG = "ZP =====> ";
    private static String logPath = null;//log日志存放路径
    private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");//日期格式;
    private final static long defaultSize = 10*1024*1024;   //默认10M
    private static Date date = new Date();//因为log日志是使用日期命名的,使用静态成员变量主要是为了在整个程序运行期间只存在一个.txt文件中;

    private static final char VERBOSE = 'v';

    private static final char DEBUG = 'd';

    private static final char INFO = 'i';

    private static final char WARN = 'w';

    private static final char ERROR = 'e';

    

    public static void init(Context context){
        logPath = getFilePath(context);//获得文件储存路径,在后面加"/Logs"建立子文件夹
        //如果父路径不存在
        File file = new File(logPath);
        if (!file.exists()) {
            file.mkdirs();//创建父路径
        }

        //判断log文件大小,
        File myFile = new  File(logPath);
        File[] files = myFile.listFiles();
        long size = 0;
        for(int i=0;i<files.length;i++){
            size += files[i].length();
        }
        if(size >= defaultSize||files.length>=50){
            for(int i=0;i<files.length;i++){
                files[i].delete();
            }
        }
    }

    /**
     * 获得文件存储路径
     *
     * @return
     */
    private static String getFilePath(Context context) {

        if (Environment.MEDIA_MOUNTED.equals( Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) {//如果外部储存可用
            return context.getExternalFilesDir("Log").getPath();
        } else {
            return context.getFilesDir().getPath();//直接存在/data/data里,非root手机是看不到的
        }
    }

    public static void v(String message){
        v(message,false);
    }

    public static void v(String message,boolean isWriteToFile){
        v(null,message,isWriteToFile);
    }

    public static void v(Object target,String message,boolean isWriteToFile){
        String tag = target == null ? TAG:(target instanceof String?(String)target:target.getClass().getSimpleName()+"=====>");
        String msg = message ==null ? "null" :message;
        Log.v(tag+":",msg);
        if(isWriteToFile){
            writeToFile(VERBOSE,tag+":",msg);
        }
    }


    public static void d(String message){
        d(message,false);
    }

    public static void d(String message,boolean isWriteToFile){
        d(null,message,isWriteToFile);
    }

    public static void d(Object target,String message,boolean isWriteToFile){
        String tag = target == null ? TAG:(target instanceof String?(String)target:target.getClass().getSimpleName()+"=====>");
        String msg = message ==null ? "null" :message;
        Log.d(tag+":",msg);
        if(isWriteToFile){
            writeToFile(DEBUG,tag+":",msg);
        }
    }

    public static void i(String message){
        i(message,false);
    }

    public static void i(String message,boolean isWriteToFile){
        i(null,message,isWriteToFile);
    }

    public static void i(Object target,String message,boolean isWriteToFile){
        String tag = target == null ? TAG:(target instanceof String?(String)target:target.getClass().getSimpleName()+"=====>");
        String msg = message ==null ? "null" :message;
        Log.i(tag+":",msg);
        if(isWriteToFile){
            writeToFile(INFO,tag+":",msg);
        }
    }

    public static void w(String message){
        w(message,false);
    }

    public static void w(String message,boolean isWriteToFile){
        w(null,message,isWriteToFile);
    }

    public static void w(Object target,String message,boolean isWriteToFile){
        String tag = target == null ? TAG:(target instanceof String?(String)target:target.getClass().getSimpleName()+"=====>");
        String msg = message ==null ? "null" :message;
        Log.w(tag+":",msg);
        if(isWriteToFile){
            writeToFile(WARN,tag+":",msg);
        }
    }

    public static void e(String message){
        e(null,message,false);
    }

    public static void e(String message,boolean isWriteToFile){
        e(null,message,isWriteToFile);
    }

    public static void e(Object target,String message,boolean isWriteToFile){
        String tag = target == null ? TAG:(target instanceof String?(String)target:target.getClass().getSimpleName()+"=====>");
        String msg = message ==null ? "null" :message;
        Log.e(tag+":",msg);
        if(isWriteToFile){
            writeToFile(ERROR,tag+":",msg);
        }
    }

    /**
     * 将log信息写入文件中
     *
     * @param type
     * @param tag
     * @param msg
     */
    private synchronized static void writeToFile(char type, String tag, String msg) {

        if (null == logPath) {
            Log.e(TAG, "logPath == null ,未初始化LogUtils");
            return;
        }

        String fileName = logPath + "/Log_" + dateFormat.format(new Date()) + ".txt";//log日志名,使用时间命名,保证不重复
        
        String log = dateFormat.format(date) + "   " + type + "   " + tag + "   " + msg+"\r\n";//log日志内容,可以自行定制

        FileOutputStream fos = null;//FileOutputStream会自动调用底层的close()方法,不用关闭
        BufferedWriter bw = null;
        try {

            fos = new FileOutputStream(fileName, true);//这里的第二个参数代表追加还是覆盖,true为追加,flase为覆盖
            bw = new BufferedWriter(new OutputStreamWriter(fos));
            bw.write(log);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bw != null) {
                    bw.close();//关闭缓冲流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_35226205/article/details/81704332