Sure thing:
<appender name="RollingLogFileAppender2"
type="log4net.Appender.RollingFileAppender">
<param name="File" value="Test1-log2.txt" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="5" />
<param name="MaximumFileSize" value="2MB" />
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Ext.GSI.GSIEventLayout" />
</appender>
The complete layout class is:
using System;
using System.IO;
using log4net.Core;
using log4net.Layout;
namespace log4net.Ext.GSI
{
public class GSIEventLayout : LayoutSkeleton
{
private PatternLayout m_nestedLayout;
public override void ActivateOptions()
{
this.IgnoresException = true;
this.Footer = "";
this.Header = "";
}
public override void Format(TextWriter writer, LoggingEvent
loggingEvent)
{
writer.Write("<GSIEventLog>");
writer.Write("<Domain>" + loggingEvent.Domain +
"</Domain>");
writer.Write("<ClassName>" +
loggingEvent.LocationInformation.ClassName + "</ClassName>");
writer.Write("<RenderedMessage>" +
loggingEvent.RenderedMessage + "</message>");
writer.Write("<HostName>" +
loggingEvent.LookupProperty("log4net:HostName").ToString() +
"</HostName>");
writer.Write("<Identity>" + loggingEvent.UserName +
"</Identity>");
writer.Write("<LoggerName>" +
loggingEvent.LoggerName + "</LoggerName>");
writer.Write("<ThreadName>" +
loggingEvent.ThreadName + "</ThreadName>");
writer.Write("<TimeStamp>" + loggingEvent.TimeStamp
+ "</TimeStamp>");
writer.Write("<EventId>" +
loggingEvent.LookupProperty("EventId").ToString() + "</EventId>");
writer.Write("<Message2>" +
loggingEvent.LookupProperty("Message").ToString() + "</Message2>");
writer.Write("<AppUser>" +
loggingEvent.LookupProperty("AppUser").ToString() + "</AppUser>");
writer.Write("<SourceId>" +
loggingEvent.LookupProperty("SourceId").ToString() + "</SourceId>");
writer.Write("<ExMessage>" +
loggingEvent.ExceptionObject.Message + "</ExMessage>");
writer.Write("<ExStackTrace>" +
loggingEvent.ExceptionObject.StackTrace + "</ExStackTrace>");
writer.Write("</GSIEventLog>");
writer.WriteLine();
}
public PatternLayout PatternLayout
{
get { return m_nestedLayout; }
set { m_nestedLayout = value; }
}
}
}
-----Original Message-----
From: Ron Grabowski [mailto:[EMAIL PROTECTED]
Sent: Thursday, September 15, 2005 4:04 PM
To: Log4NET User
Subject: RE: LayoutSkeleton Help
Could you post the complete appender node that is using this layout?
--- Jon Finley <[EMAIL PROTECTED]> wrote:
> That line is loading the exception text inside the appropriate XML
> element.
>
> Using UltraEdit to view the results.
>
> If every element from the layout is removed, the only thing that shows
> up is the exception text.
>
> If elements are removed one at a time, I see the correct XML but still
> get the exception text appended to the output.
>
> Jon
>
> -----Original Message-----
> From: Ron Grabowski [mailto:[EMAIL PROTECTED]
> Sent: Thursday, September 15, 2005 3:41 PM
> To: Log4NET User
> Subject: RE: LayoutSkeleton Help
>
> What about this line:
>
> writer.Write("<RenderedMessage>" + loggingEvent.RenderedMessage +
> "</message>");
>
> Are you viewing the output in a browser or with a program like
> Notepad?
>
> Have you tried removing all the elements and adding each one back one
> by one starting from the bottom?
>
> --- Jon Finley <[EMAIL PROTECTED]> wrote:
>
> > No, same issue Leo. Thanks for the catch though, I'm sure it saved
> me
> > from some troubleshooting down the road. ;-)
> >
> > Jon
> >
> >
> > _____
> >
> > From: Hart, Leo [mailto:[EMAIL PROTECTED]
> > Sent: Thursday, September 15, 2005 3:16 PM
> > To: Log4NET User
> > Subject: RE: LayoutSkeleton Help
> >
> >
> > It looks like you are missing a "<" in this line:
> >
> > writer.Write("<ClassName>" +
> > loggingEvent.LocationInformation.ClassName + "/ClassName>");
> >
> > Does that fix the problem?
> >
> >
> > -----Original Message-----
> > From: Jon Finley [mailto:[EMAIL PROTECTED]
> > Sent: Thursday, September 15, 2005 4:13 PM
> > To: 'Log4NET User'
> > Subject: LayoutSkeleton Help
> >
> >
> >
> > Hi,
> >
> > I have a very simple Layout based on LayoutSkeleton that generates
> XML
> > using the LoggingEvent values. However; the exception text always
> > prints at the end of the XML. Is there a way to turn this off?
> >
> > My Format routine is as follows:
> >
> > public override void Format(TextWriter writer,
> > LoggingEvent
> > loggingEvent)
> > {
> > writer.Write("<GSIEventLog>");
> > writer.Write("<Domain>" + loggingEvent.Domain +
> > "</Domain>");
> > writer.Write("<ClassName>" +
> > loggingEvent.LocationInformation.ClassName + "/ClassName>");
> > writer.Write("<RenderedMessage>" +
> > loggingEvent.RenderedMessage + "</message>");
> > writer.Write("<HostName>" +
> > loggingEvent.LookupProperty("log4net:HostName").ToString() +
> > "</HostName>");
> > writer.Write("<Identity>" +
> > loggingEvent.UserName + "</Identity>");
> > writer.Write("<LoggerName>" +
> > loggingEvent.LoggerName + "</LoggerName>");
> > writer.Write("<ThreadName>" +
> > loggingEvent.ThreadName + "</ThreadName>");
> > writer.Write("<TimeStamp>" +
> > loggingEvent.TimeStamp
> > + "</TimeStamp>");
> > writer.Write("<EventId>" +
> > loggingEvent.LookupProperty("EventId").ToString() + "</EventId>");
> > writer.Write("<Message2>" +
> > loggingEvent.LookupProperty("Message").ToString() + "</Message2>");
> > writer.Write("<AppUser>" +
> > loggingEvent.LookupProperty("AppUser").ToString() + "</AppUser>");
> > writer.Write("<SourceId>" +
> > loggingEvent.LookupProperty("SourceId").ToString() +
> "</SourceId>");
> > writer.Write("<ExMessage>" +
> > loggingEvent.ExceptionObject.Message + "</ExMessage>");
> > writer.Write("<ExStackTrace>" +
> > loggingEvent.ExceptionObject.StackTrace + "</ExStackTrace>");
> > writer.Write("</GSIEventLog>");
> >
> > writer.WriteLine();
> > }
> >
> >
> > The output is:
> >
>
<GSIEventLog><Domain>Test1.exe</Domain><ClassName>Test1.Form1/ClassName><Ren
> >
>
deredMessage>message</message><HostName>jon-lt</HostName><Identity>GSI\j
> deredMessage>finl
> >
>
ey</Identity><LoggerName>Test1.Form1</LoggerName><ThreadName>2516</ThreadNam
> > e><TimeStamp>9/15/2005 3:00:04
> >
>
PM</TimeStamp><EventId>1111</EventId><Message2>message</Message2><AppUser>jf
> > inley-AppUser</AppUser><SourceId></SourceId><ExMessage>Object
> > reference not
> > set to an instance of an object.</ExMessage><ExStackTrace> at
> > Test1.Form1.btnLog4NetTest_Click(Object sender, EventArgs e) in
> > C:\Development_NET\Test\Test1\Form1.vb:line
> > 236</ExStackTrace></GSIEventLog>
> > System.NullReferenceException: Object reference not set to an
> instance
> > of an object.
> > at Test1.Form1.btnLog4NetTest_Click(Object sender, EventArgs e)
> in
> > C:\Development_NET\Test\Test1\Form1.vb:line 236
> >
> > I would like the output to be:
> >
>
<GSIEventLog><Domain>Test1.exe</Domain><ClassName>Test1.Form1/ClassName><Ren
> >
>
deredMessage>message</message><HostName>jon-lt</HostName><Identity>GSI\j
> deredMessage>finl
> >
>
ey</Identity><LoggerName>Test1.Form1</LoggerName><ThreadName>2516</ThreadNam
> > e><TimeStamp>9/15/2005 3:00:04
> >
>
PM</TimeStamp><EventId>1111</EventId><Message2>message</Message2><AppUser>jf
> > inley-AppUser</AppUser><SourceId></SourceId><ExMessage>Object
> > reference not
> > set to an instance of an object.</ExMessage><ExStackTrace> at
> > Test1.Form1.btnLog4NetTest_Click(Object sender, EventArgs e) in
> > C:\Development_NET\Test\Test1\Form1.vb:line
> > 236</ExStackTrace></GSIEventLog>
> >
> >
> > Thank you,
> >
> > Jon
> >
> >
>
>
>
>