背景
????????上篇我們介紹了系統日志處理方式,也結合我們實際和日志系統集成的需求,將我們的日志文件配置成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