From dfa6fda772766c3d91fc8a02c2b6ec5c4017cb16 Mon Sep 17 00:00:00 2001 From: xs3508198 <1131259489@qq.com> Date: Thu, 2 Apr 2026 16:04:51 +0800 Subject: [PATCH 1/5] feat: add new interface --- .../app/api/service/HeraAppService.java | 2 ++ .../ozhera/app/controller/AppController.java | 5 ++++ .../app/service/impl/HeraAppServiceImpl.java | 25 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/ozhera-app/app-api/src/main/java/org/apache/ozhera/app/api/service/HeraAppService.java b/ozhera-app/app-api/src/main/java/org/apache/ozhera/app/api/service/HeraAppService.java index cb438b83b..f155085fc 100644 --- a/ozhera-app/app-api/src/main/java/org/apache/ozhera/app/api/service/HeraAppService.java +++ b/ozhera-app/app-api/src/main/java/org/apache/ozhera/app/api/service/HeraAppService.java @@ -35,6 +35,8 @@ public interface HeraAppService { List queryAppInfoWithLog(String appName, Integer type); + List queryAppInfoWithLogLatest(String appName, Integer type, Integer count); + List queryAllExistsApp(); AppBaseInfo queryById(Long id); diff --git a/ozhera-app/app-server/src/main/java/org/apache/ozhera/app/controller/AppController.java b/ozhera-app/app-server/src/main/java/org/apache/ozhera/app/controller/AppController.java index 8f63ab7d5..78c09e813 100644 --- a/ozhera-app/app-server/src/main/java/org/apache/ozhera/app/controller/AppController.java +++ b/ozhera-app/app-server/src/main/java/org/apache/ozhera/app/controller/AppController.java @@ -77,6 +77,11 @@ public List queryAppInfoWithLog(String appName, Integer type) { return heraAppService.queryAppInfoWithLog(appName, type); } + @GetMapping("query/app/log/latest") + public List queryAppInfoWithLog(String appName, Integer type, Integer limit) { + return heraAppService.queryAppInfoWithLogLatest(appName, type, limit); + } + @PostMapping("/hera/app/add") public Result heraAppAdd(@RequestBody HeraAppBaseInfo heraAppBaseInfo) { if (StringUtils.isBlank(heraAppBaseInfo.getBindId()) || StringUtils.isBlank(heraAppBaseInfo.getAppName())) { diff --git a/ozhera-app/app-service/src/main/java/org/apache/ozhera/app/service/impl/HeraAppServiceImpl.java b/ozhera-app/app-service/src/main/java/org/apache/ozhera/app/service/impl/HeraAppServiceImpl.java index 8bc926578..23cf9ddba 100644 --- a/ozhera-app/app-service/src/main/java/org/apache/ozhera/app/service/impl/HeraAppServiceImpl.java +++ b/ozhera-app/app-service/src/main/java/org/apache/ozhera/app/service/impl/HeraAppServiceImpl.java @@ -109,6 +109,31 @@ public List queryAppInfoWithLog(String appName, Integer type) { return appBaseInfos; } + @Override + public List queryAppInfoWithLogLatest(String appName, Integer type, Integer count){ + Integer platformType = null; + Integer appType = null; + if (Objects.nonNull(type)) { + appType = appTypeServiceExtension.getAppTypeLog(type); + platformType = appTypeServiceExtension.getAppPlatForm(type); + } + List appBaseInfos; + if(appName != null && appName.isBlank()){ + appBaseInfos = heraAppBaseInfoMapper.queryAppInfo(appName, platformType, appType); + }else{ + appBaseInfos = heraAppBaseInfoMapper.queryLatestAppInfo(count, platformType, appType); + } + + if (CollectionUtils.isNotEmpty(appBaseInfos)) { + appBaseInfos = appBaseInfos.parallelStream().map(appBaseInfo -> { + appBaseInfo.setPlatformName(appTypeServiceExtension.getPlatformName(appBaseInfo.getPlatformType())); + appBaseInfo.setAppTypeName(appTypeServiceExtension.getAppTypeName(appBaseInfo.getAppType())); + return appBaseInfo; + }).collect(Collectors.toList()); + } + return appBaseInfos; + } + @Override public List querySpecifiedAppInfoWithLog(String appName, Integer limit, Integer type) { List appBaseInfos; From 9db498cc5f2175bce36e5fd25d2ce70dbb701b53 Mon Sep 17 00:00:00 2001 From: xs3508198 <1131259489@qq.com> Date: Thu, 2 Apr 2026 16:29:14 +0800 Subject: [PATCH 2/5] feat: add new interface --- .../apache/ozhera/log/manager/service/HeraAppService.java | 2 ++ .../ozhera/log/manager/service/impl/HeraAppServiceImpl.java | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/HeraAppService.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/HeraAppService.java index acae2812c..3a3b686ed 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/HeraAppService.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/HeraAppService.java @@ -35,6 +35,8 @@ public interface HeraAppService { List queryAppInfoWithLog(String appName, Integer type); + List queryAppInfoWithLogLatest(String appName, Integer type, Integer limit); + List queryAllExistsApp(); AppBaseInfo queryById(Long id); diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraAppServiceImpl.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraAppServiceImpl.java index d203dd3f9..def5966fa 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraAppServiceImpl.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraAppServiceImpl.java @@ -62,6 +62,11 @@ public List queryAppInfoWithLog(String appName, Integer type) { return heraAppService.queryAppInfoWithLog(appName, type); } + @Override + public List queryAppInfoWithLogLatest(String appName, Integer type, Integer limit){ + return heraAppService.queryAppInfoWithLogLatest(appName, type, limit); + } + @Override public List querySpecifiedAppInfoWithLog(String appName, Integer limit, Integer type) { return heraAppService.querySpecifiedAppInfoWithLog(appName, limit, type); From 3aa00d8e0e5c823d4b88da0b8ad6ead96324a338 Mon Sep 17 00:00:00 2001 From: xs3508198 <1131259489@qq.com> Date: Fri, 3 Apr 2026 14:21:56 +0800 Subject: [PATCH 3/5] fix: Fix the bug where temporary files are not cleared when exporting the log. --- .../ozhera/log/manager/domain/SearchLog.java | 14 +- .../service/impl/EsDataServiceImpl.java | 153 ++++++++++-------- 2 files changed, 90 insertions(+), 77 deletions(-) diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/domain/SearchLog.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/domain/SearchLog.java index bc19a63bb..d8eec71c7 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/domain/SearchLog.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/domain/SearchLog.java @@ -354,19 +354,19 @@ public void downLogFileV2(Workbook excel, String fileName) throws IOException { Down.down(fileName); } catch (Exception e) { log.error("downLogFile error,fileName:{}", fileName, e); + throw e; } finally { - if (excel != null) { - excel.close(); - if (excel instanceof SXSSFWorkbook sxssf) { - sxssf.dispose(); - } - } if (fos != null) { - fos.close(); + try { + fos.close(); + } catch (Exception e) { + log.error("Error closing FileOutputStream", e); + } } if (file != null) { file.delete(); } + // Note: Workbook cleanup (close/dispose) is handled by the caller } } diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/EsDataServiceImpl.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/EsDataServiceImpl.java index 9014c57bc..e84f6fb7c 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/EsDataServiceImpl.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/EsDataServiceImpl.java @@ -750,87 +750,100 @@ public void logExport(LogQuery logQuery) throws Exception { final int rowsPerSheet = 5000; //each sheet is fixed at 5000 rows final int maxPage = 100; //max pages, the upper limit of the number of rows: 5000*100 int page = 1; - Workbook workbook = new SXSSFWorkbook(); - String title = generateTitle(logQuery); - List headers = null; - Object[] lastSortValues = null; - logQuery.setIsDownload(true); - while(page <= maxPage) { - logQuery.setPageSize(rowsPerSheet); - logQuery.setPage(page); - //Prevent errors when performing deep paging in the ES database - logQuery.setSearchAfter(lastSortValues); - - Result logDTOResult = this.logQuery(logQuery); - if (logDTOResult.getCode() != CommonError.Success.getCode() || logDTOResult.getData() == null || logDTOResult.getData().getLogDataDTOList() == null || logDTOResult.getData().getLogDataDTOList().isEmpty()) { - break; - } - List> list = logDTOResult.getData().getLogDataDTOList().stream().map(logDataDto -> ExportUtils.SplitTooLongContent(logDataDto)).collect(Collectors.toList()); - - if (list == null || list.isEmpty()) { - break; - } + SXSSFWorkbook workbook = new SXSSFWorkbook(); + try { + String title = generateTitle(logQuery); + List headers = null; + Object[] lastSortValues = null; + logQuery.setIsDownload(true); + while (page <= maxPage) { + logQuery.setPageSize(rowsPerSheet); + logQuery.setPage(page); + //Prevent errors when performing deep paging in the ES database + logQuery.setSearchAfter(lastSortValues); + + Result logDTOResult = this.logQuery(logQuery); + if (logDTOResult.getCode() != CommonError.Success.getCode() || logDTOResult.getData() == null || logDTOResult.getData().getLogDataDTOList() == null || logDTOResult.getData().getLogDataDTOList().isEmpty()) { + break; + } + List> list = logDTOResult.getData().getLogDataDTOList().stream().map(logDataDto -> ExportUtils.SplitTooLongContent(logDataDto)).collect(Collectors.toList()); - if (page == 1){ - headers = new ArrayList<>(list.getFirst().keySet()); - } + if (list == null || list.isEmpty()) { + break; + } - //If the table header is empty, then obtain the header from the current page. - if (headers == null || headers.isEmpty()) { - headers = new ArrayList<>(list.getFirst().keySet()); - } + if (page == 1) { + headers = new ArrayList<>(list.getFirst().keySet()); + } - Sheet sheet = workbook.createSheet("Sheet" + page); - int dataBeginRow; - - if (title != null && !title.isEmpty() && page == 1) { //only the first sheet has a title - Row titleRow = sheet.createRow(0); - Cell cell = titleRow.createCell(0); - cell.setCellValue(title); - CellStyle titleStyle = workbook.createCellStyle(); - titleStyle.setAlignment((short)2); - titleStyle.setVerticalAlignment((short)1); - Font titleFont = workbook.createFont(); - titleFont.setBoldweight((short)700); - titleStyle.setFont(titleFont); - cell.setCellStyle(titleStyle); - titleRow.setHeight((short)450); - dataBeginRow = list != null && !list.isEmpty() ? ((Map)list.get(0)).size() - 1 : 5; - sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, dataBeginRow)); - } + //If the table header is empty, then obtain the header from the current page. + if (headers == null || headers.isEmpty()) { + headers = new ArrayList<>(list.getFirst().keySet()); + } - if (list != null && !list.isEmpty()) { - CellStyle headerStyle = workbook.createCellStyle(); - headerStyle.setAlignment((short)2); - headerStyle.setBorderBottom((short)2); - headerStyle.setBorderTop((short)2); - int headRowIndex = title != null && !title.isEmpty() && page == 1 ? 1 : 0; - Row headRow = sheet.createRow(headRowIndex); - int i = 0; - for (String h : headers){ - Cell cell = headRow.createCell(i++); - cell.setCellValue(h); - cell.setCellStyle(headerStyle); + Sheet sheet = workbook.createSheet("Sheet" + page); + int dataBeginRow; + + if (title != null && !title.isEmpty() && page == 1) { //only the first sheet has a title + Row titleRow = sheet.createRow(0); + Cell cell = titleRow.createCell(0); + cell.setCellValue(title); + CellStyle titleStyle = workbook.createCellStyle(); + titleStyle.setAlignment((short) 2); + titleStyle.setVerticalAlignment((short) 1); + Font titleFont = workbook.createFont(); + titleFont.setBoldweight((short) 700); + titleStyle.setFont(titleFont); + cell.setCellStyle(titleStyle); + titleRow.setHeight((short) 450); + dataBeginRow = list != null && !list.isEmpty() ? ((Map) list.get(0)).size() - 1 : 5; + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, dataBeginRow)); } - dataBeginRow = title != null && !title.isEmpty() && page == 1 ? 2 : 1; + if (list != null && !list.isEmpty()) { + CellStyle headerStyle = workbook.createCellStyle(); + headerStyle.setAlignment((short) 2); + headerStyle.setBorderBottom((short) 2); + headerStyle.setBorderTop((short) 2); + int headRowIndex = title != null && !title.isEmpty() && page == 1 ? 1 : 0; + Row headRow = sheet.createRow(headRowIndex); + int i = 0; + for (String h : headers) { + Cell cell = headRow.createCell(i++); + cell.setCellValue(h); + cell.setCellStyle(headerStyle); + } - for(int j = 0; j < list.size(); ++j) { - Row row = sheet.createRow(dataBeginRow++); - Map rowMap = list.get(j); - for (int k = 0; k < headers.size(); k++){ - Cell cell = row.createCell(k); - Object val = rowMap.get(headers.get(k)); - cell.setCellValue(val == null ? "" : val.toString()); + dataBeginRow = title != null && !title.isEmpty() && page == 1 ? 2 : 1; + + for (int j = 0; j < list.size(); ++j) { + Row row = sheet.createRow(dataBeginRow++); + Map rowMap = list.get(j); + for (int k = 0; k < headers.size(); k++) { + Cell cell = row.createCell(k); + Object val = rowMap.get(headers.get(k)); + cell.setCellValue(val == null ? "" : val.toString()); + } } } + lastSortValues = logDTOResult.getData().getThisSortValue(); + page++; + } + // Download + String fileName = String.format("%s_log.xlsx", logQuery.getLogstore()); + searchLog.downLogFileV2(workbook, fileName); + } finally { + // Ensure temporary files are cleaned up even if an exception occurs + if (workbook != null) { + try { + workbook.close(); + } catch (Exception e) { + log.error("Error closing workbook", e); + } finally { + workbook.dispose(); + } } - lastSortValues = logDTOResult.getData().getThisSortValue(); - page++; } - // Download - String fileName = String.format("%s_log.xlsx", logQuery.getLogstore()); - searchLog.downLogFileV2(workbook, fileName); } private String generateTitle(LogQuery logQuery) { From 69c74ce31a7c42f6c421f25d3bfd8ee81380fcea Mon Sep 17 00:00:00 2001 From: xs3508198 <1131259489@qq.com> Date: Fri, 3 Apr 2026 15:33:20 +0800 Subject: [PATCH 4/5] fix: Modify the interface version of Dubbo --- .../ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java | 2 +- ozhera-log/log-manager/src/main/resources/config.properties | 1 + .../log-manager/src/main/resources/config/open.properties | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java index a5019c7ef..c8fb640af 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java @@ -68,7 +68,7 @@ * @date 2024/3/6 16:17 */ @Slf4j -@Service(interfaceClass = HeraLogApiService.class, group = "$dubbo.group", timeout = 10000) +@Service(interfaceClass = HeraLogApiService.class, group = "$dubbo.api.group", timeout = 10000) public class HeraLogApiServiceImpl implements HeraLogApiService { private static final int QUERY_LIMIT = 20; diff --git a/ozhera-log/log-manager/src/main/resources/config.properties b/ozhera-log/log-manager/src/main/resources/config.properties index 0eab25870..321b52775 100644 --- a/ozhera-log/log-manager/src/main/resources/config.properties +++ b/ozhera-log/log-manager/src/main/resources/config.properties @@ -46,6 +46,7 @@ miline_rocketmq_consumer_group=${miline_rocketmq_consumer_group} #dubbo dubbo_app_name=${dubbo_app_name} dubbo.group=${dubbo.group} +dubbo.api.group=${dubbo.api.group} dubbo.env.group=${dubbo.env.group} dubbo_reg_check=${dubbo_reg_check} dubbo_reg_address=${dubbo_reg_address} diff --git a/ozhera-log/log-manager/src/main/resources/config/open.properties b/ozhera-log/log-manager/src/main/resources/config/open.properties index 48a3eafed..172e323e5 100644 --- a/ozhera-log/log-manager/src/main/resources/config/open.properties +++ b/ozhera-log/log-manager/src/main/resources/config/open.properties @@ -49,6 +49,7 @@ app.env=test #dubbo dubbo_app_name=milog dubbo.group= +dubbo.api.group=open dubbo.env.group=open dubbo_reg_check=false dubbo_reg_address=nacos://nacos:80 From 23c7c4e86622b00d11d355806caff4b06f36b360 Mon Sep 17 00:00:00 2001 From: xs3508198 <1131259489@qq.com> Date: Fri, 3 Apr 2026 15:45:42 +0800 Subject: [PATCH 5/5] fix: Modify the interface version of Dubbo --- .../ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java | 2 +- .../ozhera/log/manager/service/impl/LogAgentApiServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java index c8fb640af..a5019c7ef 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraLogApiServiceImpl.java @@ -68,7 +68,7 @@ * @date 2024/3/6 16:17 */ @Slf4j -@Service(interfaceClass = HeraLogApiService.class, group = "$dubbo.api.group", timeout = 10000) +@Service(interfaceClass = HeraLogApiService.class, group = "$dubbo.group", timeout = 10000) public class HeraLogApiServiceImpl implements HeraLogApiService { private static final int QUERY_LIMIT = 20; diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/LogAgentApiServiceImpl.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/LogAgentApiServiceImpl.java index 216b7c0e7..572d6a531 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/LogAgentApiServiceImpl.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/LogAgentApiServiceImpl.java @@ -48,7 +48,7 @@ import java.util.List; @Slf4j -@Service(interfaceClass = LogAgentApiService.class, group = "$dubbo.group", timeout = 10000) +@Service(interfaceClass = LogAgentApiService.class, group = "$dubbo.api.group", timeout = 10000) public class LogAgentApiServiceImpl implements LogAgentApiService { @Resource