@Slf4j public class FieldLogTrace implements LogTrace {
private static final String START_PREFIX = "-->"; private static final String COMPLETE_PREFIX = "<--"; private static final String EX_PREFIX = "<X-";
private TraceId traceIdHolder;
@Override public TraceStatus begin(String message) {
syncTraceId(); TraceId traceId = traceIdHolder; Long startTimeMs = System.currentTimeMillis();
log.info("[{}] {}{}", traceId.getId(), addSpace(START_PREFIX, traceId.getLevel()), message); return new TraceStatus(traceId, startTimeMs, message); }
private void syncTraceId(){ if(traceIdHolder == null){ traceIdHolder = new TraceId(); }else{ traceIdHolder = traceIdHolder.createNextId(); } }
@Override public void end(TraceStatus status) { complete(status, null); }
@Override public void exception(TraceStatus status, Exception e) { complete(status, e); }
private void complete(TraceStatus status, Exception e) { Long stopTimeMs = System.currentTimeMillis(); long resultTimeMs = stopTimeMs - status.getStartTimeMs(); TraceId traceId = status.getTraceId();
if (e == null) { log.info("[{}] {}{} time={}ms", traceId.getId(), addSpace(COMPLETE_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs); } else { log.info("[{}] {}{} time={}ms ex={}", traceId.getId(), addSpace(EX_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs, e.toString()); }
releaseTraceId(); }
private void releaseTraceId() { if(traceIdHolder.isFirstLevel()){ traceIdHolder = null; }else{ traceIdHolder = traceIdHolder.createPreviousId(); } }
private static String addSpace(String prefix, int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append((i == level - 1) ? "|" + prefix : "| "); } return sb.toString(); } }
|