• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

若依框架-添加mongodb日志服务

武飞扬头像
复制粘贴的码农
帮助1

若依框架-添加mongodb日志服务

若依原生的日志是使用MySQL数据库的,在开发中可能会用到其他的日志服务,mongo或者ELS,所以要更换若依的原生日志服务。

若依将每条日志作为一个个任务进行提交,节省了日志记录的时间,不让用户因为后端记录日志而等待。框架中有两种日志:系统访问日志-sys_logininfor,以及 操作日志-oper_log。

因为这里只是替换为不同的数据库,所以实现起来并不困难,为了便于操作,这里直接在system模块下做更改。

两种日志任务

位置:framework模块 manager.factory.AsyncFactory

/**
 * 异步工厂(产生任务用)
 * 
 * @author cloudstudy
 */
public class AsyncFactory
{
    private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");

    /**
     * 记录登录信息
     * 
     * @param username 用户名
     * @param status 状态
     * @param message 消息
     * @param args 列表
     * @return 任务task
     */
    public static TimerTask recordLogininfor(final String username, final String status, final String message,
            final Object... args)
    {
        final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
        final String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
        return new TimerTask()
        {
            @Override
            public void run()
            {
                String address = AddressUtils.getRealAddressByIP(ip);
                StringBuilder s = new StringBuilder();
                s.append(LogUtils.getBlock(ip));
                s.append(address);
                s.append(LogUtils.getBlock(username));
                s.append(LogUtils.getBlock(status));
                s.append(LogUtils.getBlock(message));
                // 打印信息到日志
                sys_user_logger.info(s.toString(), args);
                // 获取客户端操作系统
                String os = userAgent.getOperatingSystem().getName();
                // 获取客户端浏览器
                String browser = userAgent.getBrowser().getName();
                // 封装对象
                SysLogininfor logininfor = new SysLogininfor();
                logininfor.setUserName(username);
                logininfor.setIpaddr(ip);
                logininfor.setLoginLocation(address);
                logininfor.setBrowser(browser);
                logininfor.setOs(os);
                logininfor.setMsg(message);
                // 日志状态
                if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER))
                {
                    logininfor.setStatus(Constants.SUCCESS);
                }
                else if (Constants.LOGIN_FAIL.equals(status))
                {
                    logininfor.setStatus(Constants.FAIL);
                }
                // 插入数据
                SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
            }
        };
    }

    /**
     * 操作日志记录
     * 
     * @param operLog 操作日志信息
     * @return 任务task
     */
    public static TimerTask recordOper(final SysOperLog operLog)
    {
        return new TimerTask()
        {
            @Override
            public void run()
            {
                // 远程查询操作地点
                operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
                SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog);
            }
        };
    }
}
学新通

日志数据库的替换

引入mongodb的依赖

<description>
    system系统模块
</description>

<dependencies>

    <!-- 通用工具-->
    <dependency>
        <groupId>cn.cai</groupId>
        <artifactId>cloudstudy-common</artifactId>
    </dependency>
	<!-- mongodb依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
</dependencies>
学新通

记得在admin模块的application.yml文件中配置mongodb的连接信息

替换系统访问时记录的日志

位置:system.service.impl.SysLogininforServiceImpl,可以替换为其他厂商的数据库,这里以mongodb为例

@Service
public class SysLogininforServiceImpl implements ISysLogininforService
{


    @Autowired
    private MongoTemplate mongoTemplate;
    /**
     * 新增系统登录日志
     * 
     * @param logininfor 访问日志对象
     */
    @Override
    public void insertLogininfor(SysLogininfor logininfor)
    {
     	// 因为mongodb学的并不是太好,这里自动填充的字段值,是手动添加的
        // 查询集合有多少元素,实现id自增
        long count = mongoTemplate.count(new Query(), SysLogininfor.class);
        logininfor.setInfoId(count 1L);
        // 手动添加登录时间
        logininfor.setLoginTime(new Date());
        mongoTemplate.insert(logininfor);
    }

