1.在实际项目中,常见的日志打印级别:OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL(从高到地低),日志打印级别全局配置,级别越低日志越多,常见的打印日志级别INFO 、 DEBUG 但我们不常会发现打印的日志越多 我们查错起来很不方便 如我们想要打印接口返回的数据,如果单单打印在INFO 、 DEBUG级别里 查看实时日志日 就会瞬间满满的霸屏了 如下这样:
2.如上这样 我们看实时日志很不方便 特别是用户量特别大的时候 这更加使我们排查问题增加了难度 如此一来 我们可以指定过滤掉一些日志 将想要的打印数据存到指定的文件夹中 如下所示:
3.完整代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="log.dir" value="/data/log_files/xuhui"></property>
<!--日志打印级别全局配置,级别越低日志越多-->
<!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<property name="log.level" value="INFO"></property>
<!-- 控制台输出 主要用于本机开发调试-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %logger - %highlight(%msg) %n</pattern>
</encoder>
</appender>
<appender name="apiConsole" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %logger - %boldYellow(%msg) %n</pattern>
</encoder>
</appender>
<appender name="redirectConsole" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %logger - %boldYellow(%msg) %n</pattern>
</encoder>
</appender>
<!-- 错误日志 -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<!-- log.dir 在maven profile里配置 -->
<fileNamePattern>${log.dir}/%d{yyyy-MM-dd}/error-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 警告日志 -->
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.dir}/%d{yyyy-MM-dd}/warn-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- info日志 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.dir}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- debug日志 appender -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.dir}/%d{yyyy-MM-dd}/debug-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 接口日志-->
<appender name="apiLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.dir}/%d{yyyy-MM-dd}/api-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="api" additivity="false" level="INFO">
<appender-ref ref="apiLog"/>
<appender-ref ref="apiConsole"/>
</logger>
<!-- 跳转日志-->
<appender name="redirectLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.dir}/%d{yyyy-MM-dd}/redirect-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="redirect" additivity="false" level="INFO">
<appender-ref ref="redirectLog"/>
<appender-ref ref="redirectConsole"/>
</logger>
<!--全局日志打印的包的范围,及分类日志文件存储 -->
<root level="${log.level}">
<appender-ref ref="STDOUT"/>
<appender-ref ref="DEBUG"/>
<appender-ref ref="INFO"/>
<appender-ref ref="ERROR"/>
<appender-ref ref="WARN"/>
</root>
</configuration>
4.利用AOP拦截打印请求地址、参数 代码如下:
package com.longjin.comm.aop;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
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.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import static java.util.stream.Collectors.joining;
/**
* @Description:AOP拦截打印请求地址、参数
* @Author 何志鹏
* @Date 2020/6/1 14:30
* @Version 1.0
*/
@Aspect
@Component
@Slf4j(topic = "api")
public class ConsoleLogAspect {
//设置切面点
@Pointcut(value = "(execution(* com.longjin.wechat.controller.*.*(..)) || execution(* com.longjin.admin.*.controller.*.*(..))) || execution(* com.longjin.statistics.controller.*.*(..)))")
public void webLog() {}
//指定切点前的处理方法
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Exception {
//获取request对象
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
StringBuilder sb = new StringBuilder();
//拼接请求内容
sb.append("\n请求路径:").append(request.getRequestURL().toString()).append(" ").append(request.getMethod()).append("\n");
sb.append("\n请求Token:").append(request.getHeader("token")).append("\n");
//判断请求是什么请求
if (request.getMethod().equalsIgnoreCase(RequestMethod.GET.name())) {
Map<String, String[]> parameterMap = request.getParameterMap();
Map<String, String> paramMap = new HashMap<>();
parameterMap.forEach((key, value) -> paramMap.put(key, String.join(",", value)));
sb.append("请求参数:").append(JSON.toJSONString(paramMap));
} else if (request.getMethod().equalsIgnoreCase(RequestMethod.POST.name())) {
Object[] args = joinPoint.getArgs();
StringBuilder stringBuilder = new StringBuilder();
Arrays.stream(args).forEach(object -> stringBuilder.append(object.toString().replace("=",":")));
if (stringBuilder.length() == 0){
stringBuilder.append("{}");
}
sb.append("请求参数:").append(stringBuilder.toString());
}
log.info(sb.toString());
}
//指定切点前的处理方法
@AfterReturning(pointcut = "webLog()",returning = "result")
public void doAfterReturning(Object result) {
if (ObjectUtils.isEmpty(result)){
return;
}
String resultStr = JSON.toJSONString(result);
JSONObject jsonObject = JSONObject.parseObject(resultStr);
String errcode = jsonObject.getString("errcode");
String errmsg = jsonObject.getString("errmsg");
log.info("\n返回结果:" + "errcode:"+errcode+","+"errmsg:"+errmsg);
}
}
5.在打印日志的地方加上@Slf4j(topic = "api") 如下:
6.打印的日志文件如下: