diff --git a/nladmin-system/nlsso-server/pom.xml b/nladmin-system/nlsso-server/pom.xml index 10a07cc..b59a145 100644 --- a/nladmin-system/nlsso-server/pom.xml +++ b/nladmin-system/nlsso-server/pom.xml @@ -27,11 +27,22 @@ 0.11.1 5.9.0 - 8.2.0 + 1.9 + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + + HdrHistogram + org.hdrhistogram + + + com.internetitem @@ -438,39 +449,39 @@ - - org.apache.lucene - lucene-core - ${lucene.version} - - - org.apache.lucene - lucene-highlighter - ${lucene.version} - - - org.apache.lucene - lucene-analyzers-common - ${lucene.version} - - - com.github.magese - ik-analyzer - ${lucene.version} - + + + + + + + + + + + + + + + + + + + + - - - org.apache.lucene - lucene-analyzers-smartcn - ${lucene.version} - - - - org.apache.lucene - lucene-queryparser - ${lucene.version} - + + + + + + + + + + + + org.redisson diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/AppRun.java b/nladmin-system/nlsso-server/src/main/java/org/nl/AppRun.java index 73696fd..cdcd55e 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/AppRun.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/AppRun.java @@ -5,6 +5,8 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.core.spring.EnableDynamicTp; import org.mybatis.spring.annotation.MapperScan; import org.nl.config.SpringContextHolder; +import org.nl.config.lucene.TagNameEnum; +import org.slf4j.MDC; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; @@ -35,6 +37,7 @@ import org.springframework.web.bind.annotation.RestController; public class AppRun implements ApplicationRunner { public static void main(String[] args) { + log.info("Application starting..."); SpringApplication.run(AppRun.class, args); } @@ -56,6 +59,7 @@ public class AppRun implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { + MDC.put("tag", TagNameEnum.LMS.getTag()); log.info("noblelift - 项目启动成功!"); System.out.println("项目启动成功!"); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/config/lucene/LuceneAppender.java b/nladmin-system/nlsso-server/src/main/java/org/nl/config/lucene/LuceneAppender.java index 901f3c3..b645d38 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/config/lucene/LuceneAppender.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/config/lucene/LuceneAppender.java @@ -1,110 +1,110 @@ -package org.nl.config.lucene; -/** - * @author ldjun - * @version 1.0 - * @date 2023年08月24日 13:00 - * @desc desc - */ - -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.AppenderBase; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.document.*; -import org.apache.lucene.index.IndexWriter; -import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.store.Directory; -import org.apache.lucene.store.FSDirectory; -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.wltea.analyzer.lucene.IKAnalyzer; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.file.Paths; -import java.util.Map; -import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class LuceneAppender extends AppenderBase { - - private static Directory index; - public static IndexWriter indexWriter; - - - @Override - public void start() { - super.start(); - try { - init(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void init() throws IOException { - Resource resource = new ClassPathResource("config/application.yml"); - YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean(); - yamlPropertiesFactoryBean.setResources(resource); - Properties properties = yamlPropertiesFactoryBean.getObject(); - // 获取配置值 - String luceneDir = properties.getProperty("lucene.index.path"); - System.out.println("---index地址----" + luceneDir); - index = FSDirectory.open(Paths.get(luceneDir)); - // 初始化 Lucene 索引 - Analyzer analyzer = new IKAnalyzer(); - IndexWriterConfig config = new IndexWriterConfig(analyzer); - indexWriter = new IndexWriter(index, config); - } - - - @Override - protected void append(ILoggingEvent event) { - String message = event.getFormattedMessage(); - Map mdcPropertyMap = event.getMDCPropertyMap(); - Document doc = new Document(); - long timeStamp = event.getTimeStamp(); - // 获取本机的IP地址 - String ipAddress = "-"; - try { - ipAddress = InetAddress.getLocalHost().getHostAddress(); - } catch (UnknownHostException e) { - throw new RuntimeException(e); - } - String formattedDateTime = DateUtil.format(new java.util.Date(timeStamp), "yyyy-MM-dd HH:mm:ss.SSS"); - doc.add(new LongPoint(LogMessageConstant.FIELD_SORT_NAME, timeStamp)); - doc.add(new NumericDocValuesField(LogMessageConstant.FIELD_SORT_NAME, timeStamp)); - doc.add(new StringField(LogMessageConstant.FIELD_LEVEL, event.getLevel().toString(), Field.Store.YES)); - doc.add(new StringField(LogMessageConstant.FIELD_TIMESTAMP, formattedDateTime, Field.Store.YES)); - doc.add(new StoredField(LogMessageConstant.FIELD_CLASS_NAME, event.getLoggerName())); - doc.add(new StoredField(LogMessageConstant.FIELD_IP, ipAddress)); - doc.add(new StoredField(LogMessageConstant.FIELD_THREAD, event.getThreadName())); - if (ObjectUtil.isNotEmpty(mdcPropertyMap) && ObjectUtil.isNotEmpty(mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID))) { - String traceId = mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID); - doc.add(new StringField(LogMessageConstant.FIELD_TRACEID, traceId, Field.Store.YES)); - doc.add(new StringField(LogMessageConstant.FIELD_LABEL, ObjectUtil.isNotEmpty(mdcPropertyMap.get("tag_name")) - ? mdcPropertyMap.get("tag_name") : "-", Field.Store.YES)); - } - doc.add(new TextField(LogMessageConstant.FIELD_MESSAGE, message, Field.Store.YES)); - try { - indexWriter.addDocument(doc); - indexWriter.commit(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - super.stop(); - try { - indexWriter.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} +//package org.nl.config.lucene; +///** +// * @author ldjun +// * @version 1.0 +// * @date 2023年08月24日 13:00 +// * @desc desc +// */ +// +//import ch.qos.logback.classic.spi.ILoggingEvent; +//import ch.qos.logback.core.AppenderBase; +//import cn.hutool.core.date.DateUtil; +//import cn.hutool.core.util.ObjectUtil; +//import org.apache.lucene.analysis.Analyzer; +//import org.apache.lucene.document.*; +//import org.apache.lucene.index.IndexWriter; +//import org.apache.lucene.index.IndexWriterConfig; +//import org.apache.lucene.store.Directory; +//import org.apache.lucene.store.FSDirectory; +//import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; +//import org.springframework.core.io.ClassPathResource; +//import org.springframework.core.io.Resource; +//import org.wltea.analyzer.lucene.IKAnalyzer; +// +//import java.io.IOException; +//import java.net.InetAddress; +//import java.net.UnknownHostException; +//import java.nio.file.Paths; +//import java.util.Map; +//import java.util.Properties; +//import java.util.regex.Matcher; +//import java.util.regex.Pattern; +// +//public class LuceneAppender extends AppenderBase { +// +// private static Directory index; +// public static IndexWriter indexWriter; +// +// +// @Override +// public void start() { +// super.start(); +// try { +// init(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// public static void init() throws IOException { +// Resource resource = new ClassPathResource("config/application.yml"); +// YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean(); +// yamlPropertiesFactoryBean.setResources(resource); +// Properties properties = yamlPropertiesFactoryBean.getObject(); +// // 获取配置值 +// String luceneDir = properties.getProperty("lucene.index.path"); +// System.out.println("---index地址----" + luceneDir); +// index = FSDirectory.open(Paths.get(luceneDir)); +// // 初始化 Lucene 索引 +// Analyzer analyzer = new IKAnalyzer(); +// IndexWriterConfig config = new IndexWriterConfig(analyzer); +// indexWriter = new IndexWriter(index, config); +// } +// +// +// @Override +// protected void append(ILoggingEvent event) { +// String message = event.getFormattedMessage(); +// Map mdcPropertyMap = event.getMDCPropertyMap(); +// Document doc = new Document(); +// long timeStamp = event.getTimeStamp(); +// // 获取本机的IP地址 +// String ipAddress = "-"; +// try { +// ipAddress = InetAddress.getLocalHost().getHostAddress(); +// } catch (UnknownHostException e) { +// throw new RuntimeException(e); +// } +// String formattedDateTime = DateUtil.format(new java.util.Date(timeStamp), "yyyy-MM-dd HH:mm:ss.SSS"); +// doc.add(new LongPoint(LogMessageConstant.FIELD_SORT_NAME, timeStamp)); +// doc.add(new NumericDocValuesField(LogMessageConstant.FIELD_SORT_NAME, timeStamp)); +// doc.add(new StringField(LogMessageConstant.FIELD_LEVEL, event.getLevel().toString(), Field.Store.YES)); +// doc.add(new StringField(LogMessageConstant.FIELD_TIMESTAMP, formattedDateTime, Field.Store.YES)); +// doc.add(new StoredField(LogMessageConstant.FIELD_CLASS_NAME, event.getLoggerName())); +// doc.add(new StoredField(LogMessageConstant.FIELD_IP, ipAddress)); +// doc.add(new StoredField(LogMessageConstant.FIELD_THREAD, event.getThreadName())); +// if (ObjectUtil.isNotEmpty(mdcPropertyMap) && ObjectUtil.isNotEmpty(mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID))) { +// String traceId = mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID); +// doc.add(new StringField(LogMessageConstant.FIELD_TRACEID, traceId, Field.Store.YES)); +// doc.add(new StringField(LogMessageConstant.FIELD_LABEL, ObjectUtil.isNotEmpty(mdcPropertyMap.get("tag_name")) +// ? mdcPropertyMap.get("tag_name") : "-", Field.Store.YES)); +// } +// doc.add(new TextField(LogMessageConstant.FIELD_MESSAGE, message, Field.Store.YES)); +// try { +// indexWriter.addDocument(doc); +// indexWriter.commit(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// +// @Override +// public void stop() { +// super.stop(); +// try { +// indexWriter.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +//} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/config/lucene/Searcher.java b/nladmin-system/nlsso-server/src/main/java/org/nl/config/lucene/Searcher.java index f9f0352..fdb018a 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/config/lucene/Searcher.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/config/lucene/Searcher.java @@ -1,164 +1,164 @@ -package org.nl.config.lucene; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.document.Document; -import org.apache.lucene.index.DirectoryReader; -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.Term; -import org.apache.lucene.queryparser.classic.QueryParser; -import org.apache.lucene.search.*; -import org.apache.lucene.store.Directory; -import org.apache.lucene.store.FSDirectory; -import org.apache.lucene.util.BytesRef; -import org.wltea.analyzer.lucene.IKAnalyzer; - -import java.io.IOException; -import java.nio.file.Paths; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.temporal.ChronoUnit; -import java.util.*; - -/** - * lucene查询器 - */ -@Slf4j -public class Searcher { - - public static Map search(String indexDir, JSONObject whereJson) throws Exception { - //获取要查询的路径,也就是索引所在的位置 - Directory dir = FSDirectory.open(Paths.get(indexDir)); - IndexReader reader = DirectoryReader.open(dir); - //构建IndexSearcher - IndexSearcher searcher = new IndexSearcher(reader); - //标准分词器,会自动去掉空格啊,is a the等单词 - Analyzer analyzer = new IKAnalyzer(true); - - // 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数: - // 每页条数 - int pageSize = Integer.parseInt(whereJson.get("size").toString()); - // 当前页码 - int pageNum = Integer.parseInt(whereJson.get("page").toString()) - 1; - // 当前页的起始条数 - int start = pageNum * pageSize; - // 当前页的结束条数(不能包含) - int end = start + pageSize; - // 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序 - Sort sort = new Sort(new SortField(LogMessageConstant.FIELD_SORT_NAME, SortField.Type.LONG, true)); - - TopDocs docs = null; - BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder(); - Calendar calendar = Calendar.getInstance(); - calendar.set(1970, 0, 1); - //时间范围查询 - JSONArray createTime = whereJson.getJSONArray("createTime"); - String startDate = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss.SSS"); - String endDate = DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss.SSS"); - - if (createTime != null) { - startDate = createTime.getString(0); - endDate = createTime.getString(1); - } - // 字段之间的与或非关系,MUST表示and,MUST_NOT表示not,SHOULD表示or,有几个fields就必须有几个clauses - TermRangeQuery termRangeQuery = new TermRangeQuery("timestamp", new BytesRef(startDate), - new BytesRef(endDate), true, true); - booleanQueryBuilder.add(termRangeQuery, BooleanClause.Occur.MUST); - if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_MESSAGE))) { - //查询解析器 - QueryParser queryParser = new QueryParser("message", analyzer); - Query query = queryParser.parse("message:" + whereJson.getString("message") + "~"); - booleanQueryBuilder.add(query, BooleanClause.Occur.MUST); - } - if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_TRACEID))) { - //查询解析器 - TermQuery termQuery = new TermQuery(new Term(LogMessageConstant.FIELD_TRACEID, - whereJson.getString(LogMessageConstant.FIELD_TRACEID).trim())); - booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); - } - if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_LABEL))) { - //查询解析器 - TermQuery termQuery = new TermQuery(new Term(LogMessageConstant.FIELD_LABEL, - whereJson.getString(LogMessageConstant.FIELD_LABEL).trim())); - booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); - } - if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_LEVEL))) { - //查询解析器 - TermQuery termQuery = new TermQuery(new Term(LogMessageConstant.FIELD_LEVEL, - whereJson.get(LogMessageConstant.FIELD_LEVEL).toString())); - booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); - } - // 使用实体接收 - List list = new ArrayList<>(); - TopFieldCollector collector = TopFieldCollector.create(sort, 20000, 0); - searcher.search(booleanQueryBuilder.build(), collector); - docs = collector.topDocs(pageNum*pageSize, pageSize); - ScoreDoc[] scoreDocs = docs.scoreDocs; - int totalSize = collector.getTotalHits(); - - for (ScoreDoc scoreDoc : scoreDocs) { - Document doc = reader.document(scoreDoc.doc); - String logInfo = LogMessageConstant.COLOR_RED + doc.get(LogMessageConstant.FIELD_TIMESTAMP) + - LogMessageConstant.COLOR_RESET + " - " + - LogMessageConstant.COLOR_BLUE + doc.get(LogMessageConstant.FIELD_IP) + - LogMessageConstant.COLOR_RESET + " - " + - LogMessageConstant.COLOR_GREEN + "[" + doc.get(LogMessageConstant.FIELD_THREAD) + "]" + - LogMessageConstant.COLOR_RESET + " - " + - LogMessageConstant.COLOR_BLACK + doc.get(LogMessageConstant.FIELD_LEVEL) + - LogMessageConstant.COLOR_RESET + " - " + - LogMessageConstant.COLOR_MAGENTA + doc.get(LogMessageConstant.FIELD_CLASS_NAME) + - LogMessageConstant.COLOR_RESET + " - " + - LogMessageConstant.COLOR_GREEN + "<" + doc.get(LogMessageConstant.FIELD_TRACEID) + ">" + - LogMessageConstant.COLOR_RESET + " - " + - LogMessageConstant.COLOR_BLACK + highlightKeyword(doc.get(LogMessageConstant.FIELD_MESSAGE), whereJson.getString("message")); - list.add(logInfo); - } - reader.close(); - JSONObject jo = new JSONObject(); - jo.put("content", list); - jo.put("totalElements", totalSize); - return jo; - } - - public static String highlightKeyword(String text, String keyword) { - if (ObjectUtil.isEmpty(keyword)) { - return text; - } - - int startIndex = text.indexOf(keyword); - if (startIndex != -1) { - int endIndex = startIndex + keyword.length(); - String beforeKeyword = text.substring(0, startIndex); - String afterKeyword = text.substring(endIndex); - String highlightedKeyword = LogMessageConstant.BACKGROUND_YELLOW + keyword + LogMessageConstant.COLOR_RESET - + LogMessageConstant.COLOR_BLACK; - return beforeKeyword + highlightedKeyword + afterKeyword; - } else { - return text; - } - } - - public static void main(String[] args) throws IOException, ParseException { - // 获取当前时间 - LocalDateTime now = LocalDateTime.now(); - // 减去七天 - LocalDateTime sevenDaysAgo = now.minus(7, ChronoUnit.DAYS); - // 转换为 Date 类型 - Date sevenDaysAgoDate = Date.from(sevenDaysAgo.atZone(ZoneId.systemDefault()).toInstant()); - // 获取时间戳 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); - Date date = dateFormat.parse(String.valueOf(sevenDaysAgo)); - long timestamp = date.getTime(); - System.out.println(now); - System.out.println(sevenDaysAgo); - System.out.println(sevenDaysAgoDate); - System.out.println(timestamp); - } -} +//package org.nl.config.lucene; +// +//import cn.hutool.core.date.DateTime; +//import cn.hutool.core.date.DateUtil; +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONArray; +//import com.alibaba.fastjson.JSONObject; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.lucene.analysis.Analyzer; +//import org.apache.lucene.document.Document; +//import org.apache.lucene.index.DirectoryReader; +//import org.apache.lucene.index.IndexReader; +//import org.apache.lucene.index.Term; +//import org.apache.lucene.queryparser.classic.QueryParser; +//import org.apache.lucene.search.*; +//import org.apache.lucene.store.Directory; +//import org.apache.lucene.store.FSDirectory; +//import org.apache.lucene.util.BytesRef; +//import org.wltea.analyzer.lucene.IKAnalyzer; +// +//import java.io.IOException; +//import java.nio.file.Paths; +//import java.text.ParseException; +//import java.text.SimpleDateFormat; +//import java.time.LocalDateTime; +//import java.time.ZoneId; +//import java.time.temporal.ChronoUnit; +//import java.util.*; +// +///** +// * lucene查询器 +// */ +//@Slf4j +//public class Searcher { +// +// public static Map search(String indexDir, JSONObject whereJson) throws Exception { +// //获取要查询的路径,也就是索引所在的位置 +// Directory dir = FSDirectory.open(Paths.get(indexDir)); +// IndexReader reader = DirectoryReader.open(dir); +// //构建IndexSearcher +// IndexSearcher searcher = new IndexSearcher(reader); +// //标准分词器,会自动去掉空格啊,is a the等单词 +// Analyzer analyzer = new IKAnalyzer(true); +// +// // 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数: +// // 每页条数 +// int pageSize = Integer.parseInt(whereJson.get("size").toString()); +// // 当前页码 +// int pageNum = Integer.parseInt(whereJson.get("page").toString()) - 1; +// // 当前页的起始条数 +// int start = pageNum * pageSize; +// // 当前页的结束条数(不能包含) +// int end = start + pageSize; +// // 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序 +// Sort sort = new Sort(new SortField(LogMessageConstant.FIELD_SORT_NAME, SortField.Type.LONG, true)); +// +// TopDocs docs = null; +// BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder(); +// Calendar calendar = Calendar.getInstance(); +// calendar.set(1970, 0, 1); +// //时间范围查询 +// JSONArray createTime = whereJson.getJSONArray("createTime"); +// String startDate = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss.SSS"); +// String endDate = DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss.SSS"); +// +// if (createTime != null) { +// startDate = createTime.getString(0); +// endDate = createTime.getString(1); +// } +// // 字段之间的与或非关系,MUST表示and,MUST_NOT表示not,SHOULD表示or,有几个fields就必须有几个clauses +// TermRangeQuery termRangeQuery = new TermRangeQuery("timestamp", new BytesRef(startDate), +// new BytesRef(endDate), true, true); +// booleanQueryBuilder.add(termRangeQuery, BooleanClause.Occur.MUST); +// if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_MESSAGE))) { +// //查询解析器 +// QueryParser queryParser = new QueryParser("message", analyzer); +// Query query = queryParser.parse("message:" + whereJson.getString("message") + "~"); +// booleanQueryBuilder.add(query, BooleanClause.Occur.MUST); +// } +// if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_TRACEID))) { +// //查询解析器 +// TermQuery termQuery = new TermQuery(new Term(LogMessageConstant.FIELD_TRACEID, +// whereJson.getString(LogMessageConstant.FIELD_TRACEID).trim())); +// booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); +// } +// if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_LABEL))) { +// //查询解析器 +// TermQuery termQuery = new TermQuery(new Term(LogMessageConstant.FIELD_LABEL, +// whereJson.getString(LogMessageConstant.FIELD_LABEL).trim())); +// booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); +// } +// if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_LEVEL))) { +// //查询解析器 +// TermQuery termQuery = new TermQuery(new Term(LogMessageConstant.FIELD_LEVEL, +// whereJson.get(LogMessageConstant.FIELD_LEVEL).toString())); +// booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); +// } +// // 使用实体接收 +// List list = new ArrayList<>(); +// TopFieldCollector collector = TopFieldCollector.create(sort, 20000, 0); +// searcher.search(booleanQueryBuilder.build(), collector); +// docs = collector.topDocs(pageNum*pageSize, pageSize); +// ScoreDoc[] scoreDocs = docs.scoreDocs; +// int totalSize = collector.getTotalHits(); +// +// for (ScoreDoc scoreDoc : scoreDocs) { +// Document doc = reader.document(scoreDoc.doc); +// String logInfo = LogMessageConstant.COLOR_RED + doc.get(LogMessageConstant.FIELD_TIMESTAMP) + +// LogMessageConstant.COLOR_RESET + " - " + +// LogMessageConstant.COLOR_BLUE + doc.get(LogMessageConstant.FIELD_IP) + +// LogMessageConstant.COLOR_RESET + " - " + +// LogMessageConstant.COLOR_GREEN + "[" + doc.get(LogMessageConstant.FIELD_THREAD) + "]" + +// LogMessageConstant.COLOR_RESET + " - " + +// LogMessageConstant.COLOR_BLACK + doc.get(LogMessageConstant.FIELD_LEVEL) + +// LogMessageConstant.COLOR_RESET + " - " + +// LogMessageConstant.COLOR_MAGENTA + doc.get(LogMessageConstant.FIELD_CLASS_NAME) + +// LogMessageConstant.COLOR_RESET + " - " + +// LogMessageConstant.COLOR_GREEN + "<" + doc.get(LogMessageConstant.FIELD_TRACEID) + ">" + +// LogMessageConstant.COLOR_RESET + " - " + +// LogMessageConstant.COLOR_BLACK + highlightKeyword(doc.get(LogMessageConstant.FIELD_MESSAGE), whereJson.getString("message")); +// list.add(logInfo); +// } +// reader.close(); +// JSONObject jo = new JSONObject(); +// jo.put("content", list); +// jo.put("totalElements", totalSize); +// return jo; +// } +// +// public static String highlightKeyword(String text, String keyword) { +// if (ObjectUtil.isEmpty(keyword)) { +// return text; +// } +// +// int startIndex = text.indexOf(keyword); +// if (startIndex != -1) { +// int endIndex = startIndex + keyword.length(); +// String beforeKeyword = text.substring(0, startIndex); +// String afterKeyword = text.substring(endIndex); +// String highlightedKeyword = LogMessageConstant.BACKGROUND_YELLOW + keyword + LogMessageConstant.COLOR_RESET +// + LogMessageConstant.COLOR_BLACK; +// return beforeKeyword + highlightedKeyword + afterKeyword; +// } else { +// return text; +// } +// } +// +// public static void main(String[] args) throws IOException, ParseException { +// // 获取当前时间 +// LocalDateTime now = LocalDateTime.now(); +// // 减去七天 +// LocalDateTime sevenDaysAgo = now.minus(7, ChronoUnit.DAYS); +// // 转换为 Date 类型 +// Date sevenDaysAgoDate = Date.from(sevenDaysAgo.atZone(ZoneId.systemDefault()).toInstant()); +// // 获取时间戳 +// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); +// Date date = dateFormat.parse(String.valueOf(sevenDaysAgo)); +// long timestamp = date.getTime(); +// System.out.println(now); +// System.out.println(sevenDaysAgo); +// System.out.println(sevenDaysAgoDate); +// System.out.println(timestamp); +// } +//} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/lucence/LuceneController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/lucence/LuceneController.java index dd38082..8d102eb 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/lucence/LuceneController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/lucence/LuceneController.java @@ -1,18 +1,15 @@ package org.nl.system.controller.lucence; import com.alibaba.fastjson.JSONObject; - - -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.common.logging.annotation.Log; -import org.nl.system.service.lucene.LuceneService; -import org.springframework.data.domain.Pageable; +import org.nl.system.service.lucene.EsLogService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** *

@@ -23,20 +20,20 @@ import java.util.Map; * @since 2023-11-16 */ @RestController -@RequiredArgsConstructor @RequestMapping("/api/lucene") @Slf4j public class LuceneController { - private final LuceneService luceneService; + @Autowired + private EsLogService esLogService; @PostMapping("/getAll") public ResponseEntity get(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(luceneService.getAll(whereJson), HttpStatus.OK); + return new ResponseEntity<>(esLogService.page(whereJson), HttpStatus.OK); } @PostMapping("/getTagName") public ResponseEntity getTagName() { - return new ResponseEntity<>(luceneService.getTagName(), HttpStatus.OK); + return new ResponseEntity<>(esLogService.getTagName(), HttpStatus.OK); } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/EsLogService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/EsLogService.java new file mode 100644 index 0000000..56bc6e2 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/EsLogService.java @@ -0,0 +1,22 @@ +package org.nl.system.service.lucene; + +import com.alibaba.fastjson.JSONObject; +import org.nl.system.service.lucene.dto.EsLogDto; +import org.springframework.data.domain.Page; + +import java.util.List; + +/** + * @Author: lyd + * @Date: 2025/5/28 + */ +public interface EsLogService { + Page page(JSONObject whereJson); + + /** + * 获取枚举的标签名称 + * + * @return + */ + List getTagName(); +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/LuceneService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/LuceneService.java index c2e4b0f..ccb0a15 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/LuceneService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/LuceneService.java @@ -1,31 +1,31 @@ -package org.nl.system.service.lucene; - -import com.alibaba.fastjson.JSONObject; - -import java.util.List; -import java.util.Map; - -/** - *

- * 、 - *

- * - * @author generator - * @since 2023-11-16 - */ -public interface LuceneService { - - /** - * 获取数据分页 - * - * @param whereJson 条件 - * @return Map - */ - Map getAll(JSONObject whereJson); - - /** - * 获取枚举的标签名称 - * @return - */ - List getTagName(); -} +//package org.nl.system.service.lucene; +// +//import com.alibaba.fastjson.JSONObject; +// +//import java.util.List; +//import java.util.Map; +// +///** +// *

+// * 、 +// *

+// * +// * @author generator +// * @since 2023-11-16 +// */ +//public interface LuceneService { +// +// /** +// * 获取数据分页 +// * +// * @param whereJson 条件 +// * @return Map +// */ +// Map getAll(JSONObject whereJson); +// +// /** +// * 获取枚举的标签名称 +// * @return +// */ +// List getTagName(); +//} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dao/EsLogRepository.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dao/EsLogRepository.java new file mode 100644 index 0000000..7efb825 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dao/EsLogRepository.java @@ -0,0 +1,11 @@ +package org.nl.system.service.lucene.dao; + +import org.nl.system.service.lucene.dto.EsLogDto; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +/** + * @Author: lyd + * @Date: 2025/5/28 + */ +public interface EsLogRepository extends ElasticsearchRepository { +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dto/EsLogDto.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dto/EsLogDto.java new file mode 100644 index 0000000..41bc822 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dto/EsLogDto.java @@ -0,0 +1,127 @@ +package org.nl.system.service.lucene.dto; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +import java.util.Date; + +/** + * @Author: lyd + * @Date: 2025/5/28 + */ +@Document(indexName = "nl_lms", type = "sever") +public class EsLogDto { + @Id + private String id; + + @Field(type = FieldType.Date) + private Date time; + + @Field(type = FieldType.Text) + private String message; + + @Field(type = FieldType.Ip) + private String host; + @Field(type = FieldType.Ip) + private String currIp; + + @Field(type = FieldType.Keyword) + private String tag; + @Field(type = FieldType.Keyword) + private String severity; + + @Field(type = FieldType.Keyword) + private String thread; + + @Field(type = FieldType.Keyword) + private String logger; + @Field(type = FieldType.Keyword) + private String tlogTraceId; + + // 必须添加空构造器 + public EsLogDto() {} + + // getters/setters + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getTime() { + return time; + } + + public void setTime(Date time) { + this.time = time; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public String getThread() { + return thread; + } + + public void setThread(String thread) { + this.thread = thread; + } + + public String getLogger() { + return logger; + } + + public void setLogger(String logger) { + this.logger = logger; + } + + public String getCurrIp() { + return currIp; + } + + public void setCurrIp(String currIp) { + this.currIp = currIp; + } + + public String getTlogTraceId() { + return tlogTraceId; + } + + public void setTlogTraceId(String tlogTraceId) { + this.tlogTraceId = tlogTraceId; + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dto/LuceneLogDto.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dto/LuceneLogDto.java index c2534f1..b8fe557 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dto/LuceneLogDto.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/dto/LuceneLogDto.java @@ -1,116 +1,116 @@ -package org.nl.system.service.lucene.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - *

- * 日志DTO - *

- * - * @author generator - * @since 2023-11-16 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class LuceneLogDto { - - /** - * 日志标识 - */ - private String log_uuid; - /** - * 日志类型 - */ - private String logType; - /** - * 设备编号 - */ - private String device_code; - /** - * 内容详情 - */ - private String content; - /** - * 任务编码 - */ - private String task_code; - /** - * 指令编码 - */ - private String instruct_code; - /** - * 任务标识 - */ - private String task_id; - /** - * 载具号 - */ - private String vehicle_code; - /** - * 备注 - */ - private String remark; - /** - * 日志类型 - */ - private String log_type; - /** - * 方法 - */ - private String method; - /** - * 请求参数 - */ - private String requestparam; - /** - * 响应参数 - */ - private String responseparam; - /** - * 请求地址 - */ - private String requesturl; - /** - * 状态码 - */ - private String status_code; - /** - * 是否删除 1:是;0:否 - */ - private String is_delete; - /** - * 创建者 - */ - private String create_by; - /** - * 创建时间 YYYY-MM-DD hh:mm:ss - */ - private String create_time; - /** - * 修改者 - */ - private String update_by; - /** - * 修改时间 - */ - private String update_time; - - public LuceneLogDto (final String opc_server_code,final String opc_plc_code, - final String device_code,final String to_home,final int last_home, - final int home) { - super (); - this.device_code = device_code; - this.content = "信号" - + opc_server_code + "." - + opc_plc_code + "." - + device_code + "." - + to_home + "变更从" - + last_home + "->" - + home; - } -} +//package org.nl.system.service.lucene.dto; +// +//import lombok.AllArgsConstructor; +//import lombok.Builder; +//import lombok.Data; +//import lombok.NoArgsConstructor; +// +///** +// *

+// * 日志DTO +// *

+// * +// * @author generator +// * @since 2023-11-16 +// */ +//@Data +//@Builder +//@NoArgsConstructor +//@AllArgsConstructor +//public class LuceneLogDto { +// +// /** +// * 日志标识 +// */ +// private String log_uuid; +// /** +// * 日志类型 +// */ +// private String logType; +// /** +// * 设备编号 +// */ +// private String device_code; +// /** +// * 内容详情 +// */ +// private String content; +// /** +// * 任务编码 +// */ +// private String task_code; +// /** +// * 指令编码 +// */ +// private String instruct_code; +// /** +// * 任务标识 +// */ +// private String task_id; +// /** +// * 载具号 +// */ +// private String vehicle_code; +// /** +// * 备注 +// */ +// private String remark; +// /** +// * 日志类型 +// */ +// private String log_type; +// /** +// * 方法 +// */ +// private String method; +// /** +// * 请求参数 +// */ +// private String requestparam; +// /** +// * 响应参数 +// */ +// private String responseparam; +// /** +// * 请求地址 +// */ +// private String requesturl; +// /** +// * 状态码 +// */ +// private String status_code; +// /** +// * 是否删除 1:是;0:否 +// */ +// private String is_delete; +// /** +// * 创建者 +// */ +// private String create_by; +// /** +// * 创建时间 YYYY-MM-DD hh:mm:ss +// */ +// private String create_time; +// /** +// * 修改者 +// */ +// private String update_by; +// /** +// * 修改时间 +// */ +// private String update_time; +// +// public LuceneLogDto (final String opc_server_code,final String opc_plc_code, +// final String device_code,final String to_home,final int last_home, +// final int home) { +// super (); +// this.device_code = device_code; +// this.content = "信号" +// + opc_server_code + "." +// + opc_plc_code + "." +// + device_code + "." +// + to_home + "变更从" +// + last_home + "->" +// + home; +// } +//} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/impl/EsLogServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/impl/EsLogServiceImpl.java new file mode 100644 index 0000000..b5ce9e2 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/impl/EsLogServiceImpl.java @@ -0,0 +1,106 @@ +package org.nl.system.service.lucene.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import org.elasticsearch.common.unit.Fuzziness; +import org.elasticsearch.index.query.*; +import org.nl.config.lucene.TagNameEnum; +import org.nl.system.service.lucene.EsLogService; +import org.nl.system.service.lucene.dao.EsLogRepository; +import org.nl.system.service.lucene.dto.EsLogDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Date: 2025/5/28 + */ +@Service +public class EsLogServiceImpl implements EsLogService { + @Resource + private EsLogRepository esLogRepository; + + @Override + public Page page(JSONObject whereJson) { + // 分页参数处理 + int page = whereJson.getInteger("page") != null ? whereJson.getInteger("page") - 1 : 0; + int size = whereJson.getInteger("size") != null ? whereJson.getInteger("size") : 10; + + // 创建分页和排序(按时间倒序) + Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "time")); + + // 构建动态查询条件 + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + + // 1. message 模糊查询 (使用wildcard实现前后模糊匹配) + if (StringUtils.hasText(whereJson.getString("message"))) { + String message = whereJson.getString("message"); + // 模糊查询条件 + if (message.contains(" ")) { + // 短语:使用邻近查询 (slop 默认值设为 0 或自定义) + MatchPhraseQueryBuilder phraseQuery = QueryBuilders.matchPhraseQuery("message", message) + .slop(0); + boolQuery.must(phraseQuery); + } else { + // 单词:使用模糊查询 (默认编辑距离为 AUTO) + FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("message", message) + .fuzziness(Fuzziness.AUTO); + boolQuery.must(fuzzyQuery); + } + } + + // 2. tlogTraceId 精确查询 + if (StringUtils.hasText(whereJson.getString("tlogTraceId"))) { + String traceId = whereJson.getString("tlogTraceId").trim(); + boolQuery.must(QueryBuilders.termQuery("tlogTraceId.keyword", traceId)); + } + + // 3. level/severity 精确查询 (假设ES中字段名为"severity") + if (StringUtils.hasText(whereJson.getString("level"))) { + String level = whereJson.getString("level").trim(); + boolQuery.must(QueryBuilders.termQuery("severity.keyword", level)); + } + + // 4. tag查询 + if (ObjectUtil.isNotEmpty(whereJson.getString("label")) + && !"-".equals(whereJson.getString("label"))) { + String label = whereJson.getString("label"); + boolQuery.must(QueryBuilders.termQuery("tag.keyword", label)); + } + // 5、时间范围查找 + if (ObjectUtil.isNotEmpty(whereJson.getString("startTime")) + && ObjectUtil.isNotEmpty(whereJson.getString("endTime"))) { + String startTime = whereJson.getString("startTime"); + String endTime = whereJson.getString("endTime"); + // 前端传来的数据:startTime -> 2025-05-27T16:00:00.000Z,endTime -> 2025-05-29T16:00:00.000Z + // es的time字段: 2025-05-29T14:55:47.498+08:00 + // todo: 通过时间范围查询 + boolQuery.must(QueryBuilders.rangeQuery("time") + .gte(startTime) + .lte(endTime) + .format("strict_date_optional_time")); + } + + // 如果没有添加任何条件,则使用matchAllQuery + QueryBuilder finalQuery = boolQuery.hasClauses() ? boolQuery : QueryBuilders.matchAllQuery(); + + // 执行查询 + return esLogRepository.search(finalQuery, pageable); + } + + @Override + public List getTagName() { + return Arrays.stream(TagNameEnum.values()).map(TagNameEnum::getTag).collect(Collectors.toList()); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/impl/LuceneServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/impl/LuceneServiceImpl.java index d10ae06..aed695c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/impl/LuceneServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/lucene/impl/LuceneServiceImpl.java @@ -1,60 +1,60 @@ -package org.nl.system.service.lucene.impl; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.config.language.LangProcess; -import org.nl.config.lucene.Searcher; -import org.nl.config.lucene.TagNameEnum; -import org.nl.system.service.lucene.LuceneService; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - *

- * 、 - *

- * - * @author generator - * @since 2023-11-16 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class LuceneServiceImpl implements LuceneService { - - /** - * 日志索引目录 - */ - @Value("${lucene.index.path}") - private String luceneUrl; - - @Override - public Map getAll(JSONObject whereJson) { - JSONObject jo = new JSONObject(); - try { - JSONObject jsonObject = (JSONObject) Searcher.search(luceneUrl, whereJson); - JSONArray array = jsonObject.getJSONArray("content"); - int totalElements = Integer.parseInt(jsonObject.get("totalElements").toString()); - jo.put("content", array); - jo.put("totalElements", totalElements); - } catch (Exception e) { - log.error("索引查询为空", e); - throw new NullPointerException(LangProcess.msg("error_NullPoint")); - } - - return jo; - } - - @Override - public List getTagName() { - return Arrays.stream(TagNameEnum.values()).map(TagNameEnum::getTag).collect(Collectors.toList()); - } - -} +//package org.nl.system.service.lucene.impl; +// +//import com.alibaba.fastjson.JSONArray; +//import com.alibaba.fastjson.JSONObject; +//import lombok.RequiredArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.nl.config.language.LangProcess; +//import org.nl.config.lucene.Searcher; +//import org.nl.config.lucene.TagNameEnum; +//import org.nl.system.service.lucene.LuceneService; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Service; +// +//import java.util.Arrays; +//import java.util.List; +//import java.util.Map; +//import java.util.stream.Collectors; +// +///** +// *

+// * 、 +// *

+// * +// * @author generator +// * @since 2023-11-16 +// */ +//@Service +//@RequiredArgsConstructor +//@Slf4j +//public class LuceneServiceImpl implements LuceneService { +// +// /** +// * 日志索引目录 +// */ +// @Value("${lucene.index.path}") +// private String luceneUrl; +// +// @Override +// public Map getAll(JSONObject whereJson) { +// JSONObject jo = new JSONObject(); +// try { +// JSONObject jsonObject = (JSONObject) Searcher.search(luceneUrl, whereJson); +// JSONArray array = jsonObject.getJSONArray("content"); +// int totalElements = Integer.parseInt(jsonObject.get("totalElements").toString()); +// jo.put("content", array); +// jo.put("totalElements", totalElements); +// } catch (Exception e) { +// log.error("索引查询为空", e); +// throw new NullPointerException(LangProcess.msg("error_NullPoint")); +// } +// +// return jo; +// } +// +// @Override +// public List getTagName() { +// return Arrays.stream(TagNameEnum.values()).map(TagNameEnum::getTag).collect(Collectors.toList()); +// } +// +//} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoClearLuceneData.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoClearLuceneData.java index c4c0c43..85abaf7 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoClearLuceneData.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoClearLuceneData.java @@ -1,46 +1,46 @@ -package org.nl.system.service.quartz.task; - -import lombok.extern.slf4j.Slf4j; -import org.apache.lucene.document.LongPoint; -import org.apache.lucene.index.IndexWriter; -import org.apache.lucene.search.Query; -import org.nl.config.lucene.LuceneAppender; -import org.nl.system.service.param.ISysParamService; -import org.nl.system.service.param.dao.Param; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.Date; - -/** - * @Author: lyd - * @Description: 自动删除lucene日志 - * @Date: 2023/10/26 - */ -@Slf4j -@Component -public class AutoClearLuceneData { - @Autowired - private ISysParamService paramService; - public void run() throws ParseException, IOException { - Param log_day = paramService.findByCode("log_day"); - IndexWriter writer = LuceneAppender.indexWriter; - // 获取当前时间 - LocalDateTime now = LocalDateTime.now(); - // 减去七天 - LocalDateTime sevenDaysAgo = now.minus(Long.parseLong(log_day.getValue()), ChronoUnit.DAYS); - // 获取时间戳 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); - Date date = dateFormat.parse(String.valueOf(sevenDaysAgo)); - // 获取Unix时间戳 - long unixTimestamp = date.getTime(); - Query query = LongPoint.newRangeQuery("time", 0L, unixTimestamp); - writer.deleteDocuments(query); - writer.commit(); - } -} +//package org.nl.system.service.quartz.task; +// +//import lombok.extern.slf4j.Slf4j; +//import org.apache.lucene.document.LongPoint; +//import org.apache.lucene.index.IndexWriter; +//import org.apache.lucene.search.Query; +//import org.nl.config.lucene.LuceneAppender; +//import org.nl.system.service.param.ISysParamService; +//import org.nl.system.service.param.dao.Param; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.text.ParseException; +//import java.text.SimpleDateFormat; +//import java.time.LocalDateTime; +//import java.time.temporal.ChronoUnit; +//import java.util.Date; +// +///** +// * @Author: lyd +// * @Description: 自动删除lucene日志 +// * @Date: 2023/10/26 +// */ +//@Slf4j +//@Component +//public class AutoClearLuceneData { +// @Autowired +// private ISysParamService paramService; +// public void run() throws ParseException, IOException { +// Param log_day = paramService.findByCode("log_day"); +// IndexWriter writer = LuceneAppender.indexWriter; +// // 获取当前时间 +// LocalDateTime now = LocalDateTime.now(); +// // 减去七天 +// LocalDateTime sevenDaysAgo = now.minus(Long.parseLong(log_day.getValue()), ChronoUnit.DAYS); +// // 获取时间戳 +// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); +// Date date = dateFormat.parse(String.valueOf(sevenDaysAgo)); +// // 获取Unix时间戳 +// long unixTimestamp = date.getTime(); +// Query query = LongPoint.newRangeQuery("time", 0L, unixTimestamp); +// writer.deleteDocuments(query); +// writer.commit(); +// } +//} diff --git a/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml b/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml index 90dbf9b..f637990 100644 --- a/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml +++ b/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml @@ -50,31 +50,31 @@ https://juejin.cn/post/6844903775631572999 - - - - INFO - ACCEPT - NEXT - - - - WARN - ACCEPT - NEXT - - - - ERROR - ACCEPT - DENY - - - - - - 512 - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -106,6 +106,10 @@ https://juejin.cn/post/6844903775631572999 127.0.0.1 true + + time + %d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} + severity %level @@ -132,28 +136,33 @@ https://juejin.cn/post/6844903775631572999 - + + + + + + - + - + - + - + - + @@ -222,7 +231,7 @@ https://juejin.cn/post/6844903775631572999 - + diff --git a/nladmin-ui/src/views/lucene/index.vue b/nladmin-ui/src/views/lucene/index.vue index e0fc4d8..3eccf5c 100644 --- a/nladmin-ui/src/views/lucene/index.vue +++ b/nladmin-ui/src/views/lucene/index.vue @@ -56,7 +56,6 @@
-
-
+ + + + + + +
+ {{ timestampToDate(log.time) }} - + {{ log.currIp === null ? '0.0.0.0' : log.currIp }} - + {{ log.severity }} - + {{ log.logger }} - + [{{ log.thread }}] - + {{ log.tlogTraceId === null ? '无链路id' : log.tlogTraceId }} - + {{ log.message }} +
+
+ + + 时间: + + + {{ timestampToDate(log.time) }} + + + + + 执行IP: + + + {{ log.currIp === null ? '0.0.0.0' : log.currIp }} + + + + + 日志级别: + + + {{ log.severity }} + + + + + 类名: + + + {{ log.logger }} + + + + + 线程名: + + + {{ log.thread }} + + + + + 链路标识: + + + {{ log.tlogTraceId === null ? '无链路id' : log.tlogTraceId }} + + + + + 日志信息: + + + {{ log.message }} + + +
@@ -145,6 +215,19 @@ export default { this.getTagList() }, methods: { + timestampToDate(timestamp) { + const date = new Date(timestamp) + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + const hours = String(date.getHours()).padStart(2, '0') + const minutes = String(date.getMinutes()).padStart(2, '0') + const seconds = String(date.getSeconds()).padStart(2, '0') + // 添加毫秒处理(强制3位数) + const milliseconds = String(date.getMilliseconds()).padStart(3, '0') + + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}` + }, handleSizeChange(val) { this.query.size = val this.queryData() @@ -164,13 +247,8 @@ export default { this.query.endTime = this.query.createTime[1] } luceneOperation.getLogData(this.query).then(res => { - this.logs = [] // 清空 - var ansi_up = new AnsiUp() - // 数据初始化 - for (const i in res.content) { - this.logs[i] = ansi_up.ansi_to_html(res.content[i]) - } - // this.logs = res.content + console.log(res) + this.logs = res.content this.query.total = res.totalElements }) }