若依框架-添加mongodb日志服务
若依框架-添加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
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01