|  |  | 
 |  |  |  | 
 |  |  | using Microsoft.AspNetCore.Http; | 
 |  |  | using Microsoft.Extensions.Logging; | 
 |  |  | using Newtonsoft.Json; | 
 |  |  | 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; | 
 |  |  | 
 |  |  |  | 
 |  |  | namespace WIDESEA_Core.LogHelper | 
 |  |  | { | 
 |  |  |     public class Logger | 
 |  |  |     public static class Logger | 
 |  |  |     { | 
 |  |  |         /// <summary> | 
 |  |  |         /// åå
¥è°è¯æ¥å¿ | 
 |  |  |         /// </summary> | 
 |  |  |         /// <param name="fileName"></param> | 
 |  |  |         /// <param name="msg"></param> | 
 |  |  |         public void WriteDebug(string fileName, string msg) | 
 |  |  |         public static ConcurrentQueue<dynamic> loggerQueueData = new ConcurrentQueue<dynamic>(); | 
 |  |  |         static Logger() | 
 |  |  |         { | 
 |  |  |             if (AppSettings.Get(new string[] { "LogDeubgEnable" }).ObjToBool()) | 
 |  |  |             Task.Run(() => | 
 |  |  |             { | 
 |  |  |                 StringBuilder builder = new StringBuilder(msg); | 
 |  |  |                 builder.Append(Environment.NewLine); | 
 |  |  |                 builder.Append(Environment.NewLine); | 
 |  |  |                 WriteLogToFile($"Debug_{fileName}", builder.ToString()); | 
 |  |  |                 StartWriteLog(); | 
 |  |  |             }); | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         static void StartWriteLog() | 
 |  |  |         { | 
 |  |  |             DataTable queueTable = CreateEmptyTable(); | 
 |  |  |             while (true) | 
 |  |  |             { | 
 |  |  |                 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, | 
 |  |  |                         IsAutoCloseConnection = true, | 
 |  |  |                         DbType = MainDb.DbType, | 
 |  |  |                     }); | 
 |  |  |  | 
 |  |  |                     //å°éå表ä¸çæ°æ®æ¹éæå
¥æ°æ®åº | 
 |  |  |                     int rows = sugarClient.Fastest<DataTable>().AS("Sys_Log").BulkCopy(queueTable); | 
 |  |  |  | 
 |  |  |                     //æ¸
空éå表 | 
 |  |  |                     queueTable.Clear(); | 
 |  |  |                 } | 
 |  |  |                 catch (Exception ex) | 
 |  |  |                 { | 
 |  |  |                     //æå°å¼å¸¸ä¿¡æ¯ | 
 |  |  |                     Console.WriteLine(ex.ToString()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /// <summary> | 
 |  |  |         /// åå
¥ä¿¡æ¯æ¥å¿ | 
 |  |  |         /// </summary> | 
 |  |  |         /// <param name="fileName"></param> | 
 |  |  |         /// <param name="msg"></param> | 
 |  |  |         public void WriteInfo(string fileName, string msg) | 
 |  |  |         private static void DequeueToTable(DataTable queueTable) | 
 |  |  |         { | 
 |  |  |             StringBuilder builder = new StringBuilder(msg); | 
 |  |  |             builder.Append(Environment.NewLine); | 
 |  |  |             builder.Append(Environment.NewLine); | 
 |  |  |             WriteLogToFile($"Info_{fileName}", builder.ToString()); | 
 |  |  |             loggerQueueData.TryDequeue(out dynamic log); | 
 |  |  |             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", "").Replace("\n", ""); | 
 |  |  |                 // å°ResponseParamä¸çæ¢è¡ç¬¦æ¿æ¢ä¸ºç©ºå符串 | 
 |  |  |                 row["ResponseParam"] = log.ResponseParam?.Replace("\r\n", "").Replace("\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); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /// <summary> | 
 |  |  |         /// åå
¥é误æ¥å¿ | 
 |  |  |         /// </summary> | 
 |  |  |         /// <param name="fileName"></param> | 
 |  |  |         /// <param name="msg"></param> | 
 |  |  |         /// <param name="ex"></param> | 
 |  |  |         public void WriteError(string fileName, string msg, Exception ex) | 
 |  |  |         private static DataTable CreateEmptyTable() | 
 |  |  |         { | 
 |  |  |             StringBuilder builder = new StringBuilder(msg); | 
 |  |  |             builder.Append(Environment.NewLine); | 
 |  |  |             builder.Append("é误信æ¯ï¼"); | 
 |  |  |             builder.Append(ex.Message); | 
 |  |  |             builder.Append(Environment.NewLine); | 
 |  |  |             builder.Append("é误æºï¼"); | 
 |  |  |             builder.Append(ex.Source); | 
 |  |  |             builder.Append(Environment.NewLine); | 
 |  |  |             builder.Append("éè¯¯å æ ï¼"); | 
 |  |  |             builder.Append(ex.StackTrace); | 
 |  |  |             builder.Append(Environment.NewLine); | 
 |  |  |             builder.Append("é误类åï¼"); | 
 |  |  |             builder.Append(ex.GetType().ToString()); | 
 |  |  |             builder.Append(Environment.NewLine); | 
 |  |  |             builder.Append("éè¯¯æ¹æ³ï¼"); | 
 |  |  |             builder.Append(ex.TargetSite?.ToString()); | 
 |  |  |             builder.Append(Environment.NewLine); | 
 |  |  |             builder.Append(Environment.NewLine); | 
 |  |  |             WriteLogToFile($"Error_{fileName}", builder.ToString()); | 
 |  |  |             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; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim(); | 
 |  |  |         string folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Log\\{DateTime.Now.ToString("yyyy-MM-dd")}"); | 
 |  |  |  | 
 |  |  |         private void WriteLogToFile(string fileName, string log) | 
 |  |  |         public static void Add(string requestParameter, string responseParameter) | 
 |  |  |         { | 
 |  |  |             dynamic log = null; | 
 |  |  |             try | 
 |  |  |             { | 
 |  |  |                 // è¿å
¥åé | 
 |  |  |                 LogWriteLock.EnterWriteLock(); | 
 |  |  |  | 
 |  |  |                 // å¦ææä»¶å¤¹ä¸åå¨ï¼åå建æä»¶å¤¹ | 
 |  |  |                 if (!Directory.Exists(folderPath)) | 
 |  |  |                 //è·åå½åHttpContext | 
 |  |  |                 HttpContext context = App.HttpContext; | 
 |  |  |                 //妿HttpContext为空ï¼åè¿å | 
 |  |  |                 if (context == null) | 
 |  |  |                 { | 
 |  |  |                     Directory.CreateDirectory(folderPath); | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |                 // è·åæ¥å¿æä»¶è·¯å¾ | 
 |  |  |                 string logFilePath = Path.Combine(folderPath, GetLastAccessFileName(fileName)); | 
 |  |  |                 // è·åå½åæ¶é´ | 
 |  |  |                 DateTime now = DateTime.Now; | 
 |  |  |                 // æé æ¥å¿å
容 | 
 |  |  |                 string logContent = $"ã{now}ã{Environment.NewLine}{log}"; | 
 |  |  |                 //å¦æè¯·æ±æ¹æ³ä¸ºOPTIONSï¼åè¿å | 
 |  |  |                 if (context.Request.Method == "OPTIONS") return; | 
 |  |  |                 //è·åRequestLogModelå®ä¾ | 
 |  |  |                 RequestLogModel logModel = (context.RequestServices.GetService(typeof(RequestLogModel)) as RequestLogModel) ?? new RequestLogModel { RequestDate = DateTime.Now }; | 
 |  |  |  | 
 |  |  |                 // å°æ¥å¿å
容追å å°æ¥å¿æä»¶ä¸ | 
 |  |  |                 File.AppendAllText(logFilePath, logContent); | 
 |  |  |             } | 
 |  |  |             catch { } | 
 |  |  |             finally | 
 |  |  |             { | 
 |  |  |                 // éåºåé | 
 |  |  |                 LogWriteLock.ExitWriteLock(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         int size = 10 * 1024 * 1024; | 
 |  |  |         string ext = ".log"; | 
 |  |  |         private string GetLogFilePath(string folderPath, string fileName) | 
 |  |  |         { | 
 |  |  |             // è·åæå®æä»¶å¤¹ä¸çæææä»¶ | 
 |  |  |             var allFiles = new DirectoryInfo(folderPath); | 
 |  |  |             // è·åç¬¦åæ¡ä»¶çæä»¶ï¼ææä»¶åéåºæå | 
 |  |  |             var selectFiles = allFiles.GetFiles().Where(fi => fi.Name.ToLower().Contains(fileName.ToLower()) && fi.Extension.ToLower() == ext.ToLower() && fi.Length < size).OrderByDescending(d => d.Name).ToList(); | 
 |  |  |  | 
 |  |  |             FileInfo? file = selectFiles.FirstOrDefault(); | 
 |  |  |             // å¦ææç¬¦åæ¡ä»¶çæä»¶ï¼è¿å第ä¸ä¸ªæä»¶ç宿´è·¯å¾ | 
 |  |  |             if (file != null) | 
 |  |  |             { | 
 |  |  |                 return file.FullName; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // å¦ææ²¡æç¬¦åæ¡ä»¶çæä»¶ï¼è¿åä¸ä¸ªæ°çæä»¶è·¯å¾ï¼æä»¶å为åæä»¶åå ä¸å½åæ¶é´ | 
 |  |  |             return Path.Combine(folderPath, $@"{fileName}_{DateTime.Now.ToString("HH-mm-ss")}.log"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         private string GetLastAccessFileName(string fileName) | 
 |  |  |         { | 
 |  |  |             foreach (var m in GetExistLogFileNames(fileName)) | 
 |  |  |             { | 
 |  |  |                 FileInfo fileInfo = new FileInfo(m); | 
 |  |  |                 if (fileInfo.Length < size) | 
 |  |  |                 //è·åå½åç¨æ· | 
 |  |  |                 IUser user = App.User; | 
 |  |  |                 //å建æ¥å¿å¯¹è±¡ | 
 |  |  |                 log = new | 
 |  |  |                 { | 
 |  |  |                     return m; | 
 |  |  |                 } | 
 |  |  |                     //请æ±å¼å§æ¶é´ | 
 |  |  |                     BeginDate = logModel.RequestDate, | 
 |  |  |                     //请æ±ç»ææ¶é´ | 
 |  |  |                     EndDate = DateTime.Now, | 
 |  |  |                     //请æ±åæ° | 
 |  |  |                     RequestParam = requestParameter, | 
 |  |  |                     //ååºåæ° | 
 |  |  |                     ResponseParam = responseParameter, | 
 |  |  |                     //请æ±URL | 
 |  |  |                     Url = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + context.Request.Path, | 
 |  |  |                     //客æ·ç«¯IP | 
 |  |  |                     UserIP = GetClientIP(context)?.Replace("::ffff:", "").Replace("::1", "127.0.0.1"), | 
 |  |  |                     //ç¨æ·ID | 
 |  |  |                     UserId = user.UserId, | 
 |  |  |                     //ç¨æ·å | 
 |  |  |                     UserName = user.UserName | 
 |  |  |                 }; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // è¿åä¸ä¸ªæ°çé»è®¤å½åæ¶é´çæ¥å¿åç§° | 
 |  |  |             return $@"{fileName}_{DateTime.Now.ToString("HH-mm-ss")}.log"; | 
 |  |  |             catch (Exception exception) | 
 |  |  |             { | 
 |  |  |                 //妿åçå¼å¸¸ï¼åå建æ¥å¿å¯¹è±¡ | 
 |  |  |                 log = log ?? new | 
 |  |  |                 { | 
 |  |  |                     //请æ±å¼å§æ¶é´ | 
 |  |  |                     BeginDate = DateTime.Now, | 
 |  |  |                     //请æ±ç»ææ¶é´ | 
 |  |  |                     EndDate = DateTime.Now, | 
 |  |  |                     //请æ±åæ° | 
 |  |  |                     RequestParam = requestParameter, | 
 |  |  |                     //ååºåæ° | 
 |  |  |                     ResponseParam = responseParameter, | 
 |  |  |                 }; | 
 |  |  |             } | 
 |  |  |             //æ·»å ç³»ç»æ¥å¿ | 
 |  |  |             loggerQueueData.Enqueue(log); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         private string[] GetExistLogFileNames(string fileName) | 
 |  |  |         public static void Add(string url, string requestParameter, string responseParameter, DateTime beginDate) | 
 |  |  |         { | 
 |  |  |             string[] fileNames = Directory.GetFiles(folderPath, fileName + "*.log"); | 
 |  |  |             return fileNames; | 
 |  |  |             dynamic? log = null; | 
 |  |  |             try | 
 |  |  |             { | 
 |  |  |                 //è·åå½åç¨æ· | 
 |  |  |                 IUser? user = App.User; | 
 |  |  |                 //å建æ¥å¿å¯¹è±¡ | 
 |  |  |                 log = new | 
 |  |  |                 { | 
 |  |  |                     //请æ±å¼å§æ¶é´ | 
 |  |  |                     BeginDate = beginDate, | 
 |  |  |                     //请æ±ç»ææ¶é´ | 
 |  |  |                     EndDate = DateTime.Now, | 
 |  |  |                     //请æ±åæ° | 
 |  |  |                     RequestParam = requestParameter, | 
 |  |  |                     //ååºåæ° | 
 |  |  |                     ResponseParam = responseParameter, | 
 |  |  |                     //请æ±URL | 
 |  |  |                     Url = url, | 
 |  |  |                     //客æ·ç«¯IP | 
 |  |  |                     UserIP = "", | 
 |  |  |                     //ç¨æ·ID | 
 |  |  |                     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) | 
 |  |  |         { | 
 |  |  |             // è·å请æ±å¤´ä¸ç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; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } |