AOP实现将入参与出参写入日志文件中,每天生成一个文件
LogAspect
package org.jeecg.interceptor; import com.alibaba.fastjson.JSON; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; 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; @Aspect @Component public class LogAspect { private static final Logger logger = LoggerFactory.getLogger("WRITER-LOG"); //设置切入点:这里直接拦截被@ModelView注解的方法 @Pointcut("@annotation(org.jeecg.interceptor.LogParamRecord)") public void pointcut() { } // @Pointcut("execution(* org.jeecg.modules.*.*(..))") // public void controllerAspect() {} @Around("pointcut()") public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String method = request.getMethod(); String uri = request.getRequestURI(); logger.info("Request: {} {}", method, uri); Object[] args = joinPoint.getArgs(); if (args != null && args.length > 0) { logger.info("Request params:"); for (Object arg : args) { logger.info("{}", JSON.toJSONString(arg)); } } Object result = joinPoint.proceed(); if (result != null) { logger.info("Response params:"); logger.info("{}", JSON.toJSONString(result)); } return result; } }
LogParamRecord
package org.jeecg.interceptor; import java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD})//只能在方法上使用此注解 public @interface LogParamRecord { }
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 --> <property name="LOG_HOME" value="../logs" /> <!--日志输出位置--> <property name="LOG_WRITER" value="D:/zrkj" /> <!--<property name="COLOR_PATTERN" value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''})- %gray(%msg%xEx%n)" />--> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/jeecgboot-%d{yyyy-MM-dd}.%i.log</FileNamePattern> <!--日志文件保留天数 --> <MaxHistory>30</MaxHistory> <maxFileSize>10MB</maxFileSize> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern> </encoder> </appender> <!-- 生成 error html格式日志开始 --> <appender name="HTML" class="ch.qos.logback.core.FileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!--设置日志级别,过滤掉info日志,只输入error日志--> <level>ERROR</level> </filter> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <pattern>%p%d%msg%M%F{32}%L</pattern> </layout> </encoder> <file>${LOG_HOME}/error-log.html</file> </appender> <!-- 生成 error html格式日志结束 --> <!-- 每天生成一个html格式的日志开始 --> <appender name="FILE_HTML" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/jeecgboot-%d{yyyy-MM-dd}.%i.html</FileNamePattern> <!--日志文件保留天数 --> <MaxHistory>30</MaxHistory> <MaxFileSize>10MB</MaxFileSize> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <pattern>%p%d%msg%M%F{32}%L</pattern> </layout> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="WRITER-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>${LOG_WRITER}/zrkj-%d{yyyy-MM-dd}.%i.log</FileNamePattern> <!--日志文件保留天数 --> <MaxHistory>30</MaxHistory> <maxFileSize>10MB</maxFileSize> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern> </encoder> </appender> <!-- 每天生成一个html格式的日志结束 --> <!--myibatis log configure --> <logger name="com.apache.ibatis" level="TRACE" /> <logger name="java.sql.Connection" level="DEBUG" /> <logger name="java.sql.Statement" level="DEBUG" /> <logger name="java.sql.PreparedStatement" level="DEBUG" /> <logger name="WRITER-LOG" level="debug" additivity="false"> <appender-ref ref="WRITER-APPENDER" /> </logger> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> <appender-ref ref="HTML" /> <appender-ref ref="FILE_HTML" /> </root> </configuration>
方法一:应用到需要写入日志的方法上注解,方法二:也可以通过拦截包名,实现写入日志。自己修改上面的代码来实现。
@RestController public class GuangxiYibaoPlatformController { @Resource private IService iService; @LogParamRecord @PostMapping("/uploadNotice") public JSONObject uploadNotice(@RequestBody JSONObject jsonObject) { return iService.feeDetailUploadNotice(jsonObject); } }