SpringBoot进阶之日志集成(logback)
大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫
「大佬可以绕过 ~」
如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了 Springboot 基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础 中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有 收获 ~
上期带大家学习了什么是 跨域 以及 Springboot 中如何处理它, 本期将带大家学习 SpringBoot 中如何集成 日志 工具,同样的,我们集成到 Springboot 中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码
本期没有太多的理论,大家跟着配就好了, 添加配置 resources/logback-spring.xml
配置好后, 我们运行项目,会发现跟目录多了一个 logs 的目录,那个就是日志文件,跟控制台产生的日志一样,被记录到文件里了。然后教大家怎么去打日志:
请求后发现控制台有打印,并且文件有记录,那么就成功了~ 依次类推,在你觉得需要记录的位置,进行日志记录就可以了,比如一些报错的地方或者一些关键点的地方
有时候,我们需要查看 sql 怎么执行的,但控制台啥输出没有可不行,下面教大家配一下:
配置好后,执行一下查询请求,会发现控制台有详细的 sql log 包括入参的值
本期就到这里结束了,总结一下,主要教大家如何在项目中配置 log ,因为我们的服务是跑在服务器上的,具体发生了啥,我们不知道,只能依赖 log ,所以还是比较重要的
Drools集成SpringBoot
为了更好的在项目中使用Drools,
需要把Drools集成到Spring Boot,
下面介绍集成的方法,
并且开发简单的Demo和测试用例。
pom.xml工程信息:
引入spring-boot-starter-web作为Web工程,对外提供Rest服务,
引入spring-boot-starter-log4j2日志框架,打印测试匹配结果,
引入spring-boot-starter-test测试框架,开发Junt5测试用例:
通过kie-spring引入Drools相关的jar包,
其依赖的spring版本都排除掉,
以上一步的spring boot依赖为准。
启动类DroolsApplication.java:
操作的对象Person,
Person.java:
对外提供的Rest服务,
可以对Person对象进行规则匹配,
提供了两个接口,
单个和批量的操作接口:
PersonRuleController.java:
在上面PersonRuleController中需要用到KieContainer,
这个必须在Spring中先初始化才能使用,
相关功能由DroolsAutoConfiguration.java提供:
在DroolsAutoConfiguration中指定了drl规则文件
所在目录rules/com/ai/prd/,
在src/main/resources/rules/com/ai/prd/目录下新建文件
ai-rules.drl:
规则1匹配名字为bob的人,并且调用工具类PersonRuleAction打印相关日志,
同时打印规则的名称和包路径到控制台。
规则2匹配年龄在25到65之间的打工人,
然后把匹配到的人直接打印到控制台。
PersonRuleAction.java在匹配到相应规则时被调用,
此处仅实现日志打印的功能:
在src/main/resources目录下,
新建日志配置文件Log4j2.xml:
日志文件配置后,
PersonRuleAction类打印的日志
不仅会输出到log/rule_result.log,
也会输出到控制台。
针对上面PersonRuleController提供的Rest接口,
开发两个Junit5的测试用例,
在src/test/java/目录下
创建PersonRuleControllerTest.java:
PersonRuleControllerTest执行后,
控制台输出:
cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieModule
大概率是rule规则文件有问题,
格式,中英文字符,语法等问题,
请确保规则文件正确。
可以安装相应插件打开规则文件,
请参考:
Drools的Eclipse_IDEA插件安装
Drools规则引擎 系列教程(一)SpringBoot整合 快速集成上手
《Drools7.0.0.Final规则引擎教程》之Springboot集成
Drools创建Maven工程
Springboot集成ES及JPA
springboot maven项目结构
package com.example.esboot.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Data
@NoArgsConstructor
@Accessors(chain =true)
@Document(indexName ="person",type ="_doc", shards =1, replicas =0)
public class Person {
private Integerid;
private Stringname;
private Stringsex;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getSex() {return sex;}
public void setSex(String sex) {this.sex = sex;}
}
Elasticsearch 的JPA 使用
PersonRepository.java
package com.example.esboot.repository;
import com.example.esboot.entity.Person;
import org.springframework.data.elasticsearch.annotations.Highlight;
import org.springframework.data.elasticsearch.annotations.HighlightField;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface PersonRepositoryextends ElasticsearchRepository {
@Highlight(fields = {
@HighlightField(name ="name"),
@HighlightField(name ="sex")
})
List findByNameOrSex(String text, String sex);
}
PersonService.java
package com.example.esboot.servcie;
import com.example.esboot.entity.Person;
import java.util.List;
public interface PersonService{
public Person findById(String id);
public String save(Person person);
Iterable findAll();
List findByNameOrSex(String text,String sex);
}
PersonServiceImpl.java
package com.example.esboot.servcie.impl;
import com.example.esboot.entity.Person;
import com.example.esboot.repository.PersonRepository;
import com.example.esboot.servcie.PersonService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class PersonServiceImplimplements PersonService {
@Resource
PersonRepositorypersonRepository;
@Override
public List findByNameOrSex(String text, String sex) {
List list =new ArrayList();
personRepository.findByNameOrSex(text, sex).forEach(personSearchHit -list.add(personSearchHit.getContent()));
return list;
}
@Override
public Person findById(String id) {
return personRepository.findById(id).get();
}
@Override
public String save(Person person) {
return personRepository.save(person).getName();
}
@Override
public Iterable findAll() {
return personRepository.findAll();
}
}
spring.elasticsearch.rest.uris=
spring.elasticsearch.rest.connection-timeout=300s
spring.data.elasticsearch.repositories.enabled=true
EsTest.java
package com.example.esboot.es;
import com.example.esboot.entity.Person;
import com.example.esboot.servcie.PersonService;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.junit.Test;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.List;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class EsTest {
@Resource
private ElasticsearchOperationselasticsearchOperations;
@Resource
private PersonServicepersonService;
@Test
public void test() {
Person person =new Person();
person.setId(1);
person.setName("baijie");
person.setSex("n");
IndexQuery indexQuery =new IndexQueryBuilder().withId(String.valueOf(person.getId())).withObject(person).build();
String docId =elasticsearchOperations.index(indexQuery, IndexCoordinates.of("person"));
System.out.println(docId);
}
@Test
public void save() {
Person person =new Person();
person.setId(2);
person.setName("中国");
person.setSex("男");
String name =personService.save(person);
System.out.println(name);
}
@Test
public void findByNameOrSex() {
List byNameOrSex =personService.findByNameOrSex("baijie","男");
System.out.println(byNameOrSex);
}
@Test
public void findAll() {
personService.findAll().forEach(person - {
System.out.println(person);
});
}
@Test
public void queryForObject() {
Person person =personService.findById("1");
System.out.println(person);
}
}