日志配置
1、在yml配置文件中配置日志
# 日志
logging:
level:
root: info
# 项目包名下日志级别 (可以设置也可以不用,自己的项目包名)
com.pqy: debug
# 生成日志文件路径
file:
name: log/blog-dev.log
拓展:一般情况下使用application配置logging即可。
但是随着时间积累log信息会越来越长而且不便查阅,此时可以按照日期分割日志信息,即日志名中包含日期信息,不同日期的日志存成不同的文件。
通过xml配置可以更改 日志保留时间,日志文件分割时大小(springboot默认10M时分割日志文件)、按日期分割日志文件等等
按日志大小分割
logback-spring.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--包含Spring boot对logback日志的默认配置-->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<!--重写了Spring Boot框架 org/springframework/boot/logging/logback/file-appender.xml 配置-->
<appender name="TIME_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i</fileNamePattern>
<!--保留历史日志一个月的时间-->
<maxHistory>30</maxHistory>
<!--
Spring Boot默认情况下,日志文件10M时,会切分日志文件,这样设置日志文件会在100M时切分日志
-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="TIME_FILE" />
</root>
</configuration>
<!--
1、继承Spring boot logback设置(可以在appliaction.yml或者application.properties设置logging.*属性)
2、重写了默认配置,设置日志文件大小在100MB时,按日期切分日志,切分后目录:
my.2021-08-01.0 80MB
my.2021-08-01.1 10MB
my.2021-08-02.0 56MB
my.2021-08-03.0 53MB
......
-->
日志处理 (保存请求url,访问者ip,调用的方法,传入参数,返回值)
如下日志记录:
2022-03-07 17:43:22.014 INFO 3916 --- [http-nio-8080-exec-2] com.pqy.blog.aspect.LogAspect : Request : RequestLog {url='http://localhost:8080/1/jay', ip='0:0:0:0:0:0:0:1', classMethod='com.pqy.blog.web.IndexController.test', args=[1, jay]}
// url:请求url
// ip: 访问者ip地址
// calssMethod : 调用的方法
// args : 访问方法传入的参数
利用切面(aop)来开发 记录日志类
pom.xml引入Aspect(切面)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
/**
* @author panqiyi
* @date 2022/3/7 - 11:44
*/
// 日志处理
@Aspect
@Component
public class LogAspect {
// 获取日志对象’
public final Logger logger = LoggerFactory.getLogger(this.getClass());
/*切点,所有web下的controller类的方法*/
@Pointcut("execution(* com.pqy.blog.web.*.*(..))")
public void log(){}
@Before("log()")
public void doBefore(JoinPoint joinPoint){
logger.info("----------doBefore-----------");
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("----------doAfter-----------");
}
// 返回值
@AfterReturning(returning = "result",pointcut = "log()")
public void doAfterReturn(Object result){
logger.info("Result : {}",result);
}
/*记录日志内容*/
private class RequestLog{
private String url; // 请求的url
private String ip; // 访问者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) +
'}';
}
}
}
结果: