#region Apache License // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to you under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #endregion #define DEBUG using log4net.Layout; using log4net.Core; namespace log4net.Appender { /// /// Appends log events to the system. /// /// /// /// The application configuration file can be used to control what listeners /// are actually used. See the MSDN documentation for the /// class for details on configuring the /// debug system. /// /// /// Events are written using the /// method. The event's logger name is passed as the value for the category name to the Write method. /// /// /// Nicko Cadell public class DebugAppender : AppenderSkeleton { #region Public Instance Constructors /// /// Initializes a new instance of the . /// /// /// /// Default constructor. /// /// public DebugAppender() { } /// /// Initializes a new instance of the /// with a specified layout. /// /// The layout to use with this appender. /// /// /// Obsolete constructor. /// /// [System.Obsolete("Instead use the default constructor and set the Layout property")] public DebugAppender(ILayout layout) { Layout = layout; } #endregion Public Instance Constructors #region Public Instance Properties /// /// Gets or sets a value that indicates whether the appender will /// flush at the end of each write. /// /// /// The default behavior is to flush at the end of each /// write. If the option is set tofalse, then the underlying /// stream can defer writing to physical medium to a later time. /// /// /// Avoiding the flush operation at the end of each append results /// in a performance gain of 10 to 20 percent. However, there is safety /// trade-off involved in skipping flushing. Indeed, when flushing is /// skipped, then it is likely that the last few log events will not /// be recorded on disk when the application exits. This is a high /// price to pay even for a 20% performance gain. /// /// public bool ImmediateFlush { get { return m_immediateFlush; } set { m_immediateFlush = value; } } /// /// Formats the category parameter sent to the Debug method. /// /// /// /// Defaults to a with %logger as the pattern which will use the logger name of the current /// as the category parameter. /// /// /// /// public PatternLayout Category { get { return m_category; } set { m_category = value; } } #endregion Public Instance Properties #if !NETSTANDARD1_3 /// /// Flushes any buffered log data. /// /// The maximum time to wait for logging events to be flushed. /// True if all logging events were flushed successfully, else false. public override bool Flush(int millisecondsTimeout) { // Nothing to do if ImmediateFlush is true if (m_immediateFlush) return true; // System.Diagnostics.Debug is thread-safe, so no need for lock(this). System.Diagnostics.Debug.Flush(); return true; } #endif #region Override implementation of AppenderSkeleton /// /// Writes the logging event to the system. /// /// The event to log. /// /// /// Writes the logging event to the system. /// If is true then the /// is called. /// /// override protected void Append(LoggingEvent loggingEvent) { // // Write the string to the Debug system // if(m_category == null) { System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent)); } else { string category = m_category.Format(loggingEvent); if (string.IsNullOrEmpty(category)) { System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent)); } else { System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), category); } } #if !NETSTANDARD1_3 // // Flush the Debug system if needed // if (m_immediateFlush) { System.Diagnostics.Debug.Flush(); } #endif } /// /// This appender requires a to be set. /// /// true /// /// /// This appender requires a to be set. /// /// override protected bool RequiresLayout { get { return true; } } #endregion Override implementation of AppenderSkeleton #region Private Instance Fields /// /// Immediate flush means that the underlying writer or output stream /// will be flushed at the end of each append operation. /// /// /// /// Immediate flush is slower but ensures that each append request is /// actually written. If is set to /// false, then there is a good chance that the last few /// logs events are not actually written to persistent media if and /// when the application crashes. /// /// /// The default value is true. /// private bool m_immediateFlush = true; /// /// Defaults to a with %logger as the pattern. /// private PatternLayout m_category = new PatternLayout("%logger"); #endregion Private Instance Fields } }