| | |
| | | { |
| | | try |
| | | { |
| | | //如果队列中有数据且队列表中的行数小于500,则将队列中的数据写入队列表 |
| | | if (loggerQueueData.Count() > 0 && queueTable.Rows.Count < 500) |
| | | { |
| | | DequeueToTable(queueTable); continue; |
| | |
| | | //每5秒写一次数据 |
| | | Thread.Sleep(5000); |
| | | |
| | | //如果队列表中的行数为0,则跳过本次循环 |
| | | if (queueTable.Rows.Count == 0) { continue; } |
| | | |
| | | //创建SqlSugarClient对象,用于连接数据库 |
| | | SqlSugarClient sugarClient = new SqlSugarClient(new ConnectionConfig() |
| | | { |
| | | ConnectionString = DBContext.GetMainConnectionDb().Connection, |
| | |
| | | DbType = MainDb.DbType, |
| | | }); |
| | | |
| | | //将队列表中的数据批量插入数据库 |
| | | int rows = sugarClient.Fastest<DataTable>().AS("Sys_Log").BulkCopy(queueTable); |
| | | |
| | | //清空队列表 |
| | | queueTable.Clear(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | //打印异常信息 |
| | | Console.WriteLine(ex.ToString()); |
| | | } |
| | | } |
| | |
| | | if (log != null) |
| | | { |
| | | DataRow row = queueTable.NewRow(); |
| | | // 如果log的BeginDate为空或者BeginDate的年份小于2010,则将BeginDate设置为当前时间 |
| | | if (log.BeginDate == null || log.BeginDate?.Year < 2010) |
| | | { |
| | | log.BeginDate = DateTime.Now; |
| | | } |
| | | // 如果log的EndDate为空,则将EndDate设置为当前时间 |
| | | if (log.EndDate == null) |
| | | { |
| | | log.EndDate = DateTime.Now; |
| | | } |
| | | // row["Id"] = log.Id; |
| | | // 将RequestParam中的换行符替换为空字符串 |
| | | row["RequestParam"] = log.RequestParam?.Replace("\r\n", ""); |
| | | // 将ResponseParam中的换行符替换为空字符串 |
| | | row["ResponseParam"] = log.ResponseParam?.Replace("\r\n", ""); |
| | | //row["Success"] = log.Success ?? -1; |
| | | // 将BeginDate设置为log的BeginDate |
| | | row["BeginDate"] = log.BeginDate; |
| | | // 将EndDate设置为log的EndDate |
| | | row["EndDate"] = log.EndDate; |
| | | // 计算ElapsedTime,即EndDate减去BeginDate的毫秒数 |
| | | row["ElapsedTime"] = ((DateTime)log.EndDate - (DateTime)log.BeginDate).TotalMilliseconds; |
| | | // 将UserIP设置为log的UserIP |
| | | row["UserIP"] = log.UserIP; |
| | | // 将Url设置为log的Url |
| | | row["Url"] = log.Url; |
| | | // 如果log的UserId为空,则将UserId设置为-1,否则设置为log的UserId |
| | | row["UserId"] = log.UserId ?? -1; |
| | | // 将UserName设置为log的UserName |
| | | row["UserName"] = log.UserName; |
| | | // 将row添加到queueTable中 |
| | | queueTable.Rows.Add(row); |
| | | } |
| | | } |
| | |
| | | dynamic log = null; |
| | | try |
| | | { |
| | | //获取当前HttpContext |
| | | HttpContext context = App.HttpContext; |
| | | //如果HttpContext为空,则返回 |
| | | if (context == null) |
| | | { |
| | | return; |
| | | } |
| | | //如果请求方法为OPTIONS,则返回 |
| | | if (context.Request.Method == "OPTIONS") return; |
| | | //获取RequestLogModel实例 |
| | | RequestLogModel logModel = (context.RequestServices.GetService(typeof(RequestLogModel)) as RequestLogModel) ?? new RequestLogModel { RequestDate = DateTime.Now }; |
| | | |
| | | //获取当前用户 |
| | | IUser user = App.User; |
| | | //创建日志对象 |
| | | log = new |
| | | { |
| | | //请求开始时间 |
| | | BeginDate = logModel.RequestDate, |
| | | //请求结束时间 |
| | | EndDate = DateTime.Now, |
| | | //请求参数 |
| | | RequestParam = requestParameter, |
| | | //响应参数 |
| | | ResponseParam = responseParameter, |
| | | //请求URL |
| | | Url = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + context.Request.Path, |
| | | UserIP = GetClientIP(context) ?.Replace("::ffff:", ""), |
| | | //客户端IP |
| | | UserIP = GetClientIP(context)?.Replace("::ffff:", ""), |
| | | //用户ID |
| | | UserId = user.UserId, |
| | | //用户名 |
| | | UserName = user.UserName |
| | | }; |
| | | } |
| | | catch (Exception exception) |
| | | { |
| | | //如果发生异常,则创建日志对象 |
| | | log = log ?? new |
| | | { |
| | | //请求开始时间 |
| | | BeginDate = DateTime.Now, |
| | | //请求结束时间 |
| | | EndDate = DateTime.Now, |
| | | //请求参数 |
| | | RequestParam = requestParameter, |
| | | //响应参数 |
| | | ResponseParam = responseParameter, |
| | | }; |
| | | } |
| | |
| | | |
| | | public static string GetClientIP(HttpContext context) |
| | | { |
| | | // 获取请求头中的X-Forwarded-For字段,并将其转换为字符串 |
| | | var ip = context.Request.Headers["X-Forwarded-For"].ObjToString(); |
| | | // 如果X-Forwarded-For字段为空,则获取远程IP地址 |
| | | if (string.IsNullOrEmpty(ip)) |
| | | { |
| | | ip = context.Connection.RemoteIpAddress.ObjToString(); |
| | | } |
| | | |
| | | // 返回IP地址 |
| | | return ip; |
| | | } |
| | | } |