package monitorNewMgr import ( "sync" "time" "goutil/stringUtil" ) const ( // CON_MONITOR_HISTORY_SIZE 历史监控信息保存数量 CON_MONITOR_HISTORY_SIZE = 3 // CON_MONITOR_HISTORY_VALID_SECONDS 历史监控信息有效的秒数 CON_MONITOR_HISTORY_VALID_SECONDS = 30 // CON_MONITOR_HISTORY_SIMILARITY_THERSHOLD 历史监控信息相似度的阈值 CON_MONITOR_HISTORY_SIMILARITY_THERSHOLD = 0.9 ) var ( monitorHistoryList = make([]*MonitorHistory, 0, CON_MONITOR_HISTORY_SIZE) monitorHistoryMutex sync.Mutex ) func checkSimilarity(monitorMessage string, timestamp int64) (valid bool) { //默认监控信息有效 valid = true monitorHistoryMutex.Lock() defer monitorHistoryMutex.Unlock() // 从后往前(按时间从后往前)遍历,以便于可以及时退出 for i := len(monitorHistoryList) - 1; i >= 0; i-- { item := monitorHistoryList[i] // 如果已经过期,则不用处理; 返回之前的状态即可(当前的已经过期,则之前的也一定已经过期) if time.Now().Unix()-item.Timestamp > CON_MONITOR_HISTORY_VALID_SECONDS { break } // 如果两个字符串的长度相差2倍,则无须继续判断,继续与下一条数据进行比较 lenA, lenB := len(monitorMessage), len(item.MonitorMessage) if lenA > 2*lenB || lenB > 2*lenA { continue } // 判断两个字符串的相似度(如果相似度超过阈值,则此日志无效) _, similarity := stringUtil.Similarity(monitorMessage, item.MonitorMessage) if similarity >= CON_MONITOR_HISTORY_SIMILARITY_THERSHOLD { valid = false return // 直接返回,无需将当前日志添加到历史列表中,以提高性能 } } // 将消息添加到历史消息列表中 monitorHistoryList = append(monitorHistoryList, newMonitorHistory(monitorMessage, timestamp)) if len(monitorHistoryList) > CON_MONITOR_HISTORY_SIZE { monitorHistoryList = monitorHistoryList[len(monitorHistoryList)-CON_MONITOR_HISTORY_SIZE:] } return }