# enhance **Repository Path**: sunyuanhang/enhance ## Basic Information - **Project Name**: enhance - **Description**: improve - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-15 - **Last Updated**: 2023-03-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ###### 须知 > 一般情况下,filebeat和logstash都能采集日志信息;filebeat是轻量级的; > 一般的流程是 filebeat --> elasticsearch --> kibana > 但是我们也可以采用如下的流程进行操作: > filebeat --> logstash --> elasticsearch --> kibana > > filebeat可以将采集的数据放到 ES、Redis、Logstash、file文件中 > > **存入Redis中** ```shell [root@logstash ~]# vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/nginx_json.log json.keys_under_root: true json.overwrite_keys: true output.redis: hosts: ["172.16.1.53:6381"] db: "0" key: "nginx_json_redis" ``` **指定ES存储** ```shell [root@logstash ~]# vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/nginx_json.log output.elasticsearch: hosts: ["10.0.0.51:9200"] index: "nginx_json-%{+yyyy.MM.dd}" #filebeat 不支持自定义索引,需要添加下面的setup几项 #index: "nginx_json-%{[beat.version]}-%{+yyyy.MM.dd}" 如果有多个filebeat版本号,可以加上filebeat版本 setup.template.pattern: "nginx-*" setup.template.overwrite: false setup.template.json.enabled: true #注意 这几行配置必须顶个写 setup.template.enabled: false setup.ilm.enabled: false [root@logstash ~]# systemctl restart filebeat ```` **收集到LogStash** ```shell [root@logstash ~]# vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/nginx_json.log json.keys_under_root: true json.overwrite_keys: true output.logstash: hosts: ["10.0.0.54:6666"] ``` **配置LogStash传递给ES** ```shell [root@logstash ~]# vim /etc/logstash/conf.d/filebeat_logstash_es.conf input { beats { port => 6666 } } output { elasticsearch { hosts => ["10.0.0.51:9200"] index => "ngx_file_log_es_%{+YYYY-MM-dd}" } } ``` **认识一些重要的handler处理** - 关于数据持久化的转化 > 需求:现在有这样的需求是我的数据库中的某个字段的类型是varchar 也就是对应jdbcType=VARCHAR,现在我需要将查询的数据持久化到数据库中,但是数据类型是List > 这样操作的时候就会报类型转化异常,那么如何处理呢? ```java /**解决的思路如下: 持久化涉及到底层的接口是typeHandler,我们在TypeHandler生命我们需要转化的类型,如: TypeHandler> * 我们创建一个类来实现这个接口: * @MappedTypes(List.class) 当前数据的类型 * @MappedJdbcTypes(JdbcType.VARCHAR) 持久化数据库的类型 * / ``` - 关于前端传递参数转化的问题 > 需求:比如:现在前端传递 regisDate = "2022-12-11 23:12:11" 这样的字符串的形式,但是在我们后台字段regisDate是Date类型的,这样就会导致类型转化异常, > 那么怎么解决这个问题呢? > 数据类型转化 > 在Spring中目前支持三种类型的转化器: > Converter:将 S 类型对象转为 T 类型对象 > ConverterFactory:将 S 类型对象转为 R 类型及子类对象 > GenericConverter:它支持多个source和目标类型的转化,同时还提供了source和目标类型的上下文,这个上下文能让你实现基于属性上的注解或信息来进行类型转换 > todo: > 这3种类型转换器使用的场景不一样,我们以Converter为例。 > 假如:接口中接收参数的实体对象中,有个字段的类型是Date,但是实际传参的是字符串类型:2021-01-03 10:20:15,要如何处理呢? >

> 第一步,定义一个实体User: > 第二步,实现Converter接口: > 第三步,将新定义的类型转换器注入到spring容器中: > ```java @Component public class DataTypeConvert implements Converter { private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public Date convert(String s) { Date date = new Date(); if (s != null && !"".equals(s)) { try { date = simpleDateFormat.parse(s); } catch (ParseException e) { e.printStackTrace(); } } return date; } } ``` - 关于请求结果封装的问题 > 当然,我们可以自定义一个返回包装类来进行响应的接受,我们也可以不需要进行包装类的封装 > 几个重要的SpringMvc组件: > 1、RequestMappingHandlerAdapter: 这个中可以帮助我们获取请求参数的解析器、返回值解析器、消息转化器等 > 2、HandlerMethodReturnValueHandler: 返回值处理器,所有请求的返回值结构都会由这个接口来处理,我们只需要实现这个接口,来编写自己的业务逻辑 > 3、RequestResponseBodyMethodProcessor: 这个是HandlerMethodReturnValueHandler的实现类主要的作用是:RequestResponseBodyMethodProcessor处理@RequestBody注解和@ResponseBody注解