package com.jthink.skyeye.web.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.jthink.skyeye.data.http.HttpRequest; import com.jthink.skyeye.base.constant.Constants; import com.jthink.skyeye.base.constant.EventType; import com.jthink.skyeye.base.constant.LogLevel; import com.jthink.skyeye.base.constant.Opt; import com.jthink.skyeye.base.dto.LogDto; import com.jthink.skyeye.base.util.DateUtil; import com.jthink.skyeye.web.dto.FilterDto; import com.jthink.skyeye.web.dto.NoneDupeLogDto; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.*; /** * JThink@JThink * * @author JThink * @version 0.0.1 * @desc * @date 2016-10-08 20:01:15 */ @Service @ConfigurationProperties(prefix = "spring.data.es") public class LogQueryService { private static final Logger LOGGER = LoggerFactory.getLogger(LogQueryService.class); private String url; private String sql; private int delay; /** * 向es请求 * @param sql * @return */ public String query(String sql) { String response = HttpRequest.get(this.url, this.sql + Constants.SPACE + Constants.WHERE + Constants.SPACE + sql); return response; } /** * 根据app host interval查询日志 * @param host * @param app * @param interval * @return */ public Map<String, Object> getRealtimeLog(String host, String app, String keyword, int interval) { DateTime dateTime = new DateTime(System.currentTimeMillis()).minusSeconds(this.delay); String[] intervralDate = dateTime.minusMillis(interval).toString(DateUtil.YYYYMMDDHHMMSSSSS).split(Constants.SPACE); String[] now = dateTime.toString(DateUtil.YYYYMMDDHHMMSSSSS).split(Constants.SPACE); StringBuffer sb = new StringBuffer(); sb.append(Constants.HOST).append(Constants.EQUAL) .append(Constants.SINGLE_PHE).append(host).append(Constants.SINGLE_PHE).append(Constants.SPACE) .append(Constants.AND).append(Constants.SPACE).append(Constants.APP).append(Constants.EQUAL) .append(Constants.SINGLE_PHE).append(app).append(Constants.SINGLE_PHE).append(Constants.SPACE); if (!StringUtils.isEmpty(keyword)) { sb.append(Constants.AND).append(Constants.SPACE).append(Constants.MESSAGE_MAX).append(Constants.EQUAL) .append(Constants.SINGLE_PHE).append(keyword).append(Constants.SINGLE_PHE).append(Constants.SPACE); } sb.append(Constants.AND).append(Constants.SPACE).append(Constants.DAY).append(Constants.EQUAL) .append(Constants.SINGLE_PHE).append(intervralDate[0]).append(Constants.SINGLE_PHE).append(Constants.SPACE) .append(Constants.AND).append(Constants.SPACE).append(Constants.TIME).append(Constants.GEQUAL) .append(Constants.SINGLE_PHE).append(intervralDate[1]).append(Constants.SINGLE_PHE).append(Constants.SPACE) .append(Constants.AND).append(Constants.SPACE).append(Constants.TIME).append(Constants.LEQUAL) .append(Constants.SINGLE_PHE).append(now[1]).append(Constants.SINGLE_PHE) .append(Constants.NANO_TIME_ORDER_BY_ASC); return this.parseEsResponse(this.query(sb.toString())); } /** * 根据sql进行查询 * @param sql * @return */ public Map<String, Object> getQueryLog(String sql) { return this.parseEsResponse(this.query(sql)); } /** * 根据filterDto查询日志 * @param filterDto * @return */ public Map<String, Object> getHistoryLog(FilterDto filterDto) { return this.parseEsResponse(this.query(filterDto.buildSql())); } /** * 解析log * @param response * @return */ private Map<String, Object> parseEsResponse(String response) { Map<String, Object> result = new HashMap<String, Object>(); if (null == response) { // 错误 return null; } else { JSONObject json = JSON.parseObject(response); List<NoneDupeLogDto> logs = new ArrayList<NoneDupeLogDto>(); JSONObject hits = json.getJSONObject("hits"); Iterator<Object> iterator = hits.getJSONArray("hits").iterator(); while (iterator.hasNext()) { LogDto logDto = JSON.parseObject(((JSONObject) iterator.next()).getString("_source"), LogDto.class); logs.add(new NoneDupeLogDto(logDto.getNanoTime(), logDto.toString())); } result.put("logs", logs); result.put("total", hits.getInteger("total")); result.put("current", logs.size()); return result; } } /** * 获取所有的日志级别 * @return */ public List<String> getLogLevel() { List<String> levels = new ArrayList<String>(); for (LogLevel logLevel : LogLevel.values()) { levels.add(logLevel.label()); } return levels; } /** * 获取所有的日志事件 * @return */ public List<String> getEventType() { List<String> eventTypes = new ArrayList<String>(); for (EventType eventType : EventType.values()) { eventTypes.add(eventType.symbol()); } return eventTypes; } /** * 获取所有的操作符 * @return */ public List<String> getOpt() { List<String> opts = new ArrayList<String>(); for (Opt opt : Opt.values()) { opts.add(opt.symbol()); } return opts; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getSql() { return sql; } public void setSql(String sql) { this.sql = sql; } public int getDelay() { return delay; } public void setDelay(int delay) { this.delay = delay; } }