/// <summary> /// Add a log event to the ElasticSearch Repo /// </summary> /// <param name="loggingEvent"></param> protected override void Append(Core.LoggingEvent loggingEvent) { if (string.IsNullOrEmpty(ConnectionString)) { var exception = new InvalidOperationException("Connection string not present."); ErrorHandler.Error("Connection string not included in appender.", exception, ErrorCode.GenericFailure); return; } client = new ElasticClient(ConnectionBuilder.BuildElsticSearchConnection(ConnectionString)); LogEvent logEvent = new LogEvent(); if (logEvent == null) { throw new ArgumentNullException("logEvent"); } logEvent.LoggerName = loggingEvent.LoggerName; logEvent.Domain = loggingEvent.Domain; logEvent.Identity = loggingEvent.Identity; logEvent.ThreadName = loggingEvent.ThreadName; logEvent.UserName = loggingEvent.UserName; logEvent.MessageObject = loggingEvent.MessageObject == null ? "" : loggingEvent.MessageObject.ToString(); logEvent.TimeStamp = loggingEvent.TimeStamp; logEvent.Exception = loggingEvent.ExceptionObject == null ? "" : loggingEvent.MessageObject.ToString(); logEvent.Message = loggingEvent.RenderedMessage; logEvent.Fix = loggingEvent.Fix.ToString(); logEvent.HostName = Environment.MachineName; if (loggingEvent.Level != null) { logEvent.Level = loggingEvent.Level.DisplayName; } if (loggingEvent.LocationInformation != null) { logEvent.ClassName = loggingEvent.LocationInformation.ClassName; logEvent.FileName = loggingEvent.LocationInformation.FileName; logEvent.LineNumber = loggingEvent.LocationInformation.LineNumber; logEvent.FullInfo = loggingEvent.LocationInformation.FullInfo; logEvent.MethodName = loggingEvent.LocationInformation.MethodName; } logEvent.Properties = loggingEvent.Properties.GetKeys().ToDictionary(key => key, key => logEvent.Properties[key].ToString()); if (client.IsValid) { client.IndexAsync(logEvent); } else { var exception = new InvalidOperationException("Connection to ElasticSearch is invalid."); ErrorHandler.Error("Invalid connection to ElasticSearch", exception, ErrorCode.GenericFailure); return; } }
private static LogEvent CreateLogEvent(LoggingEvent loggingEvent) { if (loggingEvent == null) { throw new ArgumentNullException("loggingEvent"); } var logEvent = new LogEvent(); logEvent.Id = new UniqueIdGenerator().GenerateUniqueId(); logEvent.LoggerName = loggingEvent.LoggerName; logEvent.Domain = loggingEvent.Domain; logEvent.Identity = loggingEvent.Identity; logEvent.ThreadName = loggingEvent.ThreadName; logEvent.UserName = loggingEvent.UserName; logEvent.MessageObject = loggingEvent.MessageObject == null ? "" : loggingEvent.MessageObject.ToString(); logEvent.TimeStamp = loggingEvent.TimeStamp.ToUniversalTime().ToString("O"); logEvent.Exception = loggingEvent.ExceptionObject == null ? "" : loggingEvent.ExceptionObject.ToString(); logEvent.Message = loggingEvent.RenderedMessage; logEvent.Fix = loggingEvent.Fix.ToString(); logEvent.HostName = Environment.MachineName; if (loggingEvent.Level != null) { logEvent.Level = loggingEvent.Level.DisplayName; } if (loggingEvent.LocationInformation != null) { logEvent.ClassName = loggingEvent.LocationInformation.ClassName; logEvent.FileName = loggingEvent.LocationInformation.FileName; logEvent.LineNumber = loggingEvent.LocationInformation.LineNumber; logEvent.FullInfo = loggingEvent.LocationInformation.FullInfo; logEvent.MethodName = loggingEvent.LocationInformation.MethodName; } var properties = loggingEvent.GetProperties(); foreach (var propertyKey in properties.GetKeys()) { logEvent.Properties.Add(propertyKey, properties[propertyKey].ToString()); } // Add a "@timestamp" field to match the logstash format logEvent.Properties.Add("@timestamp", loggingEvent.TimeStamp.ToUniversalTime().ToString("O")); return logEvent; }
/// <summary> /// Create the new event in Elasticsearch by performing a generic http post /// </summary> /// <param name="logEvent">LogEvent with parameters filled in</param> public void CreateEvent(LogEvent logEvent) { using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { string json = new JavaScriptSerializer().Serialize(logEvent); streamWriter.Write(json); streamWriter.Flush(); streamWriter.Close(); var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); httpResponse.Close(); if (httpResponse.StatusCode != HttpStatusCode.Created) { throw new InvalidOperationException("Failed to correctly add the event to the Elasticsearch index."); } } }