自己写的工具类,方便调试方法运行时间,代码如下:
package com.example.demo.log;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
/**
* User: yang.jiqun
* Date: 2019/3/28
* Desc:
*/
public class TimeUtils {
private static Map<String, Long> timeMap = Maps.newConcurrentMap();
private static Logger logger = Logger.getLogger(TimeUtils.class);
/**
* 开始记录
* @param logName
*/
public static void startLog(String logName) {
long startTime = System.currentTimeMillis();
timeMap.put(startTimeKey(logName), startTime);
logger.debug(String.format("[%s] START TIME=>[%s],currentTimeMillis=>%d"
,logName
,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(startTime))
,startTime));
}
/**
* 开始记录
*/
public static void startLog() {
String logName = generatorLogName();
startLog(logName);
}
/**
* startTimeKey
* @param logName
* @return
*/
private static String startTimeKey(String logName) {
return Thread.currentThread().getName() + "-" + StringUtils.stripToEmpty(logName);
}
/**
* 开始记录
*/
public static long endLog() {
String logName = generatorLogName();
return endLog(logName);
}
/**
* 结束日志
* @param logName
* @return 时间戳
*/
public static long endLog(String logName) {
long endTime = System.currentTimeMillis();
if (!timeMap.containsKey(startTimeKey(logName))) {
return 0;
}
long startTime = timeMap.remove(startTimeKey(logName));
logger.debug(String.format("[%s] END TIME=>[%s],currentTimeMillis=>%d"
,logName
,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(endTime))
,endTime));
logger.info(String.format("[%s] 耗时=>%d ms",startTimeKey(logName),endTime - startTime));
return endTime - startTime;
}
private static String generatorLogName() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement log = stackTrace[1];
String tag = null;
//如果class名称不为自己,则为调用该方法的className.methodName
for (int i = 1; i < stackTrace.length; i++) {
StackTraceElement e = stackTrace[i];
if (!e.getClassName().equals(log.getClassName())) {
tag = e.getClassName() + "." + e.getMethodName();
break;
}
}
if (tag == null) {
tag = log.getClassName() + "." + log.getMethodName();
}
return tag;
}
public static void main(String args[]){
logger.setLevel(Level.INFO);
for(int i = 1;i <= 5;i++){
new Thread(new Runnable(){
@Override
public void run() {
for(int i = 1;i <= 5;i++){
TimeUtils.startLog("logName" + i);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
TimeUtils.endLog("logName" + i);
}
}
}).start();
}
}
}
依赖 commons-loggiing,apache-log4j,commons-lang3,joda-time,guava,不想依赖可以自己改造。
打印结果:
2020-04-08 09:18:11,759 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-3-logName1] 耗时=>1014 ms
2020-04-08 09:18:11,761 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-1-logName1] 耗时=>1007 ms
2020-04-08 09:18:11,760 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-4-logName1] 耗时=>1012 ms
2020-04-08 09:18:11,760 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-0-logName1] 耗时=>1011 ms
2020-04-08 09:18:11,759 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-2-logName1] 耗时=>1014 ms
2020-04-08 09:18:12,765 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-1-logName2] 耗时=>1000 ms
2020-04-08 09:18:12,768 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-4-logName2] 耗时=>1000 ms
2020-04-08 09:18:12,770 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-2-logName2] 耗时=>1003 ms
2020-04-08 09:18:12,773 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-0-logName2] 耗时=>1006 ms
2020-04-08 09:18:12,774 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-3-logName2] 耗时=>1001 ms
2020-04-08 09:18:13,771 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-2-logName3] 耗时=>1001 ms
2020-04-08 09:18:13,772 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-1-logName3] 耗时=>1006 ms
2020-04-08 09:18:13,772 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-4-logName3] 耗时=>1004 ms
2020-04-08 09:18:13,774 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-0-logName3] 耗时=>1000 ms
2020-04-08 09:18:13,776 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-3-logName3] 耗时=>1001 ms
2020-04-08 09:18:14,771 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-2-logName4] 耗时=>1000 ms
2020-04-08 09:18:14,773 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-1-logName4] 耗时=>1000 ms
2020-04-08 09:18:14,774 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-4-logName4] 耗时=>1001 ms
2020-04-08 09:18:14,776 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-0-logName4] 耗时=>1001 ms
2020-04-08 09:18:14,778 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-3-logName4] 耗时=>1002 ms
2020-04-08 09:18:15,772 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-2-logName5] 耗时=>1001 ms
2020-04-08 09:18:15,775 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-1-logName5] 耗时=>1002 ms
2020-04-08 09:18:15,776 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-4-logName5] 耗时=>1001 ms
2020-04-08 09:18:15,778 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-0-logName5] 耗时=>1001 ms
2020-04-08 09:18:15,781 [INFO] com.example.demo.log.TimeUtils.endLog(TimeUtils.java:75) [Thread-3-logName5] 耗时=>1001 ms
一年又过去了,时间真的很快。