ballcat-projects / ballcat

😸一个快速开发脚手架,快速搭建企业级后台管理系统,并提供多种便捷starter进行功能扩展。主要功能包括前后台用户分离,菜单权限,数据权限,定时任务,访问日志,操作日志,异常日志,统一异常处理,XSS过滤,SQL防注入,国际化 等多种功能

Home Page:http://docs.ballcat.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

日志模块记录访问日志,能否考虑接口自定义是否记录访问日志的请求头或返回体

xiongzwen opened this issue · comments

日志模块记录访问日志,只排除了/page之类的访问,像系统自带登录验证码这种图片的访问也被记录返回体,很占用日志空间。能否考虑接口自定义是否记录访问日志的请求头或返回体

考虑后期优化,也欢迎 PR。

目前可以在自己的项目注册一个 AccessLogHandler 类型的 Spring Bean,重写 CustomAccessLogHandler#buildLog 方法,会覆盖默认的行为。

另外还可以通过配置 ballcat.log.access.ignore-url-patterns 对指定 url 规则忽略访问日志记录。

先关闭此 issues, 后续讨论在 #237 内进行

通过以下配置确实可以解决二维码被保存至数据库报错的问题

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