栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot项目日志切面与保存日志记录笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot项目日志切面与保存日志记录笔记

所需额外依赖

    org.springframework.boot
    spring-boot-starter-aop


    com.alibaba
    fastjson
    1.2.62
        
切面类
package com.zy.admin.aspect;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.zy.admin.domain.ExceptionLog;
import com.zy.admin.domain.Syslog;
import com.zy.admin.mapper.ILogMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;


@Aspect
@Component
public class LogAspect {

    private Date visitTime; //访问时间
    private String username;    //操作者用户名
    private String url; //访问ip
    private String ip;  //访问资源url
    private String classMethod; //访问方法
    private String args;  //访问参数


    @Autowired
    private HttpServletRequest request;

    @Autowired
    private ILogMapper logMapper;

    
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    
    @Pointcut("execution(* com.zy.admin.web.*.*(..))")
    public void log(){}
    @Pointcut("execution(* com.zy.admin.web.admin.*.*(..))")
    public void log1(){}

    
    @Before("log() || log1()")
    public void doBefore(JoinPoint joinPoint){
        visitTime = new Date();
        url = request.getRequestURL().toString();   //获取url

        //获取ip
        ip = "";
        String ip1 = request.getHeader("X-Forwarded-For");
        if(ip1 != null && !"unKnown".equals(ip1)){
            int index = ip1.indexOf(",");
            if(index != -1){
                ip = ip1.substring(0,index);
            }else{
                ip = ip1;
            }
        }else{
            ip1 = request.getHeader("X-Real-IP");
            if(ip1 != null && !"unKnown".equals(ip1)){
                ip = ip1;
            }else{
                ip = request.getRemoteAddr();
            }
        }

        //获取执行方法
        classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();

        //获取传入参数
        Object[] argsValue = joinPoint.getArgs();
        args = Arrays.toString(argsValue);

        //获取当前操作的用户
        SecurityContext context = SecurityContextHolder.getContext();  //从上下文中获取当前登录的用户
        Object principal = context.getAuthentication().getPrincipal();
        if("anonymousUser".equals(principal)){
            username = null;
        }else{
            User user = (User) principal;
            username = user.getUsername();
        }

        logger.info("--------------------------------BeforeStart-----------------------------------------");
        logger.info("url : {}", url);
        logger.info("ip : {}", ip);
        logger.info("classMethod : {}", classMethod);
        logger.info("args : {}", args);
        logger.info("username : {}", username);
        logger.info("visitTime : {}", visitTime);
        logger.info("--------------------------------BeforeEnd-----------------------------------------");
    }

    
    @AfterReturning(returning = "resultValue",pointcut = "log() || log1()")
    public void doAfterReturn(Object resultValue) throws Exception {
        //获取返回值
        String result = JSON.toJSONString(resultValue, SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteMapNullValue);
        //获取执行时间
        Long executionTime = new Date().getTime() - visitTime.getTime();

        logger.info("--------------------------------doAfterReturnStart-----------------------------------------");
        logger.info("Result : {}", resultValue);
        logger.info("executionTime : {}", executionTime);
        logger.info("--------------------------------doAfterReturnEnd-----------------------------------------");

        //构建日志类
        Syslog syslog = new Syslog(null, visitTime, username, url, ip, executionTime, classMethod, args, result);
        //存入数据库
//        logMapper.saveSyslog(syslog);
    }

    
    @AfterThrowing(throwing = "e",pointcut = "log() || log1()")
    public void doAfterThrowing(Throwable e) throws Exception {
        //获取异常出现时间
        Date happenTime = new Date();
        //获取异常详细信息
        String exceptionJson = JSON.toJSONString(e, SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteMapNullValue);
        //获取异常简单信息
        String exceptionMessage = e.getMessage();
        //获取执行时间
        Long executionTime = new Date().getTime() - visitTime.getTime();

        logger.info("--------------------------------doAfterThrowingStart-----------------------------------------");
        logger.info("exceptionJson : {}", exceptionJson);
        logger.info("exceptionMessage : {}", exceptionMessage);
        logger.info("happenTime : {}", happenTime);
        logger.info("executionTime : {}", executionTime);
        logger.info("--------------------------------doAfterThrowingEnd-----------------------------------------");

        //构建错误日志类
        ExceptionLog exceptionLog = new ExceptionLog(null, exceptionMessage, happenTime,url,executionTime,classMethod,args);
        //存入数据库
//        logMapper.saveExceptionLog(exceptionLog);
    }

    
    @After("log() || log1()")
    public void After(){
        logger.info("--------------------------------doAfter----------------------------------------");
    }


}
日志类
package com.zy.admin.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class Syslog {

    private Long id;
    private Date visitTime; //访问时间
    private String username;    //操作者用户名
    private String url; //访问ip
    private String ip;  //访问资源url
    private Long executionTime;  //执行时长
    private String classMethod; //访问方法
    private String args;  //访问参数
    private String result;  //返回数据
}
package com.zy.admin.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;


@AllArgsConstructor
@NoArgsConstructor
@Data
public class ExceptionLog {

    private Long id;
    private String exceptionMessage;    //异常简单信息
    private Date happenTime;    //异常发生时间
    private String url;  //访问资源url
    private Long executionTime;  //执行时长
    private String classMethod; //访问方法
    private String args;  //访问参数
}
Mapper
package com.zy.admin.mapper;

import com.zy.admin.domain.ExceptionLog;
import com.zy.admin.domain.Syslog;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ILogMapper {

    
    void saveSyslog(Syslog syslog) throws Exception;

    
    void saveExceptionLog(ExceptionLog exceptionLog) throws Exception;
}
sql




    
        insert into syslog (id,visit_time,username,ip,url,execution_time,class_method,args,result) values
        (UUID_SHORT(),#{visitTime},#{username},#{ip},#{url},#{executionTime},#{classMethod},#{args},#{result})
    

    
        insert into exception_log (id,happen_time,exceptionMessage,url,execution_time,class_method,args) values
        (UUID_SHORT(),#{happenTime},#{exceptionMessage},#{url},#{executionTime},#{classMethod},#{args})
    

数据库表
-- 日志表
create table syslog(
	id bigint not null primary key,
	visit_time timestamp,  -- 访问时间
	username varchar(50),  -- 操作者用户名
	ip varchar(30),  -- 访问ip
	url varchar(50),  -- 访问资源url
	execution_time bigint,  -- 执行时长
	class_method varchar(200),  -- 访问方法
	args text,  -- 传入参数
	result text  -- 返回数据
);

-- 错误日志表
create table exception_log(
	id bigint not null primary key,
	happen_time timestamp,  -- 异常发生时间
	exceptionMessage varchar(100),  -- 异常简单信息
	url varchar(100),  -- 访问资源url
	execution_time bigint,  -- 执行时长
	class_method varchar(200),  -- 访问方法
	args text  -- 传入参数
);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/287377.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号