2023年7月17日发(作者:)
微服务下实现⾃定义⽇志格式(AOP)与ELK技术栈的整合(1)记录⼯作过程中新技术的整合与引⽤。刚刚⼊职新公司,可能简历写的有些许惊艳,同时公司业务需要,领导就将引⼊ELK规范⽇志的重任交给我了。按照领导对项⽬的介绍我做了以下总结:需求有两个:a.⽇志需要规范格式,是json的形式,便于展⽰,⽽且最好是对代码的侵⼊性越⼩越好b.⽇志需要被logstash收集,通过kibana展⽰在页⾯上,并且需要通过spring-data-es操作elasticsearch将⽇志做全⽂搜索返给前端做展⽰问题有两个:a.按照之前的想法,将⽇志规范格式之后写到数据库,更容易查询,但是数据库⽂件会越来越⼤,⾮常影响查询效率。规范格式的⽇志如何被logstash收集呢?如何区分操作⽇志和后台⽇志呢b.⽇志被logstash收集之后,如何展⽰到前端页⾯上呢下⾯我会详细的记录我的对这个需求的⼼路与实施历程以及遇到的坑和怎么填的坑:⾸先需要解决的是第⼀个需求:代码侵⼊性⼩,格式规范,内容⾃定义,我们⾸先想到的就是使⽤AOP实现,上代码⾸先是⾃定义注解,写在控制器类的单元⽅法上(业务层实现类的实现⽅法上也是可以的),注明切点的位置@Target() //
⽅法注解@Retention(E) //
运⾏时可见public @interface LogAnno { String operateType() default "";//
记录⽇志的操作类型 String operateServer() default "";//记录⽇志的操作模块 String instructionsOperate() default "";//记录⽇志的操作指令 String instructionsType() default "";//记录⽇志中的操作指令的操作类型}切⾯:@Order(3)@Component@Aspect@Slf4jpublic class LogAopAspect { @Autowired private UserServerFeign userServerFeign; /** *
环绕通知记录⽇志通过注解匹配到需要增加⽇志功能的⽅法 * * @param pjp * @return * @throws Throwable */ @Around("@annotation(o)") public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable { // 1.⽅法执⾏前的处理,相当于前置通知 //
获取⽅法签名 MethodSignature methodSignature = (MethodSignature) nature(); //
获取⽅法 Method method = hod(); //
获取⽅法上⾯的注解 LogAnno logAnno = otation(); String userName=null; String enterpriseId=null; HttpServletRequest request = uest(); Enumeration
获取操作描述的属性值 String operateType = eType(); //获取操作模块的属性值 String operateServer = eServer(); //获取操作类型 String instructionsType = ctionsType(); //获取操作指令 String instructionsOperate = ctionsOperate(); JSONObject message = new JSONObject(); ("operateType",operateType); ("operateServer",operateServer); ("instructionsOperate",instructionsOperate); ("instructionsType",instructionsType); ("enterpriseId",enterpriseId); String ip = ddress(); ("ip",ip); ("operateor",userName); Object result = null; try { //
让代理⽅法执⾏ result = d(); // 2.相当于后置通知(⽅法成功执⾏之后⾛这⾥) //rateResult("正常");//
设置操作结果 ("operateResult","正常"); } catch (SQLException e) { // 3.相当于异常通知部分 //rateResult("失败");//
设置操作结果 ("operateResult","失败"); } finally { // 4.相当于最终通知 Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//可以⽅便地修改⽇期格格式 String format = (now); //rateDate(format);//
设置操作⽇期 ("operateDate",format); // (logEntity);//
添加⽇志记录 //将产⽣的操作记录写到磁盘中 //(logEntity+""); (String()); } return result; }其中的json跟map之间的转换也可以使⽤实体类来实现,直接new⼀个实体类,对属性赋值,但是我建议⼤家不要这么做,亲测不好⽤控制器类的单元⽅法: @PostMapping("/background") @LogAnno(instructionsOperate = "内容推送",instructionsType = "⽴即操作") @ApiOperation(value = "⼿动推送背景更新信息", notes = "⼿动推送背景更新信息:id(需要推送的⽂件的id),snList:需要推送的消息的设备的序列号,action:推送的消息类型:add:添加,packagename:需要推送的包名(oard:⽩板,:签到,ewords:欢迎词)") @ApiImplicitParam(name = "access_token",value = "令牌",required = true,dataType = "String",paramType = "header") public Result backgroundPush(@RequestParam(value = "id",required = true) Integer id, @RequestParam(value = "snList", required = true) List
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689545145a264965.html
评论列表(0条)