Java封装错误日志
作者:谢景,撰写:2019-4-25
在实际项目中,我们项目中多多少少会出现bug,这时候写一个错误日志可以方便我们以后查找并优化。
下面是本人封装的错误日志:
//声明一个继承异常类的泛型类作为形参,接收方法的错误异常信息
public static <T extends Exception> void Exceptionde(T t) {
//获取调用者的类名;
String classType= Thread.currentThread().getStackTrace()[2].getClassName();
//获取调用者的方法名;
String funType= Thread.currentThread().getStackTrace()[2].getMethodName();
//获取调用者调用本方法的行数;
int linType= Thread.currentThread().getStackTrace()[2].getLineNumber();
try {
File file = new File("F:/z/error log.txt");//实例化文件类,以便存储错误信息
if (file.exists()) {//exists():判断该文件是否存在;
//声明一个随意访问类,声明可以读写
RandomAccessFile accessFile=new RandomAccessFile("F:/z/error log.txt","rw");
//实例化StringBuffer 字符串;
StringBuffer buffer = new StringBuffer("");
//给字符串追加数据;
//追加错误发生时间
buffer.append("时间:"+new SimpleDateFormat("yyyy-MM-dd hh:mm:sss").format(new Date())+ '\n');
//追加产生错误的类和方法和行号,方便以后快速定位;
buffer.append(classType+"类的"+ funType+"方法中/行号为(" +linType +");");
//追加错误信息,快速找到错误原因
buffer.append("出现异常类型:" + t.getClass().getName().toString() + ";"+"详细消息:" + t.getMessage() +'\n'+'\n');
//将字符串转换为byte数组;
byte[] b = buffer.toString().getBytes();
//seek(): 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作
accessFile.seek(accessFile.length());
//将bye数组以流的形式传到错误日志文件;
accessFile.write(b);
//关闭流
accessFile.close();
} else {//如果文件不存在,就创建文件
//createNewFile(); 创建文件;
file.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
}
}
下面是上面方法中用到的语法分析:
Thread.currentThread().getStackTrace()[2].getClassName();
Thread是线程类
currentThread()方法是 返回对当前正在执行的线程对象的引用
getStackTrace()方法是 返回一个表示该线程堆栈转储的堆栈跟踪元素数组
注重:getStackTrace()方法存的是数组,第一位存的是自己本身,第二位存的是调用该方法的方法,第三位是调用该方法的调用方法,以此类推;
简单说就是:
getStackTrace()[0]=getStackTrace
getStackTrace()[1]=调用getStackTrace方法的对象,在上面就是Exceptionde方法
getStackTrace()[2]=调用Exceptionde方法的对象;
在这里要注意的就是如果如果没有调用对象,对应的索引就不存在;在这里没有方法调用Exceptionde方法;所以getStackTrace()[2]是不存在的,如果写了会报索引越界异常;
getStackTrace()返回的具体的对象可以有下面的一些方法来获取对象的某些属性;
getClassName()
返回类的完全限定名,该类包含由该堆栈跟踪元素所表示的执行点。
getFileName()
返回源文件名,该文件包含由该堆栈跟踪元素所表示的执行点。
getLineNumber()
返回源行的行号,该行包含由该堆栈该跟踪元素所表示的执行点。
getMethodName()
返回方法名,此方法包含由该堆栈跟踪元素所表示的执行点。
下面做一些异常实例,然后调用了上面的方法:
这里提供是两种异常:除0异常和索引越界异常!
public void text(){
try {
int a = 1, b = 0;
int c = a / 0;
} catch (ArithmeticException e) {// ArithmeticException:-----Arithmetic算数,Exception异常
ExceptionDemo.Exceptionde(e);
}
try {
int[] is = new int[1];
is[3] = 3;
} catch (Exception e1) {
ExceptionDemo.Exceptionde(e1);
}
}
下面是结果图: