首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >终于不用再问运维要日志文件了

终于不用再问运维要日志文件了

作者头像
一只牛博
发布2025-05-31 10:37:03
发布2025-05-31 10:37:03
9700
代码可运行
举报
运行总次数:0
代码可运行
  • 执行顺序@Before -> 方法体 -> @AfterThrowing -> @After

总结
  • @After 的触发范围更广,始终是最后一个执行的通知。
  • @AfterReturning 只在方法正常返回时触发,发生在 @After 之前。
为什么使用先创建表

如果我们采用的是时间纬度的分表,可以创建12个表对应的12个月,如果采用实时创建的话对于创建时机可能要仔细定夺,所以还不如直接给它创建完

注解实现

代码语言:javascript
代码运行次数:0
运行
复制
package com.todoitbo.baseSpringbootDasmart.annotation;

import java.lang.annotation.*;

/**
 * 自定义操作日志注解
 *
 * @author bo
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface  SysLog {

    /**
     * 功能模块
     *
     * @return java.lang.String
     */
    String operModule() default "";

    /**
     * 请求类型
     *
     * @return java.lang.String
     */
    String operType() default "";

    /**
     * description: describe
     
     * @return java.lang.String
     * @since 2024/11/22
     */
    String describe() default "";

}

AOP实现

代码语言:javascript
代码运行次数:0
运行
复制
/**
  * 设置操作日志切入点 记录操作日志 在注解的位置切入代码
*/
@Pointcut("@annotation(com.todoitbo.baseSpringbootDasmart.annotation.SysLog)")
public void operLogPointCut() {

}

/**
  * 正常返回通知,拦截用户操作日志,连接点正常执行完成后执行, 如果连接点抛出异常,则不会执行
  *
  * @param joinPoint 切入点
  * @param keys      返回结果
*/
@AfterReturning(value = "operLogPointCut()", returning = "keys")
public void saveOperLog(JoinPoint joinPoint, Object keys) {
  // 获取RequestAttributes
  RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  // 从获取RequestAttributes中获取HttpServletRequest的信息
  HttpServletRequest request = (HttpServletRequest) requestAttributes
    .resolveReference(RequestAttributes.REFERENCE_REQUEST);
  // 获取用户信息
  SysLoginInfo sysLoginInfo = LoginContextUtil.getSysLoginInfo();
  SysOperationLog sysOperationLog = new SysOperationLog();
  try {
    // 从切面织入点处通过反射机制获取织入点处的方法
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    // 获取切入点所在的方法
    Method method = signature.getMethod();
    // 获取操作
    SysLog opLog = method.getAnnotation(SysLog.class);
    if (opLog != null) {
      sysOperationLog.setOpDescribe(opLog.describe());
      sysOperationLog.setModule(opLog.operModule());
    }
    // 获取请求的类名
    String className = joinPoint.getTarget().getClass().getName();
    // 获取请求的方法名
    String methodName = method.getName();
    methodName = className + "." + methodName;
    sysOperationLog.setId(IdUtil.getSnowflake().nextId());
    sysOperationLog.setMethod(methodName);
    sysOperationLog.setRequest(JSONObject.toJSONString(joinPoint.getArgs()));
    sysOperationLog.setResponse(JSONObject.toJSONString(keys));
    sysOperationLog.setUrl(request.getRequestURI());
    sysOperationLog.setIp(IpUtil.getIpAddr(request));
    sysOperationLog.setUserId(ObjectUtil.isNotEmpty(sysLoginInfo) ? sysLoginInfo.getSysUser().getId() : 0);
    sysOperationLog.setUserName(ObjectUtil.isNotEmpty(sysLoginInfo) ? sysLoginInfo.getSysUser().getUserName() : "无登录信息!");
    sysOperationLogService.insertSysOperationLog(sysOperationLog);
  } catch (Exception e) {
    throw new BusinessException("保存操作日志失败!");
  }
}

效果展示

依次调用post和get方法

image-20241122172843535
image-20241122172843535
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 有话说
  • 构思
    • 为什么使用@after通知
      • after(后置通知)
      • afterReturning(返回通知)
      • 谁更“后”一点?
      • 执行时机对比
      • 示例说明
      • 总结
    • 为什么使用先创建表
  • 注解实现
  • AOP实现
  • 效果展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档