| | |
| | |  |
| | | 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(); |
| | | }); |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥ä¿¡æ¯æ¥å¿ |
| | | /// </summary> |
| | | /// <param name="fileName"></param> |
| | | /// <param name="msg"></param> |
| | | public void WriteInfo(string fileName, string msg) |
| | | static void StartWriteLog() |
| | | { |
| | | StringBuilder builder = new StringBuilder(msg); |
| | | builder.Append(Environment.NewLine); |
| | | builder.Append(Environment.NewLine); |
| | | WriteLogToFile($"Info_{fileName}", builder.ToString()); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥é误æ¥å¿ |
| | | /// </summary> |
| | | /// <param name="fileName"></param> |
| | | /// <param name="msg"></param> |
| | | /// <param name="ex"></param> |
| | | public void WriteError(string fileName, string msg, Exception ex) |
| | | { |
| | | 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()); |
| | | } |
| | | |
| | | |
| | | 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) |
| | | DataTable queueTable = CreateEmptyTable(); |
| | | while (true) |
| | | { |
| | | try |
| | | { |
| | | // è¿å
¥åé |
| | | LogWriteLock.EnterWriteLock(); |
| | | //妿éåä¸ææ°æ®ä¸éå表ä¸çè¡æ°å°äº500ï¼åå°éåä¸çæ°æ®åå
¥éå表 |
| | | if (loggerQueueData.Count() > 0 && queueTable.Rows.Count < 500) |
| | | { |
| | | DequeueToTable(queueTable); continue; |
| | | } |
| | | //æ¯5ç§å䏿¬¡æ°æ® |
| | | Thread.Sleep(5000); |
| | | |
| | | // 妿æä»¶å¤¹ä¸åå¨ï¼åå建æä»¶å¤¹ |
| | | if (!Directory.Exists(folderPath)) |
| | | { |
| | | Directory.CreateDirectory(folderPath); |
| | | } |
| | | // è·åæ¥å¿æä»¶è·¯å¾ |
| | | string logFilePath = Path.Combine(folderPath, GetLastAccessFileName(fileName)); |
| | | // è·åå½åæ¶é´ |
| | | DateTime now = DateTime.Now; |
| | | // æé æ¥å¿å
容 |
| | | string logContent = $"ã{now}ã{Environment.NewLine}{log}"; |
| | | //妿éå表ä¸çè¡æ°ä¸º0ï¼åè·³è¿æ¬æ¬¡å¾ªç¯ |
| | | if (queueTable.Rows.Count == 0) { continue; } |
| | | |
| | | // å°æ¥å¿å
容追å å°æ¥å¿æä»¶ä¸ |
| | | File.AppendAllText(logFilePath, logContent); |
| | | } |
| | | catch { } |
| | | finally |
| | | //å建SqlSugarClient对象ï¼ç¨äºè¿æ¥æ°æ®åº |
| | | SqlSugarClient sugarClient = new SqlSugarClient(new ConnectionConfig() |
| | | { |
| | | // éåºåé |
| | | 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(); |
| | | ConnectionString = DBContext.GetMainConnectionDb().Connection, |
| | | IsAutoCloseConnection = true, |
| | | DbType = MainDb.DbType, |
| | | }); |
| | | |
| | | FileInfo? file = selectFiles.FirstOrDefault(); |
| | | // 妿æç¬¦åæ¡ä»¶çæä»¶ï¼è¿å第ä¸ä¸ªæä»¶ç宿´è·¯å¾ |
| | | if (file != null) |
| | | { |
| | | return file.FullName; |
| | | } |
| | | //å°éå表ä¸çæ°æ®æ¹éæå
¥æ°æ®åº |
| | | int rows = sugarClient.Fastest<DataTable>().AS("Sys_Log").BulkCopy(queueTable); |
| | | |
| | | // å¦ææ²¡æç¬¦åæ¡ä»¶çæä»¶ï¼è¿åä¸ä¸ªæ°çæä»¶è·¯å¾ï¼æä»¶å为åæä»¶åå ä¸å½åæ¶é´ |
| | | return Path.Combine(folderPath, $@"{fileName}_{DateTime.Now.ToString("HH-mm-ss")}.log"); |
| | | //æ¸
空éå表 |
| | | queueTable.Clear(); |
| | | } |
| | | |
| | | private string GetLastAccessFileName(string fileName) |
| | | catch (Exception ex) |
| | | { |
| | | foreach (var m in GetExistLogFileNames(fileName)) |
| | | { |
| | | FileInfo fileInfo = new FileInfo(m); |
| | | if (fileInfo.Length < size) |
| | | { |
| | | return m; |
| | | //æå°å¼å¸¸ä¿¡æ¯ |
| | | Console.WriteLine(ex.ToString()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // è¿åä¸ä¸ªæ°çé»è®¤å½åæ¶é´çæ¥å¿åç§° |
| | | return $@"{fileName}_{DateTime.Now.ToString("HH-mm-ss")}.log"; |
| | | private static void DequeueToTable(DataTable queueTable) |
| | | { |
| | | 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", ""); |
| | | // å°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); |
| | | } |
| | | } |
| | | |
| | | private string[] GetExistLogFileNames(string fileName) |
| | | private static DataTable CreateEmptyTable() |
| | | { |
| | | string[] fileNames = Directory.GetFiles(folderPath, fileName + "*.log"); |
| | | return fileNames; |
| | | 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 |
| | | 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, |
| | | //客æ·ç«¯IP |
| | | UserIP = GetClientIP(context)?.Replace("::ffff:", "").Replace("::1", "127.0.0.1"), |
| | | //ç¨æ·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; |
| | | } |
| | | } |
| | | } |