由于项目是属于专项定制,在私有网络中运行,有一天突然说程序出问题了,现场没有自己人,无法定位问题,一脸蒙蔽。因为项目可以把崩溃日志存储到文件,于是想把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();
}
}
}
}