/// <summary> /// 插入error log /// </summary> /// <param name="request"></param> /// <returns></returns> public ServiceResult <bool> AddErrorLog(AddErrorLogRequest request) { var result = new ServiceResult <bool> { ReturnCode = ReturnCodeType.Error }; //如果包含在黑名单中的,直接扔掉不写入db var errorLogBlackListCacheKey = "Log.Cache.ErrorLogBlackList"; var errorLogBlackList = CacheHelper.Get(errorLogBlackListCacheKey) as List <TLogsErrorLogBlackList>; if (errorLogBlackList == null) { errorLogBlackList = _errorLogBlackListDao.GetAll(); CacheHelper.Set(errorLogBlackListCacheKey, errorLogBlackList); } if (errorLogBlackList.HasValue()) { var isMatchBlackList = IsMatchErrorLogBlackList(request, errorLogBlackList); if (isMatchBlackList) { result.ReturnCode = ReturnCodeType.Success; result.Content = true; return(result); } } //EmitMapper对象映射 var mapper = ObjectMapperManager.DefaultInstance.GetMapper <AddErrorLogRequest, TLogsErrorLog>(); var item = mapper.Map(request); var rs = _errorLogDao.Insert(item); if (rs == true) { result.ReturnCode = ReturnCodeType.Success; result.Content = true; } return(result); }
/// <summary> /// 是否匹配黑名单 /// </summary> /// <param name="request"></param> /// <returns></returns> private bool IsMatchErrorLogBlackList(AddErrorLogRequest request, List <TLogsErrorLogBlackList> errorLogBlackList) { //只要任意一个条件匹配即为true var message = request.Message.LZ4Decompress(); var isMatchRegex = false; foreach (var item in errorLogBlackList) { //SystemCode if (!item.SystemCode.IsNullOrEmpty() && request.SystemCode.EqualsIgnoreCase(item.SystemCode)) { return(true); } //Source if (!item.Source.IsNullOrEmpty() && request.Source.EqualsIgnoreCase(item.Source)) { return(true); } //MachineName if (!item.MachineName.IsNullOrEmpty() && request.MachineName.EqualsIgnoreCase(item.MachineName)) { return(true); } //IpAddress if (!item.IpAddress.IsNullOrEmpty() && request.IpAddress.Contains(item.IpAddress)) { return(true); } //ClientIp if (!item.ClientIp.IsNullOrEmpty() && request.ClientIp.Contains(item.ClientIp)) { return(true); } //AppdomainName if (!item.AppdomainName.IsNullOrEmpty() && item.AppdomainName.EqualsIgnoreCase(request.AppdomainName)) { return(true); } //Message //正则模式 if (item.IsRegex.HasValue && item.IsRegex.Value && !item.Message.IsNullOrEmpty()) { //如果message太长,使用正则会有性能问题,所以最好加上timeout设置 try { isMatchRegex = Regex.IsMatch(message, item.Message, RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(500)); } catch (RegexMatchTimeoutException ex) { //LogHelper.Error(() => string.Format("Timeout after {0} seconds matching {1}", ex.MatchTimeout, ex.Input)); } if (isMatchRegex) { return(true); } } else { //普通模式 if (!item.Message.IsNullOrEmpty() && message.ToLower().Contains(item.Message.ToLower())) { return(true); } } } return(false); }