1、日志yml配置(利用springboot自带的日志slf4j,无需额外引用jar包)
logging:
path: photostock/logs/
level:
root: info #root表示所有目录,info级别
2、日志使用方法演示
@RestController
@RequestMapping("/stock")
public class StockController {
private Logger logger = LoggerFactory.getLogger(StockController.class);
@GetMapping("/test")
public Object test() throws Exception{
logger.info("测试异常");
int i = 1/0;
return "stock";
}
}
3、日志自动化记录异常
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice("com.njwd.photostock.controller")
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String, Object> errorMsg(HttpServletRequest request,Exception ex){
logger.error("错误链接"+request.getRequestURL().toString());
//将异常信息写入stream流,然后存入log
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ex.printStackTrace(new PrintStream(baos));
logger.info(baos.toString());
Map<String, Object> errorMsgResult=new HashMap<>();
errorMsgResult.put("code", 500);
errorMsgResult.put("msg", "文件错误请联系管理员");
return errorMsgResult;
}
}
4、通过AOP记录请求信息到日志文件
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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.http.HttpServletRequest;
import java.util.Enumeration;
@Aspect
@Component
public class WebLogAspect {
private Logger logger = LoggerFactory.getLogger(getClass());
@Pointcut("execution(public * com.njwd.photostock.controller.*.*(..))")
private void weblog(){}
@Before("weblog()")
private void doBefore(JoinPoint joinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
logger.info("URL: "+request.getRequestURL().toString());
logger.info("HTTP_METHOD: "+request.getMethod());
logger.info("IP: "+request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = enu.nextElement();
logger.info("name:{},value:{}", name, request.getParameter(name));
}
}
@AfterReturning(returning = "ret", pointcut = "weblog()")
public void doAfterReturning(Object ret) throws Throwable {
logger.info("RESPONSE: " + ret);
}
}