SpringBoot日志处理

  • Post author:
  • Post category:其他



日志配置

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) +
                    '}';
        }
    }
}

结果: