/// <summary> /// el resto de los metodos de logueo terminan llamando a este que es el que realmente hace el trabajo /// </summary> /// <param name="component"></param> /// <param name="e"></param> /// <param name="device"></param> /// <param name="logType"></param> /// <param name="context"></param> /// <param name="str"></param> public static void Log(String component, Exception e, int device, LogTypes logType, Dictionary <String, String> context, String str) { try { #region Console Trace if (Environment.UserInteractive && ((ConsoleFilter.Length == 1) || ConsoleFilter.Contains(device))) { Console.WriteLine(str); if (e != null) { Console.WriteLine("{1}{1}exception {0}{1}", e, Environment.NewLine); if (e.InnerException != null) { Console.WriteLine("{1}innerexception {0}{1}{1}", e.InnerException, Environment.NewLine); } } } #endregion #region Log4NET Trace if (TracerType.Contains(Config.Tracer.Types.Log4Net)) { var logger = LogManager.GetLogger(component); using (ThreadContext.Stacks["DeviceId"].Push(device.ToString(CultureInfo.InvariantCulture))) { switch (logType) { case LogTypes.Debug: logger.Debug(str, e); break; case LogTypes.Trace: logger.Info(str, e); break; case LogTypes.Error: logger.Error(str, e); break; case LogTypes.Exception: logger.Fatal(str, e); break; case LogTypes.Warning: logger.Warn(str, e); break; } } // value will be popped off the stack here } #endregion #region Fota Folder Trace /*if (TracerType.Contains(Config.Tracer.Types.Fota) && (device != 0) && ConsoleFilter.Contains(device)) * { * ReformatCached(ref str, format, args); * FotaTrace(device, str); * }//*/ #endregion #region Database Trace if (TracerType.Contains(Config.Tracer.Types.DataBase)) { var type = logType.GetValue(); if (!(type < MinLogTypeValue)) { var log = new Log { DateTime = DateTime.UtcNow, Module = Module, Component = component, Message = str, Type = type, }; if (e != null) { log.AddContext("exception", e.ToString()); log.AddContext("exception.message", e.Message); log.AddContext("exception.stacktrace", e.StackTrace); if (e.InnerException != null) { log.AddContext("exception.innerexception", e.InnerException.ToString()); log.AddContext("exception.innerexception.message", e.InnerException.Message); log.AddContext("exception.innerexception.stacktrace", e.InnerException.StackTrace); } } else if (type == LogTypes.Error.GetValue()) { var stackTrace = new StackTrace(); // get call stack var stackFrames = stackTrace.GetFrames(); // get method calls (frames) var stacksb = new StringBuilder(); // write call stack method names foreach (var stackFrame in stackFrames) { stacksb.AppendFormat("{0}{1}", stackFrame, Environment.NewLine); // write method name } log.AddContext("stacktrace", stacksb.ToString()); } if (context != null) { foreach (var ctx in context) { log.AddContext(ctx.Key, ctx.Value); } } if (device != 0) { log.Device = device; } Queue.Enqueue(log); } } #endregion } catch (Exception ee) { var err = String.Format("Exception:{1}{0}{1}{1}Log original: Component={2}; Format={3}{1}{1}", ee, Environment.NewLine, component, str); if (!(ee is IndexOutOfRangeException)) { File.AppendAllText(String.Format("logs/{0:yyyy-MM-dd HH mm} TraceErrors.txt", DateTime.Now), err); } if (Environment.UserInteractive) { Console.WriteLine(err); } } }