예제 #1
0
        /// <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();
                }
            }
        }
예제 #2
0
        /// <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);
                }
            }
        }
예제 #3
0
 /// <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);
     }
 }