using Microsoft.AspNetCore.Http; using SqlSugar; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Core.DB; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core.HttpContextUser; using WIDESEAWCS_Core.Seed; namespace WIDESEAWCS_Core.LogHelper { public static class Logger { public static ConcurrentQueue loggerQueueData = new ConcurrentQueue(); static Logger() { Task.Run(() => { StartWriteLog(); }); } static void StartWriteLog() { DataTable queueTable = CreateEmptyTable(); while (true) { try { if (loggerQueueData.Count() > 0 && queueTable.Rows.Count < 500) { DequeueToTable(queueTable); continue; } //每5秒写一次数据 Thread.Sleep(5000); if (queueTable.Rows.Count == 0) { continue; } SqlSugarClient sugarClient = new SqlSugarClient(new ConnectionConfig() { ConnectionString = DBContext.GetMainConnectionDb().Connection, IsAutoCloseConnection = true, DbType = MainDb.DbType, }); int rows = sugarClient.Fastest().AS("Sys_Log").BulkCopy(queueTable); queueTable.Clear(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } private static void DequeueToTable(DataTable queueTable) { loggerQueueData.TryDequeue(out dynamic log); if (log != null) { DataRow row = queueTable.NewRow(); if (log.BeginDate == null || log.BeginDate?.Year < 2010) { log.BeginDate = DateTime.Now; } if (log.EndDate == null) { log.EndDate = DateTime.Now; } // row["Id"] = log.Id; row["RequestParam"] = log.RequestParam?.Replace("\r\n", ""); row["ResponseParam"] = log.ResponseParam?.Replace("\r\n", ""); //row["Success"] = log.Success ?? -1; row["BeginDate"] = log.BeginDate; row["EndDate"] = log.EndDate; row["ElapsedTime"] = ((DateTime)log.EndDate - (DateTime)log.BeginDate).TotalMilliseconds; row["UserIP"] = log.UserIP; row["Url"] = log.Url; row["UserId"] = log.UserId ?? -1; row["UserName"] = log.UserName; queueTable.Rows.Add(row); } } private static DataTable CreateEmptyTable() { DataTable queueTable = new DataTable(); queueTable.Columns.Add("BeginDate", Type.GetType("System.DateTime")); queueTable.Columns.Add("ElapsedTime", Type.GetType("System.Int32")); queueTable.Columns.Add("EndDate", Type.GetType("System.DateTime")); queueTable.Columns.Add("RequestParam", typeof(string)); queueTable.Columns.Add("ResponseParam", typeof(string)); //queueTable.Columns.Add("Success", Type.GetType("System.Int32")); queueTable.Columns.Add("Url", typeof(string)); queueTable.Columns.Add("UserIP", typeof(string)); queueTable.Columns.Add("UserName", typeof(string)); queueTable.Columns.Add("UserId", Type.GetType("System.Int32")); //queueTable.Columns.Add("LogType", typeof(string)); //queueTable.Columns.Add("ExceptionInfo", typeof(string)); //queueTable.Columns.Add("ServiceIP", typeof(string)); //queueTable.Columns.Add("BrowserType", typeof(string)); //queueTable.Columns.Add("Role_Id", Type.GetType("System.Int32")); return queueTable; } public static void Add(string requestParameter, string responseParameter) { dynamic log = null; try { HttpContext context = App.HttpContext; if (context == null) { return; } if (context.Request.Method == "OPTIONS") return; 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 = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + context.Request.Path, UserIP = GetClientIP(context) ?.Replace("::ffff:", ""), UserId = user.UserId, UserName = user.UserName }; } catch (Exception exception) { log = log ?? new { BeginDate = DateTime.Now, EndDate = DateTime.Now, RequestParam = requestParameter, ResponseParam = responseParameter, }; } //添加系统日志 loggerQueueData.Enqueue(log); } public static string GetClientIP(HttpContext context) { var ip = context.Request.Headers["X-Forwarded-For"].ObjToString(); if (string.IsNullOrEmpty(ip)) { ip = context.Connection.RemoteIpAddress.ObjToString(); } return ip; } } }