/// <summary> /// Writes an array of logging events to the log target. By default it iterates on all /// events and passes them to "Write" method. Inheriting classes can use this method to /// optimize batch writes. /// </summary> /// <param name="logEvents">Logging events to be written out.</param> protected override void Write(AsyncLogEventInfo[] logEvents) { var buckets = logEvents.BucketSort(c => BuildConnectionString(c.LogEvent)); try { foreach (var kvp in buckets) { foreach (var ev in kvp.Value) { try { WriteEventToDatabase(ev.LogEvent); ev.Continuation(null); } catch (Exception exception) { if (exception.MustBeRethrown()) { throw; } // in case of exception, close the connection and report it InternalLogger.Error("Error when writing to database {0}", exception); CloseConnection(); ev.Continuation(exception); } } } } finally { if (!KeepConnection) { CloseConnection(); } } }
/// <summary> /// Writes the specified array of logging events to a file specified in the FileName /// parameter. /// </summary> /// <param name="logEvents"> /// An array of <see cref="LogEventInfo " /> objects. /// </param> /// <remarks> /// This function makes use of the fact that the events are batched by sorting /// the requests by filename. This optimizes the number of open/close calls /// and can help improve performance. /// </remarks> protected override void Write(AsyncLogEventInfo[] logEvents) { var buckets = logEvents.BucketSort(c => FileName.Render(c.LogEvent)); using (var ms = new MemoryStream()) { var pendingContinuations = new List<AsyncContinuation>(); foreach (var bucket in buckets) { var fileName = bucket.Key; ms.SetLength(0); ms.Position = 0; LogEventInfo firstLogEvent = null; foreach (var ev in bucket.Value) { if (firstLogEvent == null) { firstLogEvent = ev.LogEvent; } var bytes = GetBytesToWrite(ev.LogEvent); ms.Write(bytes, 0, bytes.Length); pendingContinuations.Add(ev.Continuation); } FlushCurrentFileWrites(fileName, firstLogEvent, ms, pendingContinuations); } } }
/// <summary> /// Renders an array logging events. /// </summary> /// <param name="logEvents">Array of logging events.</param> protected override void Write(AsyncLogEventInfo[] logEvents) { foreach (var bucket in logEvents.BucketSort(c => GetSmtpSettingsKey(c.LogEvent))) { var eventInfos = bucket.Value; ProcessSingleMailMessage(eventInfos); } }