/// <summary> /// Sends the contents of the buffer. /// </summary> /// <param name="firstLoggingEvent">The first logging event.</param> /// <param name="buffer">The buffer containing the events that need to be send.</param> /// <remarks> /// <para> /// The subclass must override <see cref="SendBuffer(LoggingEvent[])"/>. /// </para> /// </remarks> virtual protected void SendFromBuffer(LoggingEvent firstLoggingEvent, CyclicBuffer buffer) { LoggingEvent[] bufferEvents = buffer.PopAll(); if (firstLoggingEvent == null) { SendBuffer(bufferEvents); } else if (bufferEvents.Length == 0) { SendBuffer(new LoggingEvent[] { firstLoggingEvent }); } else { // Create new array with the firstLoggingEvent at the head LoggingEvent[] events = new LoggingEvent[bufferEvents.Length + 1]; Array.Copy(bufferEvents, 0, events, 1, bufferEvents.Length); events[0] = firstLoggingEvent; SendBuffer(events); } }
/// <summary> /// Initialize the appender based on the options set /// </summary> /// <remarks> /// <para> /// This is part of the <see cref="IOptionHandler"/> delayed object /// activation scheme. The <see cref="ActivateOptions"/> method must /// be called on this object after the configuration properties have /// been set. Until <see cref="ActivateOptions"/> is called this /// object is in an undefined state and must not be used. /// </para> /// <para> /// If any of the configuration properties are modified then /// <see cref="ActivateOptions"/> must be called again. /// </para> /// </remarks> override public void ActivateOptions() { base.ActivateOptions(); // If the appender is in Lossy mode then we will // only send the buffer when the Evaluator triggers // therefore check we have an evaluator. if (m_lossy && m_evaluator == null) { ErrorHandler.Error("Appender [" + Name + "] is Lossy but has no Evaluator. The buffer will never be sent!"); } if (m_bufferSize > 1) { m_cb = new CyclicBuffer(m_bufferSize); } else { m_cb = null; } }