rev:lucene

This commit is contained in:
2024-01-10 12:28:55 +08:00
parent ce6f38597c
commit 2e22fbee6e
38 changed files with 855 additions and 1330 deletions

View File

@@ -9,3 +9,5 @@
*/application-dev.yml
nlsso-server/src/main/java/org/nl/common/constant/
nlsso-server/src/main/java/org/nl/common/core/
/C:*
/D:*

View File

@@ -46,6 +46,11 @@
</dependency>
<!-- Lucence核心包 -->
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>tlog-all-spring-boot-starter</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>

View File

@@ -16,7 +16,7 @@ import org.nl.acs.instruction.service.InstructionService;
import org.nl.acs.instruction.service.impl.InstructionServiceImpl;
import org.nl.acs.log.service.DeviceExecuteLogService;
import org.nl.acs.opc.DeviceAppService;
import org.nl.system.service.lucene.LuceneExecuteLogService;
import org.nl.config.lucene.service.LuceneExecuteLogService;
import org.nl.system.service.param.ISysParamService;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.param.impl.SysParamServiceImpl;

View File

@@ -25,8 +25,8 @@ import org.nl.acs.route.service.RouteLineService;
import org.nl.acs.task.service.TaskService;
import org.nl.acs.task.service.dto.TaskDto;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.lucene.LuceneExecuteLogService;
import org.nl.system.service.lucene.dto.LuceneLogDto;
import org.nl.config.lucene.service.LuceneExecuteLogService;
import org.nl.config.lucene.service.dto.LuceneLogDto;
import org.openscada.opc.lib.da.Server;
import org.springframework.beans.factory.annotation.Autowired;
@@ -183,10 +183,9 @@ public class XgagvDeviceDriver extends AbstractOpcDeviceDriver implements Device
cancle_navigation = this.itemProtocol.getCancle_navigation();
drum_run_status = this.itemProtocol.getDrum_run_status();
stop = this.itemProtocol.getStop();
if (home_relocation != last_home_relocation) {
luceneExecuteLogService.deviceExecuteLog(
new LuceneLogDto(this.getDevice().getOpc_server_code(), this.getDevice().getOpc_plc_code(), this.device_code, ItemProtocol.to_home_relocation, this.last_home_relocation, this.home_relocation));
// luceneExecuteLogService.deviceExecuteLog(
// new LuceneLogDto(this.getDevice().getOpc_server_code(), this.getDevice().getOpc_plc_code(), this.device_code, ItemProtocol.to_home_relocation, this.last_home_relocation, this.home_relocation));
}
if (stop != last_stop) {

View File

@@ -25,7 +25,7 @@ import org.nl.acs.opc.DeviceAppService;
import org.nl.acs.route.service.RouteLineService;
import org.nl.acs.task.service.TaskService;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.lucene.LuceneExecuteLogService;
import org.nl.config.lucene.service.LuceneExecuteLogService;
import java.lang.reflect.Method;
import java.util.*;

View File

@@ -1,50 +0,0 @@
package org.nl.config.lucene;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.nio.charset.Charset;
public class DynamicLogAppender {
/**
* 通过传入的动态名字,动态设置appender
* @param dynamicName
* @return
*/
public RollingFileAppender getAppender(String oldLogPath,String dynamicName) {
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
RollingFileAppender appender = new RollingFileAppender();
//appender的name属性
appender.setName(dynamicName);
appender.setContext(context);
//设置文件名
appender.setFile(new File(oldLogPath, dynamicName + "\\" + DateUtil.format(new DateTime(),"yyyy-MM-dd")+".log").getAbsolutePath());
//设置日志文件输出格式
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(context);
encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.setCharset(Charset.forName("UTF-8"));
encoder.start();
//设置日志记录器的滚动策略
TimeBasedRollingPolicy policy = new TimeBasedRollingPolicy();
policy.setFileNamePattern(oldLogPath+dynamicName+".%d{yyyy-MM-dd}.log");
//设置父节点是appender
policy.setParent(appender);
policy.setContext(context);
policy.start();
//加入下面两个节点
appender.setRollingPolicy(policy);
appender.setEncoder(encoder);
appender.start();
return appender;
}
}

View File

@@ -1,46 +0,0 @@
package org.nl.config.lucene;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.rolling.RollingFileAppender;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
public class DynamicLogger {
/**
* 日志存储路径
*/
String logPath;
public DynamicLogger(String logPath) {
this.logPath = logPath;
}
/**
* 对外暴露日志对象:每次拿的对象从内存里拿,没有再构建
*/
private static Map<String,Logger> container = new HashMap<>();
public Logger getLogger(String dynamicName) {
Logger logger = container.get(dynamicName);
if(logger != null) {
return logger;
}
logger = build(dynamicName);
container.put(dynamicName,logger);
return logger;
}
/**
* 构建Logger对象给Logger指定appender
* @param dynamicName
* @return
*/
private Logger build(String dynamicName) {
RollingFileAppender runTaskAppender =new DynamicLogAppender().getAppender(this.logPath,dynamicName);
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger logger = context.getLogger(dynamicName);
logger.addAppender(runTaskAppender);
return logger;
}
}

View File

@@ -1,184 +0,0 @@
package org.nl.config.lucene;//package org.nl.config.lucene;
//
//import com.alibaba.fastjson.JSONObject;
//import org.apache.commons.io.FileUtils;
//import org.apache.lucene.analysis.Analyzer;
//import org.apache.lucene.document.Document;
//import org.apache.lucene.document.Field;
//import org.apache.lucene.document.TextField;
//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.annotation.Value;
//import org.wltea.analyzer.lucene.IKAnalyzer;
//
//import java.io.BufferedReader;
//import java.io.File;
//import java.io.FileReader;
//import java.io.IOException;
//import java.nio.file.Paths;
//import java.util.Set;
//
///**
// * lucene索引器
// */
//public class Indexer {
// /**
// * 写索引实例
// */
// private IndexWriter writer;
//
// public IndexWriter getWriter() {
// return writer;
// }
//
// /**
// * 构造方法实例化IndexWriter
// *
// * @param indexDir
// * @throws Exception
// */
// public Indexer(String indexDir) throws Exception {
// Directory dir = FSDirectory.open(Paths.get(indexDir));
// //标准分词器会自动去掉空格啊is a the等单词
//// Analyzer analyzer = new StandardAnalyzer();
// Analyzer analyzer = new IKAnalyzer();
// //将标准分词器配到写索引的配置中
// IndexWriterConfig config = new IndexWriterConfig(analyzer);
// //实例化写索引对象
// writer = new IndexWriter(dir, config);
// }
//
// /**
// * 索引指定目录下的所有文件
// *
// * @param dataDir
// * @return
// * @throws Exception
// */
// public int indexAll(String dataDir) throws Exception {
// // 获取该路径下的所有文件
// File[] files = new File(dataDir).listFiles();
// if (null != files) {
// for (File file : files) {
// //调用下面的indexFile方法对每个文件进行索引
// indexFile(file);
// }
// }
// //返回索引的文件数
//// return writer.numDocs();
// return writer.numRamDocs();
// }
//
// /**
// * 索引指定的文件
// *
// * @param file
// * @throws Exception
// */
// private void indexFile(File file) throws Exception {
// System.out.println("索引文件的路径:" + file.getCanonicalPath());
// //调用下面的getDocument方法获取该文件的document
// Document doc = getDocument(file);
// //添加索引文档
// //Document doc = json2Doc(jsonDoc);
//// Document doc = new Document();
//// doc.add(new TextField("content", jsonDoc, Field.Store.YES));
// Field fieldContent = new TextField("fieldContent", FileUtils.readFileToString(null, "UTF-8"), Field.Store.YES);
//
// //将doc添加到索引中
// writer.addDocument(doc);
// }
//
// /**
// * 获取文档,文档里再设置每个字段,就类似于数据库中的一行记录
// *
// * @param file
// * @return
// * @throws Exception
// */
// private Document getDocument(File file) throws Exception {
// Document doc = new Document();
// //开始添加字段
// //添加内容
// doc.add(new TextField("contents", new FileReader(file)));
// //添加文件名,并把这个字段存到索引文件里
// doc.add(new TextField("fileName", file.getName(), Field.Store.YES));
// //添加文件路径
// doc.add(new TextField("fullPath", file.getCanonicalPath(), Field.Store.YES));
// return doc;
// }
//
// public Document json2Doc(String strDoc) {
// Document doc = new Document();
// JSONObject jsonDoc = JSONObject.parseObject(strDoc);
// Set<String> keys = jsonDoc.keySet();
// for (String key : keys) {
// doc.add(new TextField(key, jsonDoc.getString(key), Field.Store.YES));
// }
// return doc;
// }
//
// public void addLogIndex(String msg) throws IOException {
// //步骤一创建Directory对象用于指定索引库的位置 RAMDirectory内存
// Directory directory = FSDirectory.open(new File("D:\\lucene\\index").toPath());
// //步骤二创建一个IndexWriter对象用于写索引
//// Analyzer analyzer = new StandardAnalyzer();
// IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(new IKAnalyzer(false)));
//// indexWriter.deleteAll();//清理所有索引库
//// IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(new StandardAnalyzer()));
// //记录索引开始时间
// long startTime = System.currentTimeMillis();
// //步骤三:读取磁盘中文件,对应每一个文件创建一个文档对象
// Document document = new Document();
//// document.add(new TextField("fieldContent", device_id, Field.Store.YES));
// document.add(new TextField("fieldContent", msg, Field.Store.YES));
// indexWriter.addDocument(document);
// //记录索引结束时间
// long endTime = System.currentTimeMillis();
// System.out.println("建立索引" + "共耗时" + (endTime - startTime) + "毫秒");
// indexWriter.commit();
// //步骤八:关闭资源
// indexWriter.close();
// System.out.println("建立索引成功-----关闭资源");
// }
//
// //系统的日志文件路径
// @Value("${logging.file.path}")
// private String logUrl;
//
// public static void main(String[] args) throws IOException {
// //步骤一创建Directory对象用于指定索引库的位置 RAMDirectory内存
// Directory directory = FSDirectory.open(new File("D:\\lucene\\index").toPath());
// //步骤二创建一个IndexWriter对象用于写索引
//// Analyzer analyzer = new StandardAnalyzer();
// IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(new IKAnalyzer(false)));
//
// indexWriter.deleteAll();//清理所有索引库
//// indexWriter=new IndexWriter(directory,new IndexWriterConfig(new StandardAnalyzer()));
// //记录索引开始时间
// long startTime = System.currentTimeMillis();
// //步骤三:读取磁盘中文件,对应每一个文件创建一个文档对象
// File file = new File("D:\\testlog");
// //步骤四:获取文件列表
// File[] files = file.listFiles();
// for (File item : files) {
// BufferedReader bufferedReader = new BufferedReader(new FileReader(item));
// String strLine = null;
// while (null != (strLine = bufferedReader.readLine())) {
// Document document = new Document();
//// document.add(new Field());
// document.add(new TextField("fieldContent", strLine, Field.Store.YES));
// indexWriter.addDocument(document);
// }
// }
// //记录索引结束时间
// long endTime = System.currentTimeMillis();
// System.out.println("建立索引" + "共耗时" + (endTime - startTime) + "毫秒");
// indexWriter.commit();
// //步骤八:关闭资源
// indexWriter.close();
// System.out.println("建立索引成功-----关闭资源");
// }
//}

View File

@@ -1,60 +0,0 @@
package org.nl.config.lucene;//package org.nl.config.lucene;
//
//import cn.hutool.core.date.DateUtil;
//import org.apache.lucene.index.CorruptIndexException;
//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.wltea.analyzer.lucene.IKAnalyzer;
//
//import java.io.File;
//import java.io.IOException;
//import java.text.ParseException;
//import java.text.SimpleDateFormat;
//import java.util.Date;
//
//public class LuceneIndexWriter {
// private static IndexWriter indexWriter;
//
// static {
// try {
// Directory directory = FSDirectory.open(new File(UrlConfig.luceneUrl).toPath());
// IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer());
// indexWriter = new IndexWriter(directory, config);
// } catch (Exception e) {
// e.printStackTrace();
// }
// /**当当前线程结束时自动关闭IndexWriter使用Runtime对象*/
// Runtime.getRuntime().addShutdownHook(new Thread(() -> {
// try {
// closeIndexWriter();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }));
// }
// /**在线程结束时自动关闭IndexWriter*/
// public static IndexWriter getIndexWriter() {
// return indexWriter;
// }
// /**关闭IndexWriter
// * @throws IOException
// * @throws CorruptIndexException */
// public static void closeIndexWriter() throws Exception {
// if(indexWriter != null) {
// indexWriter.close();
// }
// }
//
// public static void main(String[] args) throws IOException {
// indexWriter.deleteAll();
// }
//
// public static String getDate(String timeString) throws ParseException {
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");//时间格式
// Date date = sdf.parse(timeString);
// timeString = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss.SSS");//格式化后的时间
// return timeString;
// }
//}

View File

@@ -1,88 +0,0 @@
package org.nl.config.lucene;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
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.nl.acs.AcsConfig;
import org.nl.acs.auto.run.AbstractAutoRunnable;
import org.nl.system.service.param.ISysParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
@Slf4j
@Component
public class LuceneServiceAutoRun extends AbstractAutoRunnable {
@Autowired
private ISysParamService paramService;
public LuceneServiceAutoRun() {
}
@Override
public String getCode() {
return LuceneServiceAutoRun.class.getSimpleName();
}
@Override
public String getName() {
return "Lucene索引服务";
}
private static volatile IndexWriter indexWriter;
@Override
public void autoRun() throws IOException {
try {
String luceneUrl = paramService.findByCode(AcsConfig.LUCENEURL).getValue();
Directory directory = FSDirectory.open(new File(luceneUrl).toPath());
IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer());
indexWriter = new IndexWriter(directory, config);
} catch (Exception e) {
log.error("Lucene索引服务出现异常:{}", JSON.toJSONString(e));
if (ObjectUtil.isNotEmpty(indexWriter)) {
indexWriter.close();
}
}
}
/**在线程结束时会自动关闭IndexWriter*/
public static IndexWriter getIndexWriter() {
return indexWriter;
}
@Override
public void stop() {
super.after();
try {
indexWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
indexWriter.deleteAll();
}
public static String getDate(String timeString) throws ParseException {
//时间格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date date = sdf.parse(timeString);
//格式化后的时间
timeString = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss.SSS");
return timeString;
}
}

View File

@@ -1,146 +0,0 @@
package org.nl.config.lucene;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
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.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.BytesRef;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
/**
* lucene查询器
*/
@Slf4j
public class Searcher {
public static Map<String, Object> search(String indexDir, String ext,Map 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 StandardAnalyzer();
// Analyzer analyzer = new IKAnalyzer(false);
//查询解析器
// QueryParser queryParser = new QueryParser("fieldContent", analyzer);
//记录索引开始时间
long startTime = System.currentTimeMillis();
// 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数
// 每页条数
int pageSize = Integer.parseInt(whereJson.get("size").toString());
// 当前页码
int pageNum = Integer.parseInt(whereJson.get("page").toString());
// 当前页的起始条数
int start = pageNum * pageSize;
// 当前页的结束条数(不能包含)
int end = start + pageSize;
// 创建排序对象,需要排序字段SortField参数字段的名称、字段的类型、是否反转如果是false升序。true降序
Sort sort = new Sort(new SortField("logTime", SortField.Type.DOC,true));
TopDocs docs = null;
BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder();
//时间范围查询
String startDate = (String) whereJson.get("begin_time");
String endDate = (String) whereJson.get("end_time");
Calendar calendar=Calendar.getInstance();
calendar.set(1970, 0, 1);
if (startDate == null){
startDate = DateUtil.format(calendar.getTime(),"yyyy-MM-dd HH:mm:ss.SSS");
}else{
startDate = LuceneServiceAutoRun.getDate(startDate);
}
if (endDate == null){
endDate = DateUtil.format(new DateTime(),"yyyy-MM-dd HH:mm:ss.SSS");
} else {
endDate = LuceneServiceAutoRun.getDate(endDate);
}
TermRangeQuery termRangeQuery = new TermRangeQuery("logTime", new BytesRef(startDate), new BytesRef(endDate), true, true);
booleanQueryBuilder.add(termRangeQuery,BooleanClause.Occur.MUST);
if (whereJson.get("device_code") != null){
Query termQuery = new TermQuery(new Term("device_code", (String) whereJson.get("device_code")));
booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST);
}
if (whereJson.get("method") != null){
Query termQuery = new TermQuery(new Term("method", (String) whereJson.get("method")));
booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST);
}
if (whereJson.get("status_code") != null){
Query termQuery = new TermQuery(new Term("status_code", (String) whereJson.get("status_code")));
booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST);
}
if (whereJson.get("requestparam") != null){
WildcardQuery query = new WildcardQuery(new Term("requestparam", "*"+(String) whereJson.get("requestparam")+"*"));
booleanQueryBuilder.add(query,BooleanClause.Occur.MUST);
}
if (whereJson.get("responseparam") != null){
WildcardQuery query = new WildcardQuery(new Term("responseparam", "*"+(String) whereJson.get("responseparam")+"*"));
booleanQueryBuilder.add(query,BooleanClause.Occur.MUST);
}
if (whereJson.get("blurry") != null) {
WildcardQuery query = new WildcardQuery(new Term("fieldContent", "*"+(String) whereJson.get("blurry")+"*"));
booleanQueryBuilder.add(query, BooleanClause.Occur.MUST);
}
docs = searcher.search(booleanQueryBuilder.build(), end,sort);
//记录索引时间
long endTime = System.currentTimeMillis();
log.info("匹配{}共耗时{}毫秒",booleanQueryBuilder.build(),(endTime-startTime));
log.info("查询到{}条日志文件", docs.totalHits.value);
List<String> list = new ArrayList<>();
ScoreDoc[] scoreDocs = docs.scoreDocs;
if (end > docs.totalHits.value) {
end = (int) docs.totalHits.value;
}
JSONArray array = new JSONArray();
for (int i = start; i < end; i++) {
ScoreDoc scoreDoc = scoreDocs[i];
Document doc = reader.document(scoreDoc.doc);
JSONObject object = new JSONObject();
object.put("content",doc.get("fieldContent"));
object.put("device_code",doc.get("device_code"));
object.put("logTime",doc.get("logTime"));
object.put("method",doc.get("method"));
object.put("status_code",doc.get("status_code"));
object.put("requestparam",doc.get("requestparam"));
object.put("responseparam",doc.get("responseparam"));
if(doc.get("fieldContent") != null) {
array.add(object);
}
}
for(Object logDto:array){
log.info(logDto.toString());
}
reader.close();
JSONObject jo = new JSONObject();
jo.put("content", array);
jo.put("totalElements", docs.totalHits.value);
return jo;
}
public static void main(String[] args) {
String indexDir = "D:\\lucene\\index";
//查询这个字符串
String q = "07.832";
Map whereJson = null;
try {
search(indexDir, q,whereJson);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -1,23 +0,0 @@
package org.nl.config.lucene;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @deprecated 设置静态参数初始化
*/
@Configuration
public class StaticConfig {
/**
* 日志索引目录
*/
@Value("${lucene.index.path}")
private String luceneDir;
@Bean
public int initStatic() {
UrlConfig.setLuceneUrl(luceneDir);
return 0;
}
}

View File

@@ -1,13 +0,0 @@
package org.nl.config.lucene;
public class UrlConfig {
public static String luceneUrl;
public static String getLuceneUrl() {
return luceneUrl;
}
public static void setLuceneUrl(String luceneUrl) {
UrlConfig.luceneUrl = luceneUrl;
}
}

View File

@@ -0,0 +1,43 @@
package org.nl.config.lucene.config;
/**
* @author ldjun
* @version 1.0
* @date 2023年08月24日 13:00
* @desc desc
*/
import ch.qos.logback.classic.spi.ILoggingEvent;
import cn.hutool.core.util.IdUtil;
import com.yomahub.tlog.core.context.AspectLogContext;
import com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import java.util.Map;
public class AsyncLuceneAppender extends AspectLogbackAsyncAppender {
@Override
protected void append(ILoggingEvent event) {
String traceId = AspectLogContext.getLogValue();
if (StringUtils.isEmpty(traceId)){
traceId = IdUtil.nanoId()+"@";
AspectLogContext.putLogValue(traceId);
}else {
if (!traceId.contains("@")){
AspectLogContext.putLogValue(traceId+"@");
}
}
if (StringUtils.isNotEmpty(traceId)){
MDC.put("traceId",traceId);
Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
if (mdcPropertyMap.getClass().getName().contains("SynchronizedMap")){
mdcPropertyMap.put("traceId",traceId);
}
MDC.clear();
}
super.append(event);
}
}

View File

@@ -0,0 +1,80 @@
package org.nl.config.lucene.config;
/**
* @Author: lyd
* @Description: 定义lucene相关常量
* @Date: 2023/8/25
*/
public class LogMessageConstant {
/**
*
*/
public final static String SORT_NAME = "time";
/**
* 级别
*/
public final static String FIELD_LEVEL = "level";
/**
* 时间
*/
public final static String FIELD_TIMESTAMP = "timestamp";
/**
* 类的限定名
*/
public final static String FIELD_CLASS_NAME = "logger";
/**
* 线程名
*/
public final static String FIELD_THREAD = "thread";
/**
* 日志内容
*/
public final static String FIELD_MESSAGE = "message";
public final static String FIELD_TRACEID = "tlogTraceId";
// 定义颜色值
/**
* 文本颜色:黑色
*/
public final static String COLOR_BLACK = "\u001B[30m";
/**
* 文本颜色:红色
*/
public final static String COLOR_RED = "\u001B[31m";
/**
* 文本颜色:绿色
*/
public final static String COLOR_GREEN = "\u001B[32m";
/**
* 文本颜色:黄色
*/
public final static String COLOR_YELLOW = "\u001B[33m";
/**
* 文本颜色:蓝色
*/
public final static String COLOR_BLUE = "\u001B[34m";
/**
* 文本颜色:品红色
*/
public final static String COLOR_MAGENTA = "\u001B[35m";
/**
* 文本颜色:青色
*/
public final static String COLOR_CYAN = "\u001B[36m";
/**
* 文本颜色:白色
*/
public final static String COLOR_WHITE = "\u001B[37m";
/**
* 文本颜色重置
*/
public final static String COLOR_RESET = "\u001B[0m";
/**
* 背景颜色:黄色
*/
public final static String BACKGROUND_YELLOW = "\u001B[43m";
/**
* 索引路径
*/
public final static String INDEX_DIR = "D:\\lucene\\index";
}

View File

@@ -0,0 +1,133 @@
package org.nl.config.lucene.config;
/**
* @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.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.ttl.TransmittableThreadLocal;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericDocValuesField;
import org.apache.lucene.document.StringField;
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.nl.config.lucene.service.dto.LuceneLogDto;
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.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class LuceneAppender extends AppenderBase<ILoggingEvent> {
public static final TransmittableThreadLocal<String> traceIdTL = new TransmittableThreadLocal();
public LuceneProperties properties;
public static Directory index;
private List<LucenePropertyAndEncoder> encoders;
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();
String[] split = message.split("@");
LuceneLogDto luceneLogDto = JSONObject.parseObject(split[1], LuceneLogDto.class);
Document document = new Document();
try {
//向document对象中添加域。
Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
String traceId = mdcPropertyMap.get("traceId");
System.out.println("---追踪号---"+traceId);
if (ObjectUtil.isNotEmpty(traceId)) {
document.add(new StringField("trace_id", traceId, Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getDevice_code())) {
document.add(new StringField("device_code", luceneLogDto.getDevice_code(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getContent())) {
document.add(new StringField("fieldContent", luceneLogDto.getContent(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getMethod())) {
document.add(new StringField("method", luceneLogDto.getMethod(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getStatus_code())) {
document.add(new StringField("status_code", luceneLogDto.getStatus_code(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getRequestparam())) {
document.add(new StringField("requestparam", luceneLogDto.getRequestparam(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getResponseparam())) {
document.add(new StringField("responseparam", luceneLogDto.getResponseparam(), Field.Store.YES));
}
document.add(new StringField("logType", luceneLogDto.getLogType(), Field.Store.YES));
document.add(new StringField("logTime", DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss.SSS"), Field.Store.YES));
document.add(new NumericDocValuesField("logTime",System.currentTimeMillis()));//排序
try {
indexWriter.addDocument(document);
indexWriter.commit();
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
return;
}
}
@Override
public void stop() {
super.stop();
try {
indexWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void setProperties(LuceneProperties properties) {
this.properties = properties;
}
}

View File

@@ -0,0 +1,23 @@
package org.nl.config.lucene.config;
import java.util.ArrayList;
import java.util.List;
public class LuceneProperties {
private List<Property> properties;
public LuceneProperties() {
this.properties = new ArrayList<Property>();
}
public List<Property> getProperties() {
return properties;
}
public void addProperty(Property property) {
properties.add(property);
}
}

View File

@@ -0,0 +1,38 @@
package org.nl.config.lucene.config;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.pattern.PatternLayoutBase;
/*
* @author ZZQ
* @Date 2023/12/22 18:11
*/
public class LucenePropertyAndEncoder {
private Property property;
private PatternLayoutBase layout = new PatternLayout();
public LucenePropertyAndEncoder(Property property, Context context) {
this.property = property;
this.layout.setContext(context);
this.layout.setPattern(String.valueOf(property.getValue()));
this.layout.setPostCompileProcessor(null);
this.layout.start();
}
public String encode(ILoggingEvent event) {
return layout.doLayout(event);
}
public String getName() {
return property.getName();
}
public boolean allowEmpty() {
return property.isAllowEmpty();
}
}

View File

@@ -0,0 +1,44 @@
package org.nl.config.lucene.config;
/*
* @author ZZQ
* @Date 2023/12/26 15:30
*/
public class Property {
private String name;
private String value;
private boolean allowEmpty;
public Property() {
}
public Property(String name, String value, boolean allowEmpty) {
this.name = name;
this.value = value;
this.allowEmpty = allowEmpty;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public boolean isAllowEmpty() {
return allowEmpty;
}
public void setAllowEmpty(boolean allowEmpty) {
this.allowEmpty = allowEmpty;
}
}

View File

@@ -0,0 +1,15 @@
package org.nl.config.lucene.enums;
public enum LogTypeEnum {
DEVICE_LOG("设备日志"),
INTERFACE_LOG("接口日志");
private String desc;
LogTypeEnum(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
}

View File

@@ -1,11 +1,11 @@
package org.nl.system.controller.lucence;
package org.nl.config.lucene.rest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.logging.annotation.Log;
import org.nl.system.service.lucene.LuceneService;
import org.nl.config.lucene.service.LuceneService;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequiredArgsConstructor
@Api(tags = "日志检索")
@@ -25,10 +26,12 @@ public class LuceneController {
private final LuceneService luceneService;
@GetMapping("/getAll")
@Log("日志检索")
@ApiOperation("日志检索")
//@PreAuthorize("@el.check('task:list')")
public ResponseEntity<Object> get(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(luceneService.getAll(whereJson, page), HttpStatus.OK);
}

View File

@@ -1,8 +1,7 @@
package org.nl.system.service.lucene;
package org.nl.config.lucene.service;
import org.nl.system.service.lucene.dto.LuceneLogDto;
import java.io.IOException;
import org.nl.config.lucene.service.dto.LuceneLogDto;
public interface LuceneExecuteLogService {
/**
@@ -26,7 +25,7 @@ public interface LuceneExecuteLogService {
*
* @param luceneLogDto 日志结果对象
*/
void interfaceExecuteLog(LuceneLogDto luceneLogDto) throws IOException;
void interfaceExecuteLog(LuceneLogDto luceneLogDto);
/**
* 设备执行日志,会保留历史记录

View File

@@ -1,6 +1,5 @@
package org.nl.system.service.lucene;
package org.nl.config.lucene.service;
import com.alibaba.fastjson.JSONArray;
import org.springframework.data.domain.Pageable;
import java.util.Map;

View File

@@ -0,0 +1,106 @@
package org.nl.config.lucene.service.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@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 String last_home,
final String home) {
super();
this.device_code = device_code;
this.content = "信号 ["
+ opc_server_code + "."
+ opc_plc_code + "."
+ device_code + "."
+ to_home + "] 发生变更 "
+ last_home + " -> "
+ home;
}
public LuceneLogDto(final String device_code, final String remark) {
super();
this.device_code = device_code;
this.content = "设备 ["
+ device_code
+ "] - "
+ remark;
}
public LuceneLogDto(final LuceneLogDto dto) {
super();
this.device_code = device_code;
this.method = method;
this.content = "设备 ["
+ device_code
+ "] - "
+ remark;
}
}

View File

@@ -0,0 +1,51 @@
package org.nl.config.lucene.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.config.lucene.enums.LogTypeEnum;
import org.nl.config.lucene.service.LuceneExecuteLogService;
import org.nl.config.lucene.service.dto.LuceneLogDto;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
/**
* @author jlm
* @description 服务实现
* @date 2023-04-11
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class LuceneExecuteLogServiceImpl implements LuceneExecuteLogService {
@Override
public void deviceItemValue(String device_code, String key, String value) {
String now = DateUtil.now();
}
@Override
public void deviceExecuteLog(LuceneLogDto luceneLogDto) {
luceneLogDto.setLogType(LogTypeEnum.DEVICE_LOG.getDesc());
log.info("{}", JSON.toJSONString(luceneLogDto));
}
@Override
public void interfaceExecuteLog(LuceneLogDto luceneLogDto) {
luceneLogDto.setLogType(LogTypeEnum.INTERFACE_LOG.getDesc());
log.info("{}", JSON.toJSONString(luceneLogDto));
}
@Override
public void extLog(String name, String message) {
try {
MDC.put(name, name);
log.info("{}", message);
} catch (Exception e) {
e.printStackTrace();
} finally {
MDC.remove(name);
}
}
}

View File

@@ -0,0 +1,127 @@
package org.nl.config.lucene.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.BytesRef;
import org.nl.config.lucene.service.LuceneService;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.nio.file.Paths;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@Service
@RequiredArgsConstructor
@Slf4j
public class LuceneServiceImpl implements LuceneService {
//日志索引目录
@Override
public Map<String, Object> getAll(Map whereJson, Pageable page) {
//获取要查询的路径,也就是索引所在的位置
try {
FSDirectory directory = FSDirectory.open(Paths.get("C:\\acs\\lucene\\index"));
DirectoryReader open = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(open);
// 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数
int pageSize = Integer.parseInt(whereJson.get("size").toString());// 每页条数
int pageNum = Integer.parseInt(whereJson.get("page").toString());// 当前页码
BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder();
//时间范围查询
String startDate = (String) whereJson.get("begin_time");
String endDate = (String) whereJson.get("end_time");
if (startDate == null){
Calendar calendar=Calendar.getInstance();
calendar.set(1970, 0, 1);
startDate = DateUtil.format(calendar.getTime(),"yyyy-MM-dd HH:mm:ss.SSS");
}else{
startDate = getDate(startDate);
}
if (endDate == null){
endDate = DateUtil.format(new DateTime(),"yyyy-MM-dd HH:mm:ss.SSS");
} else {
endDate = getDate(endDate);
}
TermRangeQuery termRangeQuery = new TermRangeQuery("logTime", new BytesRef(startDate), new BytesRef(endDate), true, true);
booleanQueryBuilder.add(termRangeQuery, BooleanClause.Occur.MUST);
if (whereJson.get("device_code") != null){
Query termQuery = new TermQuery(new Term("device_code", (String) whereJson.get("device_code")));
booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST);
}
if (whereJson.get("method") != null){
Query termQuery = new TermQuery(new Term("method", (String) whereJson.get("method")));
booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST);
}
if (whereJson.get("status_code") != null){
Query termQuery = new TermQuery(new Term("status_code", (String) whereJson.get("status_code")));
booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST);
}
if (whereJson.get("requestparam") != null){
WildcardQuery query = new WildcardQuery(new Term("requestparam", "*"+(String) whereJson.get("requestparam")+"*"));
booleanQueryBuilder.add(query,BooleanClause.Occur.MUST);
}
if (whereJson.get("responseparam") != null){
WildcardQuery query = new WildcardQuery(new Term("responseparam", "*"+(String) whereJson.get("responseparam")+"*"));
booleanQueryBuilder.add(query,BooleanClause.Occur.MUST);
}
if (whereJson.get("blurry") != null) {
WildcardQuery query = new WildcardQuery(new Term("fieldContent", "*"+(String) whereJson.get("blurry")+"*"));
booleanQueryBuilder.add(query, BooleanClause.Occur.MUST);
}
TopFieldCollector collector = TopFieldCollector.create(new Sort(new SortField("logTime", SortField.Type.LONG,true)), 20000, 0);
searcher.search(booleanQueryBuilder.build(), collector);
TopDocs topDocs = collector.topDocs(pageNum*pageSize, pageSize);
int totalSize = collector.getTotalHits();
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
List<JSONObject> list = new ArrayList<>();
for (ScoreDoc scoreDoc : scoreDocs) {
Document doc = open.document(scoreDoc.doc);
JSONObject object = new JSONObject();
object.put("content",doc.get("fieldContent"));
object.put("device_code",doc.get("device_code"));
object.put("logTime",doc.get("logTime"));
object.put("method",doc.get("method"));
object.put("status_code",doc.get("status_code"));
object.put("requestparam",doc.get("requestparam"));
object.put("responseparam",doc.get("responseparam"));
if(doc.get("fieldContent") != null) {
list.add(object);
}
}
open.close();
directory.close();
JSONObject jo = new JSONObject();
jo.put("content", list);
jo.put("totalElements", totalSize);
return jo;
} catch (Exception e) {
log.error("索引查询为空", e);
throw new NullPointerException("索引查询为空");
}
}
public static String getDate(String timeString) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");//时间格式
Date date = sdf.parse(timeString);
timeString = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss.SSS");//格式化后的时间
return timeString;
}
}

View File

@@ -1,27 +0,0 @@
package org.nl.system.service.lucene;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.IndexWriter;
import org.nl.config.lucene.LuceneServiceAutoRun;
/**
* @author ldjun
* @version 1.0
* @date 2023年05月12日 9:40
* @desc desc
*/
public class LuceneDefaultAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
@Override
protected void append(ILoggingEvent eventObject) {
IndexWriter indexWriter = LuceneServiceAutoRun.getIndexWriter();
Document document = new Document();
document.add(new StringField("status_code", "01", Field.Store.YES));
}
}

View File

@@ -1,126 +0,0 @@
package org.nl.system.service.lucene.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@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;
/**
* 创建时间
*/
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;
}
}

View File

@@ -1,113 +0,0 @@
package org.nl.system.service.lucene.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.IndexWriter;
import org.nl.common.enums.LogTypeEnum;
import org.nl.config.lucene.DynamicLogger;
import org.nl.config.lucene.LuceneServiceAutoRun;
import org.nl.system.service.lucene.LuceneExecuteLogService;
import org.nl.system.service.lucene.dto.LuceneLogDto;
import org.slf4j.Logger;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
/**
* @author jlm
* @description 服务实现
* @date 2023-04-11
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class LuceneExecuteLogServiceImpl implements LuceneExecuteLogService {
/**
* 日志目录
*/
@Value("${logging.file.path}")
private String logPath;
@Override
public void deviceItemValue(String device_code, String key, String value) {
String now = DateUtil.now();
}
@SneakyThrows
@Override
public void deviceExecuteLog(LuceneLogDto luceneLogDto) {
luceneLogDto.setLogType(LogTypeEnum.DEVICE_LOG.getDesc());
addIndex(luceneLogDto);
}
@Override
public void interfaceExecuteLog(LuceneLogDto luceneLogDto) throws IOException {
luceneLogDto.setLogType(LogTypeEnum.INTERFACE_LOG.getDesc());
addIndex(luceneLogDto);
}
private void addIndex(LuceneLogDto luceneLogDto) throws IOException {
IndexWriter indexWriter = LuceneServiceAutoRun.getIndexWriter();
//创建一个Document对象
Document document = new Document();
try {
//记录索引开始时间
long startTime = System.currentTimeMillis();
//向document对象中添加域。
if (ObjectUtil.isNotEmpty(luceneLogDto.getDevice_code())) {
document.add(new StringField("device_code", luceneLogDto.getDevice_code(), Field.Store.YES));
// document.add(new TextField("device_code", luceneLogDto.getDevice_code(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getContent())) {
document.add(new StringField("fieldContent", luceneLogDto.getContent(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getMethod())) {
document.add(new StringField("method", luceneLogDto.getMethod(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getStatus_code())) {
document.add(new StringField("status_code", luceneLogDto.getStatus_code(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getRequestparam())) {
document.add(new StringField("requestparam", luceneLogDto.getRequestparam(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getResponseparam())) {
document.add(new StringField("responseparam", luceneLogDto.getResponseparam(), Field.Store.YES));
}
document.add(new StringField("logType", luceneLogDto.getLogType(), Field.Store.YES));
document.add(new StringField("logTime", DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss.SSS"), Field.Store.YES));
indexWriter.addDocument(document);
//记录索引结束时间
long endTime = System.currentTimeMillis();
indexWriter.commit();
//实现日志文件按业务独立生成日志文件到指定路径
DynamicLogger loggerBuilder =new DynamicLogger(logPath+"\\"+luceneLogDto.getLogType()+"\\");
Logger logger = loggerBuilder.getLogger(luceneLogDto.getDevice_code());
// logger.info("设备{}建立索引共耗时{}毫秒",luceneLogDto.getDevice_code(),endTime-startTime);
logger.info("{}",luceneLogDto.toString());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
@Override
public void extLog(String name, String message) {
try {
MDC.put(name, name);
log.info("{}", message);
} catch (Exception e) {
e.printStackTrace();
} finally {
MDC.remove(name);
}
}
}

View File

@@ -1,46 +0,0 @@
package org.nl.system.service.lucene.impl;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.config.lucene.Searcher;
import org.nl.system.service.lucene.LuceneService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
@RequiredArgsConstructor
@Slf4j
public class LuceneServiceImpl implements LuceneService {
/**
* 日志索引目录
*/
@Value("${lucene.index.path}")
private String luceneUrl;
@Override
public Map<String, Object> getAll(Map whereJson, Pageable page) {
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("索引查询为空");
}
return jo;
}
}

View File

@@ -18,9 +18,9 @@ import org.nl.common.domain.vo.MenuMetaVo;
import org.nl.common.domain.vo.MenuVo;
import org.nl.common.utils.CopyUtil;
import org.nl.config.IdUtil;
import org.nl.config.lucene.service.LuceneExecuteLogService;
import org.nl.system.service.dict.dao.Dict;
import org.nl.system.service.dict.dao.mapper.SysDictMapper;
import org.nl.system.service.lucene.LuceneExecuteLogService;
import org.nl.system.service.menu.dto.MenuDto;
import org.nl.system.service.menu.ISysMenuService;
import org.nl.system.service.menu.dao.SysMenu;

View File

@@ -9,10 +9,10 @@ spring:
db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:stand_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:lzhl_two_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:lzhl_two_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root}
# password: ${DB_PWD:Root.123456}
password: ${DB_PWD:p@ssw0rd}
password: ${DB_PWD:password}
# 初始连接数
initial-size: 5
# 最小连接数
@@ -129,8 +129,11 @@ file:
avatarMaxSize: 5
logging:
file:
path: C:\log\wms
path: /Users/onepiece/myFile/acs_logs
config: classpath:logback-spring.xml
lucene:
index:
path: /lucene
# Sa-Token配置
sa-token:

View File

@@ -88,6 +88,7 @@ mybatis-plus:
global-config:
db-config:
id-type: INPUT
lucene:
index:
path: D:\lucene\index
path: C:\acs\lucene\index

View File

@@ -2,16 +2,15 @@
<included>
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
<property name="LOG_HOME" value="${logPath}"/>
<!--<define name="DEVICECODE" class="org.nl.common.logging.DeviceCodeDir"/>-->
<!-- 按照每天生成日志文件 -->
<appender name="FILE_XGAGV" class="ch.qos.logback.core.rolling.RollingFileAppender">
<appender name="XgagvDeviceDriver" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/XgAgvDeviceDriver/${DEVICECODE}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
<!--单个日志最大容量 至少10MB才能看得出来-->
<maxFileSize>200MB</maxFileSize>
<maxFileSize>100MB</maxFileSize>
<!--所有日志最多占多大容量-->
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
@@ -23,12 +22,13 @@
</appender>
<!-- <logger name="org.nl.start.Init" level="info" additivity="false">
<appender-ref ref="FILE3"/>
</logger>-->
<!-- 打印sql -->
<logger name="org.nl.system.service.lucene.impl.LuceneExecuteLogServiceImpl" level="info" additivity="false">
<appender-ref ref="FILE_XGAGV"/>
<appender name="asyncFileAppender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="XgagvDeviceDriver" />
<!-- 设置队列大小,根据您的需求调整 -->
<queueSize>512</queueSize>
</appender>
<logger name="org.nl.acs.device_driver.agv.xg_agv.XgagvDeviceDriver" level="info" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
</included>

View File

@@ -14,6 +14,11 @@ https://juejin.cn/post/6844903775631572999
<property name="log.pattern"
value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
<!-- <springProperty scope="context" name="lokiUrl" source="loki.url"/>-->
<springProperty scope="context" name="systemName" source="loki.systemName"/>
<!-- <property name="LOKI_URL" value="${lokiUrl}"/>-->
<property name="SYSTEM_NAME" value="${systemName}"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${logPath}"/>
<!--引入默认的一些设置-->
<!--<include resource="log/XrToMes.xml"/>
@@ -21,15 +26,13 @@ https://juejin.cn/post/6844903775631572999
<include resource="log/XgAgvDeviceDriver.xml"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
<!-- <encoder>-->
<encoder>
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${logPath}"/>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
@@ -42,153 +45,103 @@ https://juejin.cn/post/6844903775631572999
<!--所有日志最多占多大容量-->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
<!-- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--异步到文件-->
<!-- <appender name="asyncFileAppender" class="ch.qos.logback.classic.AsyncAppender">-->
<appender name="asyncFileAppender" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>500</queueSize>
<appender name="asyncFileAppender" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>200</queueSize>
<appender-ref ref="FILE"/>
</appender>
<appender name="MY_FILE" class="org.nl.system.service.lucene.LuceneDefaultAppender">
<appender name="luceneAppender" class="org.nl.config.lucene.config.LuceneAppender"/>
<appender name="asyncLuceneAppender" class="org.nl.config.lucene.config.AsyncLuceneAppender">
<appender-ref ref="luceneAppender"/>
<!-- 设置队列大小,根据您的需求调整 -->
<queueSize>512</queueSize>
</appender>
<!--开发环境:打印控制台-->
<springProfile name="dev">
<root level="debug">
<root level="info">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="MY_FILE"/>
</root>
<logger name="org.springframework" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.apache" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.hibernate" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="io.netty" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="io.lettuce" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.fasterxml" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.quartz" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.google" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="springfox" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="log4jdbc" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="nl.basjes" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.audit" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.resultset" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="springfox.documentation" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.sqlonly" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.sqltiming" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.jinterop" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
</springProfile>
<!--生产环境:打印控制台和输出到文件-->
<springProfile name="prod">
<root level="debug">
<appender-ref ref="asyncFileAppender"/>
</root>
<logger name="org.springframework" level="ERROR" additivity="false">
<logger name="jdbc" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.apache" level="ERROR" additivity="false">
<logger name="org.springframework" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.hibernate" level="ERROR" additivity="false">
<logger name="org.hibernate" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="io.netty" level="ERROR" additivity="false">
<logger name="org.quartz" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="jdbc" level="ERROR" additivity="false">
<logger name="com.google" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="io.lettuce" level="ERROR" additivity="false">
<logger name="org.redisson" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="com.fasterxml" level="ERROR" additivity="false">
<logger name="org.nl.modules.wql" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.quartz" level="ERROR" additivity="false">
<logger name="org.springframework.data" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="com.google" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="springfox" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="log4jdbc" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="nl.basjes" level="ERROR" additivity="false">
<logger name="org.jinterop" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
</springProfile>
<!--测试环境:打印控制台-->
<springProfile name="test">
<!-- 打印sql -->
<logger name="org.nl.start.Init" level="info" additivity="false">
<appender-ref ref="FILE"/>
</logger>
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<!--生产环境:打印控制台和输出到文件-->
<springProfile name="prod">
<root level="info">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</root>
<logger name="jdbc.audit" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
<logger name="jdbc" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="jdbc.resultset" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
<logger name="org.springframework" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="springfox.documentation" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
<logger name="org.hibernate" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="jdbc.resultsettable" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
<logger name="org.quartz" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="jdbc.sqlonly" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
<logger name="com.google" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.redisson" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.nl.modules.wql" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.springframework.data" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.jinterop" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
</springProfile>
</configuration>

View File

@@ -1,122 +1,8 @@
<template>
<div class="app-container">
<div class="head-container">
<div>
<!-- 搜索 -->
<!-- <el-input
v-model="query.device_code"
clearable
size="small"
placeholder="请输入你要搜索的设备号"
style="width: 200px;"
class="filter-item"
/> -->
<!-- <el-select
v-model="query.device_code"
clearable
filterable
size="small"
placeholder="请输入你要搜索的设备号"
class="filter-item"
style="width: 190px"
@change="crud.toQuery"
>
<el-option v-for="item in device_codes" :key="item.id" :label="item.label" :value="item.value" />
</el-select> -->
<el-form
:inline="true"
class="demo-form-inline"
label-position="right"
label-suffix=":"
>
<el-form-item :label="$t('monitor.lucence.device_code')">
<el-select
ref="test"
v-model="query.device_code"
filterable
clearable
reserve-keyword
:placeholder="$t('monitor.lucence.device_code')"
style="width: 200px;"
@change="crud.toQuery"
>
<el-option
v-for="item in deviceList"
:key="item.device_code"
:label="item.device_code"
:value="item.device_code"
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.method')">
<el-input
v-model="query.method"
clearable
size="small"
:placeholder="$t('monitor.lucence.method_name')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.status_code')">
<el-input
v-model="query.status_code"
clearable
size="small"
:placeholder="$t('monitor.lucence.search_status_code')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.requestparam')">
<el-input
v-model="query.requestparam"
clearable
size="small"
:placeholder="$t('monitor.lucence.search_request_param')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.responseparam')">
<el-input
v-model="query.responseparam"
clearable
size="small"
:placeholder="$t('monitor.lucence.search_response_param')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.content')">
<el-input
v-model="query.blurry"
clearable
size="small"
:placeholder="$t('monitor.lucence.search_content')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.logTime')">
<el-date-picker
v-model="query.createTime"
type="datetimerange"
:picker-options="pickerOptions"
format="yyyy-MM-dd HH:mm:ss"
:range-separator="$t('monitor.lucence.until')"
:start-placeholder="$t('monitor.lucence.start_time')"
:end-placeholder="$t('monitor.lucence.end_time')"
align="right"
/>
</el-form-item>
<rrOperation />
</el-form>
<!--
<date-range-picker v-model="query.createTime" class="date-item" />
-->
</div>
<!-- <crudOperation />-->
<Search />
<crudOperation />
</div>
<!--表格渲染-->
<el-table
@@ -128,16 +14,17 @@
>
<!-- <el-table-column type="selection" width="55"/>-->
<!-- <el-table-column v-if="false" prop="id" label="id"/>-->
<el-table-column prop="operate" :min-width="flexWidth('operate',crud.data,$t('monitor.lucence.operate'))" :label="$t('monitor.lucence.operate')" />
<el-table-column prop="device_code" :label="$t('monitor.lucence.device_code')" :min-width="flexWidth('device_code',crud.data,$t('monitor.lucence.device_code'))" show-overflow-tooltip />
<el-table-column prop="task_code" :label="$t('monitor.lucence.task_code')" :min-width="flexWidth('task_code',crud.data,$t('monitor.lucence.task_code'))" />
<el-table-column prop="instruct_code" :label="$t('monitor.lucence.instruct_code')" :min-width="flexWidth('instruct_code',crud.data,$t('monitor.lucence.instruct_code'))" />
<el-table-column prop="method" :label="$t('monitor.lucence.method')" :min-width="flexWidth('method',crud.data,$t('monitor.lucence.method'))" />
<el-table-column prop="status_code" :label="$t('monitor.lucence.status_code')" :min-width="flexWidth('status_code',crud.data,$t('monitor.lucence.status_code'))" />
<el-table-column prop="requestparam" :label="$t('monitor.lucence.requestparam')" :min-width="flexWidth('requestparam',crud.data,$t('monitor.lucence.requestparam'))" />
<el-table-column prop="responseparam" :label="$t('monitor.lucence.responseparam')" :min-width="flexWidth('responseparam',crud.data,$t('monitor.lucence.responseparam'))" />
<el-table-column prop="logTime" :label="$t('monitor.lucence.logTime')" :min-width="flexWidth('logTime',crud.data,$t('monitor.lucence.logTime'))" />
<el-table-column prop="content" :min-width="flexWidth('content',crud.data,$t('monitor.lucence.content'))" :label="$t('monitor.lucence.content')" />
<el-table-column prop="operate" width="50" label="操作" />
<el-table-column prop="device_code" label="设备号" min-width="130" show-overflow-tooltip />
<!-- <el-table-column prop="trace_id" label="链路追踪" /> -->
<el-table-column prop="task_code" label="任务编号" />
<el-table-column prop="instruct_code" label="指令编号" />
<el-table-column prop="method" label="方法" />
<el-table-column prop="status_code" label="状态码" />
<el-table-column prop="requestparam" label="请求参数" />
<el-table-column prop="responseparam" label="返回参数" />
<el-table-column prop="logTime" width="170" label="记录时间" />
<el-table-column prop="content" width="500" label="内容详情" />
</el-table>
<!--分页组件-->
@@ -146,15 +33,15 @@
</template>
<script>
import Search from './search'
import CRUD, { crud, header, presenter } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import pagination from '@crud/Pagination'
import { delAll } from '@/api/acs/lucene/log'
import deviceCrud from '@/api/acs/device/device'
export default {
name: 'LuceneLog',
components: { pagination, crudOperation },
components: { Search, pagination, crudOperation },
mixins: [presenter(), header(), crud()],
cruds: function() {
return CRUD({
@@ -189,9 +76,6 @@ export default {
}
},
created() {
deviceCrud.selectDeviceList().then(data => {
this.deviceList = data
})
},
methods: {
// 钩子在获取表格数据之前执行false 则代表不获取数据
@@ -199,9 +83,9 @@ export default {
return true
},
confirmDelAll() {
this.$confirm(this.$t('monitor.table.clear_log'), this.$t('monitor.table.prompt'), {
confirmButtonText: this.$t('monitor.table.confirm'),
cancelButtonText: this.$t('monitor.table.cancel'),
this.$confirm(`确认清空所有操作日志吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.crud.delAllLoading = true

View File

@@ -1,130 +1,74 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<!-- <el-input
v-model="query.device_code"
clearable
size="small"
placeholder="请输入你要搜索的设备号"
style="width: 200px;"
class="filter-item"
/> -->
<!-- <el-select
v-model="query.device_code"
clearable
filterable
size="small"
placeholder="请输入你要搜索的设备号"
class="filter-item"
style="width: 190px"
@change="crud.toQuery"
>
<el-option v-for="item in device_codes" :key="item.id" :label="item.label" :value="item.value" />
</el-select> -->
<el-form
:inline="true"
class="demo-form-inline"
label-position="right"
label-suffix=":"
>
<el-form-item :label="$t('monitor.lucence.device_code')">
<el-select
ref="test"
v-model="query.device_code"
filterable
clearable
reserve-keyword
:placeholder="$t('monitor.lucence.device_code')"
style="width: 200px;"
@change="crud.toQuery"
>
<el-option
v-for="item in deviceList"
:key="item.device_code"
:label="item.device_code"
:value="item.device_code"
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.method')">
<el-input
v-model="query.method"
clearable
size="small"
:placeholder="$t('monitor.lucence.method_name')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.status_code')">
<el-input
v-model="query.status_code"
clearable
size="small"
:placeholder="$t('monitor.lucence.search_status_code')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.requestparam')">
<el-input
v-model="query.requestparam"
clearable
size="small"
:placeholder="$t('monitor.lucence.search_request_param')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.responseparam')">
<el-input
v-model="query.responseparam"
clearable
size="small"
:placeholder="$t('monitor.lucence.search_response_param')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.content')">
<el-input
v-model="query.blurry"
clearable
size="small"
:placeholder="$t('monitor.lucence.search_content')"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item :label="$t('monitor.lucence.logTime')">
<el-date-picker
v-model="query.createTime"
type="datetimerange"
:picker-options="pickerOptions"
format="yyyy-MM-dd HH:mm:ss"
:range-separator="$t('monitor.lucence.until')"
:start-placeholder="$t('monitor.lucence.start_time')"
:end-placeholder="$t('monitor.lucence.end_time')"
align="right"
/>
</el-form-item>
<rrOperation />
</el-form>
<!--
<date-range-picker v-model="query.createTime" class="date-item" />
-->
</div>
</div>
<div v-if="crud.props.searchToggle">
<el-input
v-model="query.device_code"
clearable
size="small"
placeholder="请输入你要搜索的设备号"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model="query.method"
clearable
size="small"
placeholder="请输入你要搜索的方法名"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model="query.status_code"
clearable
size="small"
placeholder="请输入你要搜索的状态码"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model="query.requestparam"
clearable
size="small"
placeholder="请输入你要搜索的请求参数"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model="query.responseparam"
clearable
size="small"
placeholder="请输入你要搜索的返回参数"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model="query.blurry"
clearable
size="small"
placeholder="请输入你要搜索的内容详情"
style="width: 200px;"
class="filter-item"
/>
<!--
<date-range-picker v-model="query.createTime" class="date-item" />
-->
<el-date-picker
v-model="query.createTime"
type="datetimerange"
:picker-options="pickerOptions"
format="yyyy-MM-dd HH:mm:ss"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
align="right"
/>
<rrOperation />
</div>
</template>
<script>
import { header } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import deviceCrud from '@/api/acs/device/device'
export default {
components: { rrOperation },
@@ -134,7 +78,7 @@ export default {
return {
pickerOptions: {
shortcuts: [{
text: this.$t('monitor.lucence.the_past_week'),
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
@@ -142,7 +86,7 @@ export default {
picker.$emit('pick', [start, end])
}
}, {
text: this.$t('monitor.lucence.the_past_month'),
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
@@ -150,7 +94,7 @@ export default {
picker.$emit('pick', [start, end])
}
}, {
text: this.$t('monitor.lucence.the_past_three_months'),
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()
@@ -160,15 +104,10 @@ export default {
}]
},
value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
value2: '',
deviceList: [],
device_code: ''
value2: ''
}
},
created() {
deviceCrud.selectDeviceList().then(data => {
this.deviceList = data
})
}
}
</script>

View File

@@ -8,9 +8,9 @@
v-model="query.createTime"
type="datetimerange"
:picker-options="pickerOptions"
:range-separator="$t('monitor.lucence.until')"
:start-placeholder="$t('monitor.lucence.start_time')"
:end-placeholder="$t('monitor.lucence.end_time')"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
align="right"
/>
<rrOperation />
@@ -29,7 +29,7 @@ export default {
return {
pickerOptions: {
shortcuts: [{
text: this.$t('monitor.lucence.the_past_week'),
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
@@ -37,7 +37,7 @@ export default {
picker.$emit('pick', [start, end])
}
}, {
text: this.$t('monitor.lucence.the_past_month'),
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
@@ -45,7 +45,7 @@ export default {
picker.$emit('pick', [start, end])
}
}, {
text: this.$t('monitor.lucence.the_past_three_months'),
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()