using Aitex.Core.RT.SCCore; using System; using System.Linq; using System.Diagnostics; using MECF.Framework.Common.Equipment; using System.Text; using Aitex.Core.RT.Event; using System.Collections.Generic; using System.Threading; namespace Aitex.Core.RT.Log { public static class LOG { public enum Level { Undefine, Debug, Info, Warning, Error } public static ICommonLog InnerLogger { set; private get; } public static Action PMErrorInterrupt; private static DateTime _lstErrTime; private static Queue _errMessages = new Queue(); private static void Debug(string message) { if (InnerLogger != null && SC.GetValue("System.IsOpenDebugLog") ==true) InnerLogger.Debug(message); } private static void Info(string message) { if (InnerLogger != null) InnerLogger.Info(message); } private static void Warning(string message) { if (InnerLogger != null) InnerLogger.Warning(message); } private static void Error(string message) { if (InnerLogger != null) InnerLogger.Error(message); } static string GetFormatStackFrameInfo(Exception ex, int traceLevel = 2) { StackFrame sf = new StackTrace(true).GetFrame(traceLevel + 1); string pathFile = sf.GetFileName(); string file = string.IsNullOrEmpty(pathFile) ? "" : pathFile.Substring(pathFile.LastIndexOf('\\') + 1); return $"{ex.Message}\r\n{file}\tLine {sf.GetFileLineNumber()}\t{sf.GetMethod().Name}()"; } public static void Write(eEvent id, string module, params string[] values) { Write(id, ModuleHelper.Converter(module), values); } public static void WriteExeption(Exception ex) { if (!_errMessages.Contains(ex.Message)) { if (_errMessages.Count > 30) { _errMessages.Dequeue(); _errMessages.Enqueue(ex.Message); } else _errMessages.Enqueue(ex.Message); _lstErrTime = DateTime.Now; Write(eEvent.ERR_EXCEPTION, ModuleName.System, GetFormatStackFrameInfo(ex)); } else if (_lstErrTime == null || (DateTime.Now - _lstErrTime).TotalMilliseconds > 10000) { _lstErrTime = DateTime.Now; Write(eEvent.ERR_EXCEPTION, ModuleName.System, GetFormatStackFrameInfo(ex)); } } public static void WriteExeption(string prefix, Exception ex) { Write(eEvent.ERR_EXCEPTION, ModuleName.System, prefix + GetFormatStackFrameInfo(ex)); } public static void WriteDBExeption(string prefix, Exception ex) { WriteDBExceptionLog(eEvent.ERR_EXCEPTION, ModuleName.System.ToString(), prefix + GetFormatStackFrameInfo(ex)); } public static void WriteSingeLine(eEvent id, ModuleName module, string log) { string newLog = log.Replace("\r", "<回车>"); newLog = newLog.Replace("\n", "<换行>"); Write(id, module, newLog); } private static void WriteDBExceptionLog(eEvent id, string module, params string[] values) { var logItem = LogDefineManager.LogItems?.Where(x => x.Id == id).FirstOrDefault(); if (logItem != null) { var item1 = logItem.Id; var item2 = string.Format(logItem.GlobalDescription_zh, values); var item3 = module; StringBuilder text = new StringBuilder(); text.Append(((int)item1).ToString().PadLeft(8)); text.Append(" "); text.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); text.Append(" "); text.Append(item3.PadLeft(12)); text.Append(" "); text.Append(Thread.CurrentThread.ManagedThreadId); text.Append(" "); text.Append(string.Format(logItem.GlobalDescription_zh, values)); string message = text.ToString(); //test += (message + "\r\n"); Level level = Level.Undefine; Enum.TryParse(logItem.Level, out level); switch (level) { case Level.Debug: Debug(message); break; case Level.Info: Info(message); break; case Level.Warning: Warning(message); break; case Level.Error: Error(message); break; default: break; } } } public static void WriteLog(eEvent id,string module,params string[] values) { var logItem = LogDefineManager.LogItems?.Where(x => x.Id == id).FirstOrDefault(); if (logItem != null) { var item1 = logItem.Id; var item2 = string.Format(logItem.GlobalDescription_zh, values); var item3 = module; StringBuilder text = new StringBuilder(); text.Append(((int)item1).ToString().PadLeft(8)); text.Append(" "); text.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); text.Append(" "); text.Append(item3.PadLeft(12)); text.Append(" "); text.Append(Thread.CurrentThread.ManagedThreadId); text.Append(" "); text.Append(string.Format(logItem.GlobalDescription_zh, values)); string message = text.ToString(); //test += (message + "\r\n"); Level level = Level.Undefine; Enum.TryParse(logItem.Level, out level); switch (level) { case Level.Debug: Debug(message); break; case Level.Info: //EV.PostInfoLog(module.ToString(), id, string.Format(((int)item1).ToString().PadRight(6)+ logItem.GlobalDescription_zh, values)); EV.PostInfoLog(module, id, string.Format(logItem.GlobalDescription_zh, values)); Info(message); break; case Level.Warning: EV.PostWarningLog(module, id, string.Format(logItem.GlobalDescription_zh, values)); Warning(message); break; case Level.Error: EV.PostAlarmLog(module, id, string.Format(logItem.GlobalDescription_zh, values)); Error(message); break; default: break; } } } public static void Write(eEvent id, ModuleName module, params string[] values) { WriteLog(id, module.ToString(), values); } public static void WriteBackgroundLog(eEvent id, string module, params string[] values) { var logItem = LogDefineManager.LogItems?.Where(x => x.Id == id).FirstOrDefault(); if (logItem != null) { var item1 = logItem.Id; var item2 = string.Format(logItem.GlobalDescription_zh, values); var item3 = module; StringBuilder text = new StringBuilder(); text.Append(((int)item1).ToString().PadLeft(8)); text.Append(" "); text.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); text.Append(" "); text.Append(item3.PadLeft(12)); text.Append(" "); text.Append(Thread.CurrentThread.ManagedThreadId); text.Append(" "); text.Append(string.Format(logItem.GlobalDescription_zh, values)); string message = text.ToString(); //test += (message + "\r\n"); Level level = Level.Undefine; Enum.TryParse(logItem.Level, out level); switch (level) { case Level.Debug: Debug(message); break; case Level.Info: Info(message); break; case Level.Warning: Warning(message); break; case Level.Error: Error(message); break; default: break; } } } } }