    /**
     * 查询系统登录日志集合
     * 
     * @param logininfor 访问日志对象
     * @return 登录记录集合
     */
    @Override
    public List<SysLogininfor> selectLogininforList(SysLogininfor logininfor)
    {
        logininforMapper.selectLogininforList(logininfor);
        Query query = new Query();
        Criteria criteria = new Criteria();
        // 多条件查询
        if(StringUtils.hasText(logininfor.getIpaddr())){
            criteria.and("ipaddr").regex(logininfor.getIpaddr());
        }
        if (StringUtils.hasText(logininfor.getStatus())){
            criteria.and("status").regex(logininfor.getStatus());
        }
        if(StringUtils.hasText(logininfor.getUserName())){
            criteria.and("userName").regex(logininfor.getUserName());
        }
        if(!ObjectUtils.isEmpty(logininfor.getParams().get("beginTime"))){
            criteria.and("loginTime").gte(new Date((String) logininfor.getParams().get("beginTime")));
        }
        if(!ObjectUtils.isEmpty(logininfor.getParams().get("endTime"))){
            criteria.and("loginTime").lt(new Date((String)logininfor.getParams().get("endTime")));
        }
        query.addCriteria(criteria);
        return mongoTemplate.find(query, SysLogininfor.class);
    }

    /**
     * 批量删除系统登录日志
     * 
     * @param infoIds 需要删除的登录日志ID
     * @return 结果
     */
    @Override
    public int deleteLogininforByIds(Long[] infoIds)
    {

        DeleteResult infoId = mongoTemplate.remove(Query.query(Criteria.where("infoId").in(infoIds)));
        return (int) infoId.getDeletedCount();
    }

    /**
     * 清空系统登录日志
     */
    @Override
    public void cleanLogininfor()
    {
        mongoTemplate.dropCollection(SysLogininfor.class);
    }
}
学新通

替换逻辑大致如此,但不可更改原来service的方法名和参数,因为若依还有日志查询的接口要使用,这里只做替换。

替换操作日志

/**
 * 操作日志 服务层处理
 *
 * @author cloudstudy
 */
@Service
public class SysOperLogServiceImpl implements ISysOperLogService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 新增操作日志
     *
     * @param operLog 操作日志对象
     */
    @Override
    public void insertOperlog(SysOperLog operLog) {
        long count = mongoTemplate.count(new Query(), SysOperLog.class);
        // 自增id
        operLog.setOperId(count   1L);
        // 操作时间
        operLog.setOperTime(new Date());
        mongoTemplate.insert(operLog);
    }

    /**
     * 查询系统操作日志集合
     *
     * @param operLog 操作日志对象
     * @return 操作日志集合
     */
    @Override
    public List<SysOperLog> selectOperLogList(SysOperLog operLog) {
        // 多条件查询
        Query query = new Query();
        Criteria criteria = new Criteria();
        if (StringUtils.hasText(operLog.getTitle())) {
            criteria.and("title").regex(operLog.getTitle());
        }
        if (!ObjectUtils.isEmpty(operLog.getBusinessType())) {
            criteria.and("businessType").is(operLog.getBusinessType());
        }
        if (!ObjectUtils.isEmpty(operLog.getBusinessTypes()) && operLog.getBusinessTypes().length > 0) {
            criteria.and("businessType").in(operLog.getBusinessTypes());
        }
        if(!ObjectUtils.isEmpty(operLog.getStatus())){
            criteria.and("status").is(operLog.getStatus());
        }
        if(StringUtils.hasText(operLog.getOperName())){
            criteria.and("operName").regex(operLog.getOperName());
        }
        // 参数查询
        if(StringUtils.hasText((String) operLog.getParams().get("beginTime"))){
            criteria.and("operTime").gte(new Date((String) operLog.getParams().get("beginTime")));
        }
        if (StringUtils.hasText((String) operLog.getParams().get("endTime"))){
            criteria.and("operTime").lt(new Date((String) operLog.getParams().get("endTime")));
        }
        query.addCriteria(criteria);
        return mongoTemplate.find(query, SysOperLog.class);
    }

    /**
     * 批量删除系统操作日志
     *
     * @param operIds 需要删除的操作日志ID
     * @return 结果
     */
    @Override
    public int deleteOperLogByIds(Long[] operIds) {
        DeleteResult deleteResult = mongoTemplate.remove(Query.query(Criteria.where("operId").in(operIds)), SysOperLog.class);
        return (int) deleteResult.getDeletedCount();

    }

    /**
     * 查询操作日志详细
     *
     * @param operId 操作ID
     * @return 操作日志对象
     */
    @Override
    public SysOperLog selectOperLogById(Long operId) {
        return mongoTemplate.findOne(Query.query(Criteria.where("operId").is(operId)),SysOperLog.class);
    }

    /**
     * 清空操作日志
     */
    @Override
    public void cleanOperLog() {
        mongoTemplate.dropCollection(SysOperLog.class);
    }
}
学新通

若依日志模块替换还是比较简单的,因为只需要替换mapper层面的代码进行了,其他日志服务去可能还要更改 system 的domain包中相关的实体类。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfiefbb
系列文章
更多 icon
同类精品
更多 icon
继续加载