JAVA程序,MYSQL日志表按月分区

java程序, AOP(Aspect Oriented Programming)环绕通知,记录接口调用日志。

package springboot.aop;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import springboot.aop.dao.RequestLogMapper;
import springboot.aop.entity.RequestLog;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

/**
 * @author cruder
 * @version 1.0
 * @date 2023-05-12 10:07:54 
 */
@Aspect
@Component
@Slf4j
public class CallLogAspect {

    @Resource
    private RequestLogMapper requestLogMapper;

    /**
     * 切controller中的所有方法
     */
    @Pointcut("execution(* springboot..controller..*(..))")
    public void point() {
    }

    @Around("point()")
    public Object doBefore(ProceedingJoinPoint joinPoint) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        log.info("---------------------------------------------------------------------------");
        String IP = request.getRemoteAddr();
        log.info("【请求源头】 IP={},URL={},Method={}",IP , request.getRequestURL().toString(), request.getMethod());
        String requestParam ;
        RequestLog requestLog = new RequestLog();
        requestLog.setRequestIp(IP);
        requestLog.setUrl(request.getRequestURL().toString());
        requestLog.setMethod(request.getMethod());
        if ("GET".equals(request.getMethod())) {
            requestParam = request.getQueryString();
            if(requestParam!=null && requestParam.length()<1000){
                log.info("【请求参数】 {}", requestParam);
                requestLog.setRequestParam(requestParam);
            }
        } else {
            requestParam = Arrays.toString(joinPoint.getArgs());
            if(requestParam.length()<1000){
                log.info("【请求参数】 {}", requestParam);
                requestLog.setRequestParam(requestParam);
            }
        }
        Object re = joinPoint.proceed();
        String returnParam = JSON.toJSONString(re);
        if(returnParam.length()<1000){
            log.info("【请求返回】 {}", returnParam);
            requestLog.setReturnParam(returnParam);
        }
        requestLog.setUserId("cruder");
        requestLogMapper.insert(requestLog);
        log.info("---------------------------------------------------------------------------");


        return re;
    }

}

mysql 建立分区表

SHOW VARIABLES LIKE '%partition%';
SELECT @@version;
SELECT VERSION();
SHOW VARIABLES LIKE '%version%';
SHOW VARIABLES
    WHERE variable_name LIKE 'version%';


create table request_log
(
    request_ip    VARCHAR(16)                             null comment '请求ip',
    user_id       VARCHAR(32)                             null comment '用户编码',
    url           VARCHAR(256)                            null comment '请求url',
    method        VARCHAR(16)                             null comment '请求方法',
    request_param VARCHAR(1000)                           null comment '请求参数',
    return_param  VARCHAR(1000)                           null comment '返回参数',
    create_time   TIMESTAMP default CURRENT_TIMESTAMP
)
    comment '接口请求日志表'
partition by range (UNIX_TIMESTAMP(create_time))(
    PARTITION p0 values less than (UNIX_TIMESTAMP('20230501')),
    PARTITION p1 values less than (UNIX_TIMESTAMP('20230601')),
    PARTITION p2 values less than (UNIX_TIMESTAMP('20230701')),
    PARTITION p999 values less than MAXVALUE
    );

-- 为分区表添加n个分区:
ALTER TABLE request_log ADD PARTITION (PARTITION p3 values less than (UNIX_TIMESTAMP('20230801')));

-- 删除一个分区已经分区内的所有数据
ALTER TABLE request_log DROP PARTITION p999;

-- 删除分区,但保留分区内的数据
ALTER TABLE request_log TRUNCATE PARTITION p999;

-- 重建分区,即先删除分区中的所有记录,然后重新插入。可用于整理分区碎片。
ALTER TABLE request_log REBUILD PARTITION p0, p1;

-- 优化分区,整理分区碎片
ALTER TABLE request_log OPTIMIZE PARTITION p0, p1;

-- 修补分区
ALTER TABLE request_log REPAIR PARTITION p0,p1;

-- 检查分区
ALTER TABLE request_log CHECK PARTITION p1;

-- 查看某个schema下某个表的分区信息
SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME LIKE 'request_log';

-- 查看某个schema下某个表的分区信息
ALTER TABLE request_log ANALYZE PARTITION p1;

select month(now());
select unix_timestamp(now());
select day(now());
select to_days(now());
select to_days('20230512');
select year(now());
select dayofmonth(now());
select dayofyear(now());

select * from request_log

explain select * from request_log where create_time > '2023-05-01 00:00:00' and create_time < '2023-05-31 23:59:59'
order by create_time asc;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值