public static RabbitLoggerError Parse(Exception exception) { if (exception == null) { return(null); } var error = new RabbitLoggerError() { Message = exception.Message, StackTrace = exception.StackTrace, InnerError = Parse(exception.InnerException) }; List <RabbitLoggerError> list = new List <RabbitLoggerError>(); if (exception is AggregateException aggregateException) { foreach (var ex in aggregateException.InnerExceptions) { list.Add(Parse(ex)); } } error.InnerErrors = list.ToArray(); return(error); }
/// <summary> /// 日志记录 /// </summary> /// <typeparam name="TState"></typeparam> /// <param name="logLevel"></param> /// <param name="eventId"></param> /// <param name="state"></param> /// <param name="exception"></param> /// <param name="formatter"></param> public void Log <TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func <TState, Exception, string> formatter) { if (string.IsNullOrEmpty(ip)) { lock (ip) { if (string.IsNullOrEmpty(ip)) { ip = GetLocalIp(); } } } if (IsEnabled(logLevel)) { var message = new RabbitLoggerMessage <TState> { Error = RabbitLoggerError.Parse(exception), LogLevel = logLevel, State = state, Message = formatter?.Invoke(state, exception), Category = category, ApplicationName = loggerOptions.ApplicationName, Time = DateTime.Now, IpAddress = ip, }; try { var producer = rabbitLoggerProvider.RentProducer(); //发送消息 if (loggerOptions.Type == RabbitExchangeType.None) { producer.Publish(loggerOptions.Queue, JsonConvert.SerializeObject(message), new QueueOptions() { Arguments = loggerOptions.Arguments, AutoDelete = loggerOptions.AutoDelete, Durable = loggerOptions.Durable }); } else { producer.Publish(loggerOptions.Exchange, category, JsonConvert.SerializeObject(message), new ExchangeQueueOptions() { Type = loggerOptions.Type, RouteQueues = loggerOptions.RouteQueues, Arguments = loggerOptions.Arguments, AutoDelete = loggerOptions.AutoDelete, Durable = loggerOptions.Durable }); } rabbitLoggerProvider.ReturnProducer(producer); } catch (Exception ex) { do { Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } while ((ex = ex.InnerException) != null); }; } }