日志记录内容
- 请求 url
- 访问者 ip
- 调用的方法 classMethod
- 方法参数 args
- 返回的内容
配置日志记录
配置文件
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{50} -%msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{50} -%msg%n"
level:
root: info
yonmin: debug
file:
name: log/blog.log
max-size: 10MB
max-history: 7
配置文件分析
-
pattern.console
配置的为控制台输出的格式 -
pattern.file
配置的为日志文件中保存的日志的格式日志出格式: %d表示日期时问, %thread表示线程名, %-5level:级别从左显示5个字符宽度 %logger{50}表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息 %n是换行符 例如:%d{yyyy-MM-dd HH:mm:ss.} [%thread] %-5level %logger{50} -%msg%n
-
level.yonmin: debug
配置yonmin包下的日志级别。调整输出的日志级别,日志就只会在这个级别及以后的高级别生效
日志级别排序(从低级到高级):- trace
- debug
- info(Spring默认)
- warn
- error
-
file.name
配置日志文件保存的路径及文件名 -
file.max-size
日志文件的最大大小,默认为10MB -
max-history
日志文件的保存时间,默认为7天
记录日志类
使用@Aspect
注解定义一个日志切面类,并使用@Component
将切面类添加到容器中
@Aspect
@Component
public class LogAspect {
}
使用@Pointcut
注解在方法上创建一个切面对象
@Aspect
@Component
public class LogAspect {
// 创建切面对象
@Pointcut("execution(* yonmin.blog.controller.*.*(..))")
public void log(){}
}
execution表达式的写法可见我之前写的博客
@Before
:表示前置通知
@AfterReturning
:表示后置通知
@AfterThrowing
:表示异常通知
@After
:表示最终通知
@Round
:表示环绕通知
以上各种通知的区别也可以到我上面提到的博客中查看
记录日志类的全部内容如下:
package yonmin.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.http.HttpServletRequest;
import java.util.Arrays;
@Aspect
@Component
public class LogAspect {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// 创建切面对象
@Pointcut("execution(* yonmin.blog.controller.*.*(..))")
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(){
// logger.info("---------After----------");
}
@AfterReturning(returning = "result", pointcut = "log()")
public void doAfterReturn(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=" + Arrays.toString(args) +
'}';
}
}
}