hutongqing
2024-11-22 85458565e09bda1044d19b13d0b1ffb7ab576857
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/LogHelper/Logger.cs
@@ -16,143 +16,136 @@
{
    public class Logger
    {
        public static void Debug(string message)
        /// <summary>
        /// å†™å…¥è°ƒè¯•日志
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        public void WriteDebug(string fileName, string msg)
        {
        }
        public static void Debug(string message, Exception exception)
        {
        }
        public static void Info(string message)
        {
        }
        public static void Info(string message, Exception exception)
        {
        }
        public static void Warn(string message)
        {
        }
        public static void Warning(string message, Exception exception)
        {
        }
        public static void Error(string message)
        {
        }
        public static void Error(string message, Exception exception)
        {
        }
        public static void Fatal(string message)
        {
        }
        public static void Fatal(string message, Exception exception)
        {
        }
        public static void Write_Log(string groupName, string logName, string content, object data = null)
        {
            DateTime nowTime = DateTime.Now;
            string basePath = System.Environment.CurrentDirectory + "/Log/" + $"/{groupName}/{nowTime.ToString("yyyy-MM-dd")}";
            //如果日志文件目录不存在,则创建
            if (!Directory.Exists(basePath))
            if (AppSettings.Get(new string[] { "LogDeubgEnable" }).ObjToBool())
            {
                Directory.CreateDirectory(basePath);
                StringBuilder builder = new StringBuilder(msg);
                builder.Append(Environment.NewLine);
                builder.Append(Environment.NewLine);
                WriteLogToFile($"Debug_{fileName}", builder.ToString());
            }
        }
        /// <summary>
        /// å†™å…¥ä¿¡æ¯æ—¥å¿—
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        public void WriteInfo(string fileName, string msg)
        {
            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)
        {
            try
            {
                FileStream fs = new FileStream(basePath + "/" + logName + $"{nowTime.ToString("yyMMdd")}.txt", FileMode.Append);
                StreamWriter strwriter = new StreamWriter(fs);
                try
                // è¿›å…¥å†™é”
                LogWriteLock.EnterWriteLock();
                // å¦‚果文件夹不存在,则创建文件夹
                if (!Directory.Exists(folderPath))
                {
                    strwriter.WriteLine(nowTime.ToString() + "." + nowTime.Millisecond);
                    strwriter.WriteLine(content);
                    if (data != null)
                    {
                        strwriter.WriteLine(JsonConvert.SerializeObject(data));
                    }
                    strwriter.WriteLine("-------------------------------");
                    strwriter.WriteLine();
                    strwriter.Flush();
                    Directory.CreateDirectory(folderPath);
                }
                catch { }
                finally
                {
                    strwriter.Close();
                    fs.Close();
                }
                // èŽ·å–æ—¥å¿—æ–‡ä»¶è·¯å¾„
                string logFilePath = Path.Combine(folderPath, GetLastAccessFileName(fileName));
                // èŽ·å–å½“å‰æ—¶é—´
                DateTime now = DateTime.Now;
                // æž„造日志内容
                string logContent = $"【{now}】{Environment.NewLine}{log}";
                // å°†æ—¥å¿—内容追加到日志文件中
                File.AppendAllText(logFilePath, logContent);
            }
            catch { }
            finally
            {
                // é€€å‡ºå†™é”
                LogWriteLock.ExitWriteLock();
            }
        }
        public static void WriteApiLog2DB(HttpContext context, string requestParameter, DateTime beginDate, string responseParameter, DateTime endDate, LoggerStatus loggerStatus)
        int size = 10 * 1024 * 1024;
        string ext = ".log";
        private string GetLogFilePath(string folderPath, string fileName)
        {
            try
            // èŽ·å–æŒ‡å®šæ–‡ä»¶å¤¹ä¸‹çš„æ‰€æœ‰æ–‡ä»¶
            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)
            {
                if (context.Request.Method == "OPTIONS") return;
                if (context == null)
                {
                    Console.WriteLine($"未获取到httpcontext信息,reqParam:{requestParameter},respParam:{responseParameter},success:{loggerStatus}");
                    return;
                }
                Dictionary<string, object> dic = new Dictionary<string, object>
                {
                    {"BeginDate",beginDate },
                    {"ElapsedTime",(endDate - beginDate).TotalMilliseconds.DoubleToInt() },
                    {"EndDate",endDate },
                    {"RequestParam",requestParameter },
                    {"ResponseParam",responseParameter },
                    {"Success",1 },
                    {"Url",context.Request.Path.Value??"" },
                    {"UserIP",context.GetUserIp() },
                    {"UserName","App.User?.Name" },
                    {"User_Id","0" }
                    //{"BeginDate",beginDate },
                    //{"ElapsedTime",(endDate - beginDate).TotalMilliseconds.ObjToInt() },
                    //{"EndDate",endDate },
                    //{"RequestParam",requestParameter },
                    //{"ResponseParam",responseParameter },
                    //{"Success",1 },
                    //{"Url",context.Request.Path.Value??"" },
                    //{"UserIP",context.GetUserIp() },
                    //{"UserName","App.User?.Name" },
                    //{"User_Id","App.User?.ID" }
                };
                SqlSugarClient sqlSugarClient = DBContext.GetCustomDB(DBContext.GetConnectionConfig());
                sqlSugarClient.Insertable(dic).AS("Sys_Log").ExecuteCommand();
                return file.FullName;
            }
            catch (Exception ex)
            {
            }
            // å¦‚果没有符合条件的文件,返回一个新的文件路径,文件名为原文件名加上当前时间
            return Path.Combine(folderPath, $@"{fileName}_{DateTime.Now.ToString("HH-mm-ss")}.log");
        }
    }
    public enum LoggerStatus
    {
        Success = 1,
        Error = 2,
        Info = 3
        private string GetLastAccessFileName(string fileName)
        {
            foreach (var m in GetExistLogFileNames(fileName))
            {
                FileInfo fileInfo = new FileInfo(m);
                if (fileInfo.Length < size)
                {
                    return m;
                }
            }
            // è¿”回一个新的默认当前时间的日志名称
            return $@"{fileName}_{DateTime.Now.ToString("HH-mm-ss")}.log";
        }
        private string[] GetExistLogFileNames(string fileName)
        {
            string[] fileNames = Directory.GetFiles(folderPath, fileName + "*.log");
            return fileNames;
        }
    }
}