loggingEvent.RenderedMessage has nothing to do with the Layout. The
LoggingEvent does not know about layouts.
The Message is only part of the LoggingEvent, there are lots of other parts
like the ThreadName, the TimeStamp, the Properties, the Level. The Message is
just the one of these parts.
In the following example user code the message is a string "This is the
message":
log.Debug("This is the message", anException);
However the Message can be any object. e.g.
log.Debug(myStrangeObject);
This message object is then _rendered_ into a string by the
log4net.ObjectRenderer classes. You can define your own IObjectRenderer that is
used to convert your custom object to a string. By default the ToString()
method will be used.
The loggingEvent.RenderedMessage is the message object as a String having been
passed through the appropriate renderers.
The concept and application of Layouts is up to the individual Appender. Some
appenders don't use layouts at all.
Note that the Layout takes all of the properties of the LoggingEvent (including
the RenderedMessage) and converts that to a single String. This is typically
used where the Appender wants to write the LoggingEvent to a text orientated
data source, e.g. a file or the console.
Cheers,
Nicko
> -----Original Message-----
> From: Hans-Theo Jungeblut [mailto:[EMAIL PROTECTED]
> Sent: 21 April 2006 08:19
> To: Log4NET User
> Subject: AW: Layout settings not applied to custom event appender
>
> 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>
> >
>