背景
上篇我们介绍了系统日志处理方式,也结合我们实际和日志系统集成的需求,将我们的日志文件配置成json格式。这次我们针对我们操作日志的处理进行一些介绍。
还是采用传统的aop的形式进行操作日志的保存,并按业务类型进行定义保存到mongodb的日志里,并根据系统的配置的日志最大保留天数通过quartz的定时任务定时清理mondb的数据数据。
类图
日志注解类
日志注解类代码如下,是一个很常用的注解类。所以这里加点知识,就是Retention注解的策略的知识。
@Retention
注解用于标记另一个注解,指示该注解应该在什么时候被保留。它的作用是定义注解在不同生命周期阶段的可用性。@Retention
接受一个枚举值 RetentionPolicy
,可以选择以下三种策略之一:
RetentionPolicy.SOURCE
:注解仅存在于源代码中,编译时被丢弃。它在编译后不会存在于字节码中。RetentionPolicy.CLASS
:注解会保留在编译后的.class
文件中,但不会被 JVM 加载,通常用于编译时的工具(如代码生成工具)。RetentionPolicy.RUNTIME
:注解会在运行时被保留,并且可以通过反射机制在程序执行期间访问到它。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) //只能注解到方法
public @interface AuthLog {//业务类型String bizType();//接口描述String desc();CoreConstant.OperateLogType operateLogType() default CoreConstant.OperateLogType.LOG_TYPE_DEFAULT;
}
日志切面类
OperateLogAspect日志切面类用于拦截日志并将日志数据保存到mongodb,我们会将如下的内容记录到日志文件中并进行简单的脱敏的处理。
doc.append("type", operateLogType.getLogType());doc.append("uri", uri);doc.append("reqIp", ip);doc.append("reqMethod", request.getMethod());doc.append("reqParams", SensitiveDataUtil.handler.maskSensitiveData(JSONUtil.toJsonStr(request.getParameterMap())));doc.append("reqHeader", getHeadersAsJson(request));
定时清理类
MongoDbLogJobCleaner负责清理超期的日志,默认保留的是30天,由于在quartz-common包里,所以只要微服务都会引用这个基础的底包,这样就会读取到每个服务的日志文件并进行清理了。
try {documentName = microServiceName + MongoDbLogConfig.MONGODB_OPERATE_LOG_SUFFIX.value();Query query = new Query(Criteria.where(MongoDbLogConfig.CREATE_DATE_FIELD.value()).lt(new Date(System.currentTimeMillis() - expireDays * 24 * 60 * 60 * 1000)));DeleteResult deleteResult = mongoTemplate.remove(query, documentName);logger.info("清除[" + documentName + "]操作日志成功,清理结果为::" + JSON.toJSONString(deleteResult));} catch (Exception e) {logger.error("清除[" + documentName + "]操作日志失败,{}", e.getMessage());}
日志查询
MongodbOperateLogController提供了一些查询功能,这里就不在详细描述。重点还是mongodb的查询
总结
这两篇文章基本介绍了框架的日志体系,我们没有对接ELK的类似的日志系统,而是采用了mongodb这种方式,主要考虑到小公司可能对基础设施的投入并不会那么大的问题。未来要引用ELK,我觉得也是非常容易的事情。请大家多指正。
GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/YouYouLongLong/springcloud-framework/blob/master/core-common-parent/logs-common/src/main/java/org/cloud/logs/aop/OperateLogAspect.java