搭建日志系统
绝大多数项目在后台管理中都有日志管理。以前的日志信息是存储在 MySQL 中,日志
随着项目运行时间会越来越多,一直存储在 MySQL 会导致查询降低。现在的日志信息通过
ELK 技术栈进行操作。存储在 Elasticsearch 中,可以更好的分析日志内容及更快查询效率。
给定简单需求:
搭建日志系统,提供查询 Elasticsearch 中日志信息的接口。
1 新建项目
名称为 ELK_Demo
2 修改 pom.xml
搭建最基本的环境,实现需求,没有考虑 Spring Cloud 相关环境,如果考虑 Spring Cloud还需要配置 Eureka 等信息。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
3 创建配置文件
在 resources 下新建 application.yml 配置文件。
配置 Elasticsearch 相关配置信息。
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.8.140:9300
4 新建实体
根据 kibana 中查看到日志信息可以得出看出,除了 message 是类类型,里面包含一些其他属性外,其他的属性都是简单类型属性。
新建 com.bjsxt.pojo.Log。
注意@version 和@timestamp 要使用@JsonProperty 进行接收。
@Data
@Document(indexName = "test_log",type = "doc")
public class Log {
@Id
private String id;
@Field(type= FieldType.Text)
private String host;
@Field(type= FieldType.Text)
private String message;
@Field(type= FieldType.Long)
private Long port;
@Field(type = FieldType.Date)
@JsonProperty("@timestamp")
private Date timestamp;
@Field(type = FieldType.Text)
@JsonProperty("@version")
private String version;
}
5 新建 service 及实现类
新建 com.bjsxt.service.LogService 及实现类
public interface LogService {
List<Log> selectByPage(int page,int size);
}
@Service
public class LogServiceImpl implements LogService {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Override
public List<Log> selectByPage(int page, int size) {
SearchQuery sq = new NativeSearchQuery(QueryBuilders.matchAllQuery());
sq.setPageable(PageRequest.of(page-1,size));
return elasticsearchTemplate.queryForList(sq,Log.class);
}
}
6 新建控制器
新建 com.bjsxt.controller.LogController
@Controller
public class LogController {
@Autowired
private LogService logService;
@RequestMapping("/page")
@ResponseBody
public List<Log> showPage(int page,int size){
return logService.selectByPage(page,size);
}
}
7 测试结果
在浏览器输入: http://localhost:8080/page?page=1&size=2
会看见下面的结果。