package com.yanzuoguang.log; import com.yanzuoguang.util.cache.MemoryCache; import com.yanzuoguang.util.helper.DateHelper; import com.yanzuoguang.util.helper.StringHelper; import org.springframework.stereotype.Component; /** * 日志时间 * * @author 颜佐光 */ @Component public class LogCountTime { private static final String URL_PARA_START = "?"; /** * 今日缓存,超过时间会自动清空 */ private final MemoryCache<LogUrlCountVo> todayMemoryCache = new MemoryCache<>(); /** * 今日日期 */ private String today; /** * 今日时间 */ private String todayTime; /** * 获取日志结果 * * @return 今日日志结果 */ public LogCountResult getTodayResult() { return new LogCountResult(todayTime, todayMemoryCache.getValues()); } private void initToday() { String today = DateHelper.getToday(); if (!StringHelper.compare(this.today, today)) { synchronized (todayMemoryCache) { if (!StringHelper.compare(this.today, today)) { todayMemoryCache.clear(); this.today = today; this.todayTime = DateHelper.getNow(); } } } } /** * 获取缓存对象 * * @param urlFrom 地址 * @return 缓存对象 */ private LogUrlCountVo getCount(String urlFrom) { // 初始化日期 initToday(); String key; if (urlFrom.contains(URL_PARA_START)) { key = urlFrom.substring(0, urlFrom.indexOf(URL_PARA_START)); } else{ key = urlFrom; } // 缓存中获取对象 LogUrlCountVo ret = todayMemoryCache.get(key); if (ret != null) { return ret; } // 缓存中不存在则创建对象 synchronized (todayMemoryCache) { ret = todayMemoryCache.get(key); if (ret != null) { return ret; } ret = new LogUrlCountVo(key); todayMemoryCache.put(key, ret); return ret; } } /** * 开始记录日志 * * @param url 请求地址 */ public void start(String url) { LogUrlCountVo count = getCount(url); count.addStart(); } /** * 结束 * * @param url 请求地址 * @param time 执行时间 * @param isError 是否错误 */ public void finish(String url, long time, boolean isError) { LogUrlCountVo count = getCount(url); count.addFinish(time, isError); } }