|
|
@@ -3,6 +3,7 @@ package cn.reghao.tnb.search.app.log.service;
|
|
|
import cn.reghao.jutil.jdk.converter.DateTimeConverter;
|
|
|
import cn.reghao.jutil.jdk.io.TextFile;
|
|
|
import cn.reghao.jutil.jdk.serializer.JsonConverter;
|
|
|
+import cn.reghao.jutil.jdk.string.SnowFlake;
|
|
|
import cn.reghao.jutil.jdk.web.log.NginxLog;
|
|
|
import cn.reghao.tnb.common.db.SelectOption;
|
|
|
import cn.reghao.tnb.search.app.config.AppProperties;
|
|
|
@@ -17,7 +18,6 @@ import cn.reghao.tnb.search.app.log.model.vo.GroupCount;
|
|
|
import co.elastic.clients.elasticsearch._types.SortOrder;
|
|
|
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
|
|
|
import co.elastic.clients.elasticsearch._types.query_dsl.RangeQuery;
|
|
|
-import co.elastic.clients.json.JsonData;
|
|
|
import com.google.gson.JsonElement;
|
|
|
import com.google.gson.JsonObject;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -37,13 +37,14 @@ import java.util.stream.Collectors;
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
public class NginxLogService {
|
|
|
- private final String indexName = "nginx_log";
|
|
|
+ private final String indexName = "nginx_log1";
|
|
|
private final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
|
|
|
private final String timeZone = "+08:00";
|
|
|
private final NginxLogDocument nginxLogDocument;
|
|
|
private final SearchService searchService;
|
|
|
private final GeoIpTool geoIpTool;
|
|
|
private final String geoJson;
|
|
|
+ private final SnowFlake idGenerator;
|
|
|
|
|
|
public NginxLogService(NginxLogDocument nginxLogDocument, SearchService searchService,
|
|
|
GeoIpTool geoIpTool, AppProperties appProperties) {
|
|
|
@@ -51,39 +52,26 @@ public class NginxLogService {
|
|
|
this.searchService = searchService;
|
|
|
this.geoIpTool = geoIpTool;
|
|
|
this.geoJson = new TextFile().readFile(appProperties.getGeojsonPath());
|
|
|
+ this.idGenerator = new SnowFlake(1, 1);
|
|
|
}
|
|
|
|
|
|
- public void processNginxLog(NginxLog nginxLog) {
|
|
|
- saveNginxLog(nginxLog);
|
|
|
- }
|
|
|
-
|
|
|
- public void saveNginxLogs(List<NginxLog> list) {
|
|
|
+ public void processNginxLogs(List<NginxLog> list) {
|
|
|
if (list.isEmpty()) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
list.forEach(nginxLog -> {
|
|
|
+ // es 的日期时间格式 yyyy-MM-ddTHH:mm:ss+08:00
|
|
|
String timeIso8601 = nginxLog.getTimeIso8601();
|
|
|
- // es 的日期时间格式 yyyy-MM-ddTHH:mm:ss
|
|
|
- String dateTimeStr = timeIso8601.replace("+08:00", "");
|
|
|
- nginxLog.setTimeIso8601(dateTimeStr);
|
|
|
-
|
|
|
String method = nginxLog.getRequestMethod();
|
|
|
String url = nginxLog.getUrl();
|
|
|
String methodUrl = String.format("%s %s", method, url);
|
|
|
nginxLog.setMethodUrl(methodUrl);
|
|
|
+ nginxLog.setId(idGenerator.nextId() + "");
|
|
|
});
|
|
|
|
|
|
try {
|
|
|
- nginxLogDocument.batchAddDocument(indexName, list);
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void saveNginxLog(NginxLog nginxLog) {
|
|
|
- try {
|
|
|
- nginxLogDocument.addDocument(indexName, nginxLog);
|
|
|
+ nginxLogDocument.saveAll(indexName, list);
|
|
|
} catch (IOException e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
@@ -107,9 +95,9 @@ public class NginxLogService {
|
|
|
}
|
|
|
|
|
|
public List<Object> getNginxLog2(DateTimeRange dateTimeRange) throws Exception {
|
|
|
- String start = dateTimeRange.getStartDateTime();
|
|
|
+ String start = dateTimeRange.getStart();
|
|
|
LocalDateTime start1 = DateTimeConverter.localDateTime2(start);
|
|
|
- String end = dateTimeRange.getEndDateTime();
|
|
|
+ String end = dateTimeRange.getEnd();
|
|
|
LocalDateTime end1 = DateTimeConverter.localDateTime2(end);
|
|
|
|
|
|
Duration duration = Duration.between(start1, end1);
|
|
|
@@ -133,7 +121,7 @@ public class NginxLogService {
|
|
|
|
|
|
String dateField = "timeIso8601";
|
|
|
Query dateQuery = RangeQuery.of(q -> q.field(dateField)
|
|
|
- .from(start1).to(end1).format(dateTimeFormat))._toQuery();
|
|
|
+ .from(start1).to(end1).format(dateTimeFormat).timeZone(timeZone))._toQuery();
|
|
|
Query termQuery = EsQuery.getTermQuery("status", "200");
|
|
|
Query combinedQuery = Query.of(q -> q.bool(b -> b.filter(termQuery).filter(dateQuery)));
|
|
|
|
|
|
@@ -158,7 +146,7 @@ public class NginxLogService {
|
|
|
String end1 = String.format("%s 23:59:59", endDate);
|
|
|
String dateField = "timeIso8601";
|
|
|
Query dateQuery = RangeQuery.of(q -> q.field(dateField)
|
|
|
- .from(start1).to(end1).format(dateTimeFormat))._toQuery();
|
|
|
+ .from(start1).to(end1).format(dateTimeFormat).timeZone(timeZone))._toQuery();
|
|
|
return searchService.count(indexName, dateQuery);
|
|
|
}
|
|
|
|
|
|
@@ -197,13 +185,18 @@ public class NginxLogService {
|
|
|
return results;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 按字段和时间范围聚合
|
|
|
+ *
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ * @date 2026-01-09 21:26:58
|
|
|
+ */
|
|
|
public List<GroupCount> getChartData3(String aggregateField, String dateStr) throws Exception {
|
|
|
String dateField = "timeIso8601";
|
|
|
DateTimeRange dateTimeRange = getDateTimeRange(dateStr);
|
|
|
- String startDateTime = dateTimeRange.getStartDateTime();
|
|
|
- String endDateTime = dateTimeRange.getEndDateTime();
|
|
|
- String start = startDateTime;
|
|
|
- String end = endDateTime;
|
|
|
+ String start = dateTimeRange.getStart();
|
|
|
+ String end = dateTimeRange.getEnd();
|
|
|
Query dateQuery = RangeQuery.of(q -> q.field(dateField)
|
|
|
.from(start).to(end).format(dateTimeFormat).timeZone(timeZone))._toQuery();
|
|
|
Map<String, Long> groupMap = searchService.aggregateByQuery(indexName, aggregateField, dateQuery);
|
|
|
@@ -227,10 +220,8 @@ public class NginxLogService {
|
|
|
int deep = 1;
|
|
|
String dateField = "timeIso8601";
|
|
|
DateTimeRange dateTimeRange = getDateTimeRange(dateStr);
|
|
|
- String startDateTime = dateTimeRange.getStartDateTime();
|
|
|
- String endDateTime = dateTimeRange.getEndDateTime();
|
|
|
- String start = startDateTime;
|
|
|
- String end = endDateTime;
|
|
|
+ String start = dateTimeRange.getStart();
|
|
|
+ String end = dateTimeRange.getEnd();
|
|
|
Query dateQuery = RangeQuery.of(q -> q.field(dateField)
|
|
|
.from(start).to(end).format(dateTimeFormat).timeZone(timeZone))._toQuery();
|
|
|
Map<String, Long> groupMap1 = searchService.aggregateByQuery(indexName, aggregateField, dateQuery);
|
|
|
@@ -303,7 +294,7 @@ public class NginxLogService {
|
|
|
String startDate = localDate.minusDays(7).toString();
|
|
|
String endDate = localDate.toString();
|
|
|
|
|
|
- String start1 = String.format("%s 00:00:00", startDate);
|
|
|
+ String start1 = String.format("%s 00:00:00", endDate);
|
|
|
String end1 = String.format("%s 23:59:59", endDate);
|
|
|
return new DateTimeRange(start1, end1);
|
|
|
}
|
|
|
@@ -312,14 +303,13 @@ public class NginxLogService {
|
|
|
String aggregateField = "timeIso8601";
|
|
|
String fieldName = "methodUrl.raw";
|
|
|
|
|
|
- Query query = Query.of(q -> q.matchAll(m -> m));
|
|
|
DateTimeRange dateTimeRange = getDateTimeRange(dateStr);
|
|
|
- String start1 = dateTimeRange.getStartDateTime();
|
|
|
- String end1 = dateTimeRange.getEndDateTime();
|
|
|
-
|
|
|
+ String start = dateTimeRange.getStart();
|
|
|
+ String end = dateTimeRange.getEnd();
|
|
|
String dateField = "timeIso8601";
|
|
|
Query dateQuery = RangeQuery.of(q -> q.field(dateField)
|
|
|
- .from(start1).to(end1).format(dateTimeFormat).timeZone(timeZone))._toQuery();
|
|
|
+ .from(start).to(end).format(dateTimeFormat).timeZone(timeZone))._toQuery();
|
|
|
+
|
|
|
Query combinedQuery;
|
|
|
if (fieldValue != null && !fieldValue.isBlank()) {
|
|
|
Query termQuery = EsQuery.getTermQuery(fieldName, fieldValue);
|