日志模块记录访问日志,能否考虑接口自定义是否记录访问日志的请求头或返回体
xiongzwen opened this issue · comments
xiongzwen commented
日志模块记录访问日志,只排除了/page之类的访问,像系统自带登录验证码这种图片的访问也被记录返回体,很占用日志空间。能否考虑接口自定义是否记录访问日志的请求头或返回体
有猫饼 commented
考虑后期优化,也欢迎 PR。
目前可以在自己的项目注册一个 AccessLogHandler 类型的 Spring Bean,重写 CustomAccessLogHandler#buildLog 方法,会覆盖默认的行为。
另外还可以通过配置 ballcat.log.access.ignore-url-patterns
对指定 url 规则忽略访问日志记录。
xiongzwen commented
通过以下配置确实可以解决二维码被保存至数据库报错的问题
ballcat:
log:
access:
ignore-url-patterns:
- /captcha/**
感谢!根据
@Hccake
的提示,通过限制报文的长度,可以解决问题。
import com.hccake.ballcat.common.log.access.handler.AccessLogHandler;
import com.hccake.ballcat.log.handler.CustomAccessLogHandler;
import com.hccake.ballcat.log.model.entity.AccessLog;
import com.hccake.ballcat.log.service.AccessLogService;
import com.hccake.ballcat.log.thread.AccessLogSaveThread;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author SHData
*/
@Slf4j
@Configuration
public class MyCustomAccessLogHandler {
/**
* 重写 CustomAccessLogHandler#saveLog 方法,覆盖默认的行为。
* params 和 RequestBody 长度超过2000 则截断
*/
@Bean
@ConditionalOnBean(AccessLogService.class)
protected AccessLogHandler<AccessLog> accessLogHandler(AccessLogService accessLogService)
{
return new CustomAccessLogHandler(new AccessLogSaveThread(accessLogService))
{
/**
* 记录日志
* @param accessLog 访问日志
*/
@Override
public void saveLog(AccessLog accessLog) {
accessLog.setReqParams(StringUtils.substring(accessLog.getReqParams(),0,2000));
accessLog.setReqBody(StringUtils.substring(accessLog.getReqBody(),0,2000));
super.saveLog(accessLog);
}
};
}
}