示例#1
0
文件: STrace.cs 项目: jesumarquez/lt
        /// <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);
                }
            }
        }