#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 TRACE 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 /// trace system. /// /// /// Events are written using the System.Diagnostics.Trace.Write(string,string) /// method. The event's logger name is the default value for the category parameter /// of the Write method. /// /// /// Compact Framework
/// The Compact Framework does not support the /// class for any operation except Assert. When using the Compact Framework this /// appender will write to the system rather than /// the Trace system. This appender will therefore behave like the . ///
///
/// Douglas de la Torre /// Nicko Cadell /// Gert Driesen /// Ron Grabowski public class TraceAppender : AppenderSkeleton { #region Public Instance Constructors /// /// Initializes a new instance of the . /// /// /// /// Default constructor. /// /// public TraceAppender() { } /// /// 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 TraceAppender(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; } } /// /// The category parameter sent to the Trace method. /// /// /// /// Defaults to %logger 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 #region Override implementation of AppenderSkeleton /// /// Writes the logging event to the system. /// /// The event to log. /// /// /// Writes the logging event to the system. /// /// protected override void Append(LoggingEvent loggingEvent) { // // Write the string to the Trace system // #if NETCF System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), m_category.Format(loggingEvent)); #else System.Diagnostics.Trace.Write(RenderLoggingEvent(loggingEvent), m_category.Format(loggingEvent)); #endif // // Flush the Trace system if needed // if (m_immediateFlush) { #if NETCF System.Diagnostics.Debug.Flush(); #else System.Diagnostics.Trace.Flush(); #endif } } /// /// This appender requires a to be set. /// /// true /// /// /// This appender requires a to be set. /// /// protected override 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 %logger /// private PatternLayout m_category = new PatternLayout("%logger"); #endregion Private Instance Fields /// /// 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.Trace and System.Diagnostics.Debug are thread-safe, so no need for lock(this). #if NETCF System.Diagnostics.Debug.Flush(); #else System.Diagnostics.Trace.Flush(); #endif return true; } } }