feat(java查询elk日志接口): java查询elk日志接口

java查询elk日志接口
This commit is contained in:
ovo 2024-12-24 13:39:36 +08:00
parent a9212be666
commit 2423e27b34
5 changed files with 224 additions and 19 deletions

View File

@ -0,0 +1,43 @@
package com.guwan.backend.controller;
import cn.easyes.core.biz.EsPageInfo;
import com.guwan.backend.elasticsearch.document.LogstashLog;
import com.guwan.backend.service.LogstashLogService;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
@RestController
@RequestMapping("/api/logs")
@RequiredArgsConstructor
public class LogController {
private final LogstashLogService logstashLogService;
@GetMapping("/search")
public List<LogstashLog> searchLogs(
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime,
@RequestParam(required = false) String level,
@RequestParam(required = false) String keyword) {
if (keyword != null) {
return logstashLogService.searchLogsByKeyword(keyword, startTime, endTime);
} else {
return logstashLogService.queryLogsByTimeRangeAndLevel(startTime, endTime, level);
}
}
@GetMapping("/errors")
public EsPageInfo<LogstashLog> getRecentErrors(
@RequestParam(defaultValue = "1") int pageNum,
@RequestParam(defaultValue = "10") int pageSize) {
return logstashLogService.getRecentErrorLogs(pageNum, pageSize);
}
}

View File

@ -0,0 +1,89 @@
package com.guwan.backend.elasticsearch.document;
import cn.easyes.annotation.IndexField;
import cn.easyes.annotation.IndexId;
import cn.easyes.annotation.IndexName;
import cn.easyes.annotation.rely.FieldType;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
import java.time.Instant;
@Data
@IndexName("logstash-logs-*")
public class LogstashLog {
@IndexId
private String id;
@JsonProperty("@timestamp")
@IndexField(value = "@timestamp", fieldType = FieldType.DATE)
private Instant timestamp;
@JsonProperty("@version")
@IndexField(fieldType = FieldType.KEYWORD)
private String version;
@IndexField(fieldType = FieldType.TEXT)
private String message;
@IndexField(fieldType = FieldType.TEXT)
private String level;
@IndexField(fieldType = FieldType.LONG)
private Long level_value;
@IndexField(fieldType = FieldType.TEXT)
private String logger_name;
@IndexField(fieldType = FieldType.TEXT)
private String thread_name;
@IndexField(fieldType = FieldType.TEXT)
private String stack_trace;
@IndexField(fieldType = FieldType.TEXT)
private String app_name;
@IndexField(fieldType = FieldType.TEXT)
private String host;
@IndexField(fieldType = FieldType.LONG)
private Long port;
@IndexField(fieldType = FieldType.TEXT)
private List<String> tags;
@Data
public static class GeoIP {
@IndexField(fieldType = FieldType.IP)
private String ip;
@IndexField(fieldType = FieldType.FLOAT)
private Float latitude;
@IndexField(fieldType = FieldType.FLOAT)
private Float longitude;
@IndexField(fieldType = FieldType.GEO_POINT)
private String location;
}
@IndexField(fieldType = FieldType.OBJECT)
private GeoIP geoip;
@JsonProperty("APP_NAME")
@IndexField(fieldType = FieldType.TEXT)
private String APP_NAME;
@JsonProperty("LOGSTASH_HOST")
@IndexField(fieldType = FieldType.TEXT)
private String LOGSTASH_HOST;
@JsonProperty("LOGSTASH_PORT")
@IndexField(fieldType = FieldType.TEXT)
private String LOGSTASH_PORT;
}

View File

@ -0,0 +1,9 @@
package com.guwan.backend.elasticsearch.mapper;
import cn.easyes.core.conditions.interfaces.BaseEsMapper;
import com.guwan.backend.elasticsearch.document.LogstashLog;
import org.springframework.stereotype.Repository;
@Repository
public interface LogstashLogEsMapper extends BaseEsMapper<LogstashLog> {
}

View File

