1、记录日志内容
- 请求url
- 访问者 ip
- 调用方法 classMethod
- 参数 args
- 返回内容
2.新建aspect(切面)包
3.新建LogAspect日志处理类
package com.xl.blog.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component
public class LogAspect {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Pointcut("execution(* com.xl.blog.web.*.*(..))")
public void log(){
}
@Before("log()")
public void doBefore(JoinPoint joinPoint){
ServletRequestAttributes attributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request=attributes.getRequest();
String url=request.getRequestURL().toString();
String ip=request.getRemoteAddr();
String classMethod=joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName();
Object[] args=joinPoint.getArgs();
RequestLog requestLog=new RequestLog(url,ip,classMethod,args);
logger.info("Request :{}",requestLog);
}
@After("log()")
public void doAfter(){
}
@AfterReturning(returning = "result",pointcut = "log()")
public void doAfterRututn(Object result){
logger.info("Result:{}" , result);
}
private class RequestLog {
private String url;
private String ip;
private String classMethod;
private Object args;
public RequestLog(String url, String ip, String classMethod, Object args) {
this.url = url;
this.ip = ip;
this.classMethod = classMethod;
this.args = args;
}
@Override
public String toString() {
return "RequestLog{" +
"url='" + url + '\'' +
", ip='" + ip + '\'' +
", classMethod='" + classMethod + '\'' +
", args=" + args +
'}';
}
}
}
4.indexController类:
package com.xl.blog.web;
import com.xl.blog.NotFoundException;
import com.xl.blog.service.BlogService;
import com.xl.blog.service.TagService;
import com.xl.blog.service.TypeService;
import com.xl.blog.vo.BlogQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Conditional;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
public class IndexController {
@Autowired
private BlogService blogService;
@Autowired
private TypeService typeService;
@Autowired
private TagService tagService;
@GetMapping("/")
public String index(@PageableDefault(size = 8, sort = {"updateTime"}, direction = Sort.Direction.DESC) Pageable pageable,
Model model) {
model.addAttribute("page",blogService.listBlog(pageable));
model.addAttribute("types", typeService.listTypeTop(6));
model.addAttribute("tags", tagService.listTagTop(10));
model.addAttribute("recommendBlogs", blogService.listRecommendBlogTop(8));
return "index";
}
@PostMapping("/search")
public String search(@PageableDefault(size = 8, sort = {"updateTime"}, direction = Sort.Direction.DESC) Pageable pageable,
@RequestParam String query, Model model){
model.addAttribute("page",blogService.listBlog("%"+query+"%",pageable));
model.addAttribute("query",query);
return "search";
}
@GetMapping("/blog/{id}")
public String blog(@PathVariable Long id,Model model) {
model.addAttribute("blog",blogService.getAndConvert(id));
return "blog";
}
@GetMapping("/footer/newblog")
public String newblogs(Model model){
model.addAttribute("newblogs",blogService.listRecommendBlogTop(3));
return "_fragments :: newblogList";
}
}
5.新建ControllerExceptionHandler拦截器类
package com.xl.blog.handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
public class ControllerExceptionHandler {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHander(HttpServletRequest request,Exception e) throws Exception {
logger.error("Request URL:{},Exception:{}",request.getRequestURL(),e);
if(AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class)!=null){
throw e;
}
ModelAndView mv=new ModelAndView();
mv.addObject("url",request.getRequestURL());
mv.addObject("exception",e);
mv.setViewName("error/error");
return mv;
}
}
5.复制静态页面文件:
6.运行项目:
运行效果: