自定义log日志存导指定文件里
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.打印的日志文件如下: