Thanks for the hint, using the loggingEvent.RenderedMessage() is working.

I am just wondering why using "loggingEvent.RenderedMessage" does not work.
This was the way I first tried to do it. 

Is this a bug, or am I missing something?

Greetings from Osnabrueck,
Theo

-----Ursprüngliche Nachricht-----
Von: Nicko Cadell [mailto:[EMAIL PROTECTED] 
Gesendet: Donnerstag, 20. April 2006 20:59
An: Log4NET User
Betreff: RE: Layout settings not applied to custom event appender

The Layout is designed to convert the LoggingEvent object into a String.
You need to use the Layout yourself in your Append method. 

Have a look at the DebugAppender.cs in the log4net source code for an
example of this. The DebugAppender uses the RenderLoggingEvent() helper
method provided by the AppenderSkeleton base class.

Cheers,
Nicko

> -----Original Message-----
> From: Hans-Theo Jungeblut [mailto:[EMAIL PROTECTED] 
> Sent: 20 April 2006 08:41
> To: [email protected]
> Subject: Layout settings not applied to custom event appender
> 
> Hallo everyone,
> I have implemented a really simple event appender, which 
> allows me to forward the message from the Log4Net Framework 
> in my own application.
> This also works fine, but the layout settings from the 
> configuration file are not applied to my appender. The same 
> Layout settings work fine for the default appenders, which I 
> removed for simplification. I added the appender source code 
> and config below. Hopefully somebody can tell me how to fix 
> this problem.
> 
> Thx in advance,
> Theo Jungeblut
> 
> Settings:
> ------------------------------
> Log4Net               Version 1.2.9 beta
> OS:                   Win XP SP2
> .Net:                 1.1 (VS2003)
> Assembly type:        DLL     
> Application type:     windows application
> 
> 
> Appender Source code:
> --------------------------------------------------------------
> ----------
> -----------------
> using log4net.Appender;
> using log4net.Core;
> using log4net.Layout;
> using MyEvents;
> 
> namespace MyAppender
> {
>       /// <summary>
>       /// Adapts the Log4Net message for inner application usage.
>       /// When configured in the Log4Net configuration, each 
> log message
>       /// results into an OnMessageSent event.
>       /// </summary>
>       public class EventAppender: AppenderSkeleton
>       {
>               #region --------------------- Private Fields
> ---------------------
>               /// <summary>
>               /// Event raised when message is send
>               /// </summary>
>               public event MessageSentEventHandler MessageSent;
>               #endregion
>               
>       
>               #region --------------------- Private Fields
> ---------------------
>               /// <summary>
>               /// Immediate flush means that the underlying 
> writer or output stream
>               /// will be flushed at the end of each append operation.
>               /// </summary>
>               /// <remarks>
>               /// <para>
>               /// Immediate flush is slower but ensures that 
> each append request is 
>               /// actually written. If <see 
> cref="ImmediateFlush"/> is set to
>               /// <c>false</c>, 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.
>               /// </para>
>               /// <para>
>               /// The default value is <c>true</c>.</para>
>               /// </remarks>
>               private bool immediateFlush;
>               #endregion
>       
>               
>               #region --------------------- Public Properties
> ---------------------
>               #region ImmediateFlush
>               /// <summary>
>               /// Gets or sets a value that indicates whether 
> the appender will 
>               /// flush at the end of each write.
>               /// </summary>
>               /// <remarks>
>               /// <para>The default behavior is to flush at 
> the end of each 
>               /// write. If the option is set to<c>false</c>, 
> then the underlying 
>               /// stream can defer writing to physical medium 
> to a later time. 
>               /// </para>
>               /// <para>
>               /// 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.
>               /// </para>
>               /// </remarks>
>               public bool ImmediateFlush
>               {
>                       get
>                       {
>                               return immediateFlush;
>                       }
>                       set
>                       {
>                               immediateFlush = value;
>                       }
>               }
>               #endregion
>               
>               #region RequiresLayout
>               /// <summary>
>               /// This appender requires a <see 
> cref="Layout"/> to be set.
>               /// </summary>
>               /// <value><c>true</c></value>
>               /// <remarks>
>               /// <para>
>               /// This appender requires a <see 
> cref="Layout"/> to be set.
>               /// </para>
>               /// </remarks>
>               override protected bool RequiresLayout
>               {
>                       get { return true; }
>               }
>               #endregion
>               
>               /// <summary>
>               /// Gets and sets the loqout for the appender
>               /// </summary>
>               public override ILayout Layout
>               {
>                       get
>                       {
>                               return base.Layout;
>                       }
>                       set
>                       {
>                               base.Layout = value;
>                       }
>               }
>               
>               #endregion
>               
>               
>               #region --------------------- Constructor/Destructor
> ---------------------
>               /// <summary>
>               /// Initializes a new instance of the <see 
> cref="EventAppender" />.
>               /// </summary>
>               /// <remarks>
>               /// <para>
>               /// Default constructor.
>               /// </para>
>               /// </remarks>
>               public EventAppender()
>               {
>                       this.immediateFlush = true;
>               
>               }
>               
>               /// <summary>
>               /// Initializes a new instance of the <see 
> cref="TraceAppender" /> 
>               /// with a specified layout.
>               /// </summary>
>               /// <param name="layout">The layout to use with 
> this appender.</param>
>               /// <remarks>
>               /// <para>
>               /// Obsolete constructor.
>               /// </para>
>               /// </remarks>
>               [System.Obsolete("Instead use the default 
> constructor and set the Layout property")]
>               public EventAppender(ILayout layout):this()
>               {
>                       Layout = layout;
>               }
>               #endregion
> 
> 
>               #region --------------------- Eventhandler
> ---------------------
>               #region Append
>               /// <summary>
>               /// Writes the logging event to the <see 
> cref="System.Diagnostics.Trace"/> system.
>               /// </summary>
>               /// <param name="loggingEvent">The event to log.</param>
>               /// <remarks>
>               /// <para>
>               /// Writes the logging event to the <see 
> cref="System.Diagnostics.Trace"/> system.
>               /// </para>
>               /// </remarks>
>               override protected void Append(LoggingEvent
> loggingEvent) 
>               {
>                       OnMessageSent(new MessageSentEventArgs( 
> loggingEvent ) );
>               }
>               #endregion
>               
>               #region OnMessageSent
>               /// <summary>
>               /// 
>               /// </summary>
>               /// <param name="arg"></param>
>               protected virtual void
> OnMessageSent(MessageSentEventArgs arg)
>               {
>                       if (MessageSent != null)
>                       {
>                               MessageSent(this, arg);
>                       }
>               }
>               #endregion
>               #endregion
>       }
> }
> 
> 
> 
> 
> Config File:
> --------------------------------------------------------------
> ----------
> -------------------
> <?xml version="1.0" encoding="utf-8" ?>
> <log4net>
>       <appender name="Event" type="Ade.Fdt.Container.EventAppender">
>               <layout type="log4net.Layout.PatternLayout">
>                       <conversionPattern value="%date - 
> %message %newline" />
>               </layout>
>       </appender>
> 
>       <root>
>               <level value="DEBUG" />
>               <appender-ref ref="Event" />
>       </root> 
> </log4net>
> 

Reply via email to