@Service
public class LogServiceImpl implements LogService {
public static final String LOG_FILE_NAME = System.getenv("LOG_FILE_NAME");
private static final String LOG_PATTERN = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d+ [+-]\\d{4}) \\[([^\\]]+)\\] ([A-Z]+)\\s*\\(([^:]+:\\d+)\\) - (.*)";
private final Logger logger = Logger.getLogger(LogServiceImpl.class);
private String getLogString() {
String logString;
try {
logString = new String(Files.readAllBytes(Paths.get(LOG_FILE_NAME)));
} catch (IOException e) {
e.printStackTrace();
return null;
}
return logString;
}
@Override
public LogsResponseModel getLogs(LocalDateTime startDate, LocalDateTime endDate, int limit, int offset, List<TypeOfLog> typeList, String searchString) {
List<LogModel> logModels = parseLogs(getLogString());
int countBeforeFiltering = logModels.size();
logModels = logModels.stream()
.filter(log -> log.getTimestamp().isAfter(startDate) && log.getTimestamp().isBefore(endDate))
.collect(Collectors.toList());
if (typeList != null && !typeList.isEmpty()) {
logModels = logModels.stream()
.filter(log -> typeList.stream().anyMatch(type -> log.getLogLevel().equals(type.value())))
.collect(Collectors.toList());
}
if (searchString != null && !searchString.isEmpty()) {
logModels = logModels.stream()
.filter(log -> log.toString().contains(searchString))
.collect(Collectors.toList());
}
int count = logModels.size();
int fromIndex = Math.min(offset, logModels.size());
int toIndex = Math.min(offset + limit, logModels.size());
logModels = logModels.subList(fromIndex, toIndex);
return new LogsResponseModel(count, logModels);
}
private List<LogModel> parseLogs(String logString) {
List<LogModel> logs = new ArrayList<>();
Pattern pattern = Pattern.compile(LOG_PATTERN);
Matcher matcher = pattern.matcher(logString);
while (matcher.find()) {
LocalDateTime dateTime = LocalDateTime.parse(matcher.group(1), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss,SSS Z"));
LogModel logEntry = new LogModel(dateTime, matcher.group(3), matcher.group(4), matcher.group(2), matcher.group(5));
logs.add(logEntry);
}
return logs;
}
}
我有这个代码。对于 50mb 文件,它的工作时间约为 1.5 秒。
对于我的需求,它应该工作得更快。
我相信最慢的地方是从文件中读取字符串,但我无法通过docker容器来分析它
有什么建议可以让它更快吗?
如果您有多核处理器,请尝试使用 .parallelStream() 而不是 .stream()