using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace HT.Cloud.Code { public class LogHelper { private static object lockHelper = new object(); #region 写文本日志 /// /// 写日志 异步 /// 默认路径:根目录/Log/yyyy-MM/ /// 默认文件:yyyy-MM-dd.log /// /// 日志内容 自动附加时间 public static void Write(string logContent) { string logPath = DateTime.Now.ToString("yyyy-MM"); Write(logPath, logContent); } public static void WriteWithTime(string logContent) { string logPath = DateTime.Now.ToString("yyyy-MM"); logContent = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine + logContent; Write(logPath, logContent); } #endregion 写文本日志 #region 写异常日志 /// /// 写异常日志 /// /// public static void Write(Exception ex) { string logContent = string.Empty; string logPath = DateTime.Now.ToString("yyyy-MM"); logContent += GetExceptionMessage(ex); Write(logPath, logContent); } public static void WriteWithTime(Exception ex) { string logContent = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine; string logPath = DateTime.Now.ToString("yyyy-MM"); logContent += GetExceptionMessage(ex); Write(logPath, logContent); } public static void WriteWithTime(ExceptionContext ex) { if (ex == null) return; string logContent = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine; logContent += "程序异常" + Environment.NewLine; string logPath = DateTime.Now.ToString("yyyy-MM"); Exception Error = ex.Exception; LogMessage logMessage = new LogMessage(); logMessage.OperationTime = DateTime.Now; logMessage.Url = ex.HttpContext.Request.GetDisplayUrl(); if (ex.ActionDescriptor != null) { logMessage.Class = ex.ActionDescriptor.DisplayName; } else { logMessage.Class = "服务器配置问题"; } logMessage.Ip = WebHelper.Ip; logMessage.Host = ex.HttpContext.Request.Host.ToString(); var current = OperatorProvider.Provider.GetCurrent(); if (current != null) { logMessage.UserName = current.UserCode + "(" + current.UserName + ")"; } var err = Error.GetOriginalException(); logMessage.ExceptionInfo = err.Message; logMessage.ExceptionSource = err.Source; logMessage.ExceptionRemark = err.StackTrace; logContent += ExceptionFormat(logMessage); Write(logPath, logContent); } private static string GetExceptionMessage(Exception ex) { string message = string.Empty; if (ex != null) { message += ex.Message; message += Environment.NewLine; Exception originalException = ex.GetOriginalException(); if (originalException != null) { if (originalException.Message != ex.Message) { message += originalException.Message; message += Environment.NewLine; } } message += ex.StackTrace; message += Environment.NewLine; } return message; } #endregion 写异常日志 #region 写日志到指定路径 /// /// 写日志 异步 /// 默认文件:yyyy-MM-dd.log /// /// 日志目录[默认程序根目录\Log\下添加,故使用相对路径,如:营销任务] /// 日志内容 自动附加时间 public static void Write(string logPath, string logContent) { string logFileName = DateTime.Now.ToString("yyyy-MM-dd") + ".log"; Write(logPath, logFileName, logContent); } /// /// 写日志 异步 /// /// 日志目录 /// 日志文件名 /// 日志内容 自动附加时间 public static void Write(string logPath, string logFileName, string logContent) { if (string.IsNullOrWhiteSpace(logContent)) { return; } if (string.IsNullOrWhiteSpace(logPath)) { logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs", DateTime.Now.ToString("yyyy-MM")); } else { logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs", logPath.Trim('\\')); } if (string.IsNullOrWhiteSpace(logFileName)) { logFileName = DateTime.Now.ToString("yyyy-MM-dd") + ".log"; } if (!Directory.Exists(logPath)) { Directory.CreateDirectory(logPath); } string fileName = Path.Combine(logPath, logFileName); Action taskAction = () => { lock (lockHelper) { using (StreamWriter sw = File.AppendText(fileName)) { sw.WriteLine(logContent + Environment.NewLine); sw.Flush(); sw.Close(); } } }; Task task = new Task(taskAction); task.Start(); } /// /// 生成异常信息 /// /// 对象 /// public static string ExceptionFormat(LogMessage logMessage) { StringBuilder strInfo = new StringBuilder(); strInfo.Append("1. 调试: >> 操作时间: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n"); strInfo.Append("2. 地址: " + logMessage.Url + " \r\n"); strInfo.Append("3. 类名: " + logMessage.Class + " \r\n"); strInfo.Append("4. 主机: " + logMessage.Host + " Ip : " + logMessage.Ip + " \r\n"); strInfo.Append("5. 异常: " + logMessage.ExceptionInfo + "\r\n"); strInfo.Append("6. 来源: " + logMessage.ExceptionSource + "\r\n"); strInfo.Append("7. 实例: " + logMessage.ExceptionRemark + "\r\n"); strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n"); return strInfo.ToString(); } /// /// 格式化异常信息 /// /// 对象 /// public static string ExMsgFormat(string message) { //数据库异常 if (message.Contains("An exception occurred while executing DbCommand.")) { if (message.Contains("Duplicate entry '") && message.Contains("key")) { message = "数据违反唯一约束,请检查"; } else if (message.Contains("Data too long for column")) { message = "数据长度过长,请检查"; } else { message = "数据操作异常,请联系管理员"; } } //其他异常 else { if (message.Contains("Object reference not set to an instance of an object.")) { message = "操作对象为空,请联系管理员"; } else if (message.Contains("Value cannot be null")) { message = "值为空,请联系管理员"; } } if (!IsHasCHZN(message)) { message = "程序内部异常,请联系管理员"; } return message; } /// /// 检测是否有中文字符 /// /// /// private static bool IsHasCHZN(string inputData) { Regex RegCHZN = new Regex("[\u4e00-\u9fa5]"); Match m = RegCHZN.Match(inputData); return m.Success; } #endregion 写日志到指定路径 } }