@ -0,0 +1,54 @@
package com.guwan.backend.service;
import cn.easyes.core.biz.EsPageInfo;
import cn.easyes.core.conditions.LambdaEsQueryWrapper;
import com.guwan.backend.elasticsearch.document.LogstashLog;
import com.guwan.backend.elasticsearch.mapper.LogstashLogEsMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service
@RequiredArgsConstructor
public class LogstashLogService {
private final LogstashLogEsMapper logstashLogEsMapper;
/**
* 按时间范围和日志级别查询
*/
public List<LogstashLog> queryLogsByTimeRangeAndLevel(Date startTime, Date endTime, String level) {
LambdaEsQueryWrapper<LogstashLog> wrapper = new LambdaEsQueryWrapper<>();
wrapper.between(LogstashLog::getTimestamp, startTime, endTime)
.eq(LogstashLog::getLevel, level)
.orderByDesc(LogstashLog::getTimestamp);
return logstashLogEsMapper.selectList(wrapper);
}
/**
* 按关键字搜索日志内容
*/
public List<LogstashLog> searchLogsByKeyword(String keyword, Date startTime, Date endTime) {
LambdaEsQueryWrapper<LogstashLog> wrapper = new LambdaEsQueryWrapper<>();
wrapper.between(LogstashLog::getTimestamp, startTime, endTime)
.match(LogstashLog::getMessage, keyword)
.orderByDesc(LogstashLog::getTimestamp);
return logstashLogEsMapper.selectList(wrapper);
}
/**
* 分页查询最近的错误日志
*/
public EsPageInfo<LogstashLog> getRecentErrorLogs(int pageNum, int pageSize) {
LambdaEsQueryWrapper<LogstashLog> wrapper = new LambdaEsQueryWrapper<>();
wrapper.orderByDesc(LogstashLog::getTimestamp)
.from((pageNum - 1) * pageSize)
.size(pageSize);
return logstashLogEsMapper.pageQuery(wrapper, pageNum, pageSize);
}
}

View File

@ -28,6 +28,7 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.slf4j.MDC;
import java.time.LocalDateTime;
@ -172,24 +173,34 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
@OperationLog(description = "根据Id获取用户信息")
@Cacheable(value = "userCache", key = "#id")
public UserDTO getUserById(Long id) {
log.info("查询redis缓存");
// 先从缓存获取
Object cached = redisUtil.get(USER_CACHE_KEY + id);
if (cached != null) {
return (UserDTO) cached;
}else {
log.info("redis缓存为空");
}
MDC.put("userId", String.valueOf(id)); // 添加用户ID到日志上下文
try {
log.info("开始获取用户信息");
// Redis缓存检查
Object cached = redisUtil.get(USER_CACHE_KEY + id);
if (cached != null) {
log.debug("Redis缓存命中, userId={}", id);
return (UserDTO) cached;
}
log.debug("Redis缓存未命中");
log.info("查询数据库, id: {}", id);
User user = userMapper.selectById(id);
if (user == null) {
return null;
}
// 数据库查询
log.debug("从数据库查询用户信息, userId={}", id);
User user = userMapper.selectById(id);
if (user == null) {
log.warn("用户不存在, userId={}", id);
return null;
}
UserDTO userDTO = convertToDTO(user);
redisUtil.set(USER_CACHE_KEY + id, userDTO, USER_CACHE_DURATION);
return userDTO;
UserDTO userDTO = convertToDTO(user);
redisUtil.set(USER_CACHE_KEY + id, userDTO, USER_CACHE_DURATION);
log.info("用户信息获取成功, userId={}", id);
return userDTO;
} finally {
MDC.remove("userId"); // 清理上下文
}
}
@Override
@ -208,7 +219,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
User user = this.lambdaQuery().eq(User::getUsername, changePasswordDTO.getInfo()).one();
//传入密码 库中密码
//matches传入密码 库中密码
boolean matches = passwordEncoder.matches(changePasswordDTO.getCode(), user.getPassword());
if (!matches){
log.error("原密码不正确");
@ -226,8 +237,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
}
}
if (changePasswordDTO.getChangeWay().equals(UserEnums.ACCOUNT.getValue())){