2009-07-18 16 views
15

Quiero un control total sobre la salida log4net xml.Log4net xml output

¿Cómo se puede personalizar la plantilla de salida?

Respuesta

28

Como suggested por MrPeregrination tiene que escribir una clase que deriva de XmlLayoutBase, reemplazar el método FormatXml e instruir a su appender usarlo como diseño:

class Program 
{ 
    static void Main(string[] args) 
    { 
     XmlConfigurator.Configure(); 
     ILog log = log4net.LogManager.GetLogger(typeof(Program)); 
     log.Debug("Hello world"); 
    } 
} 

public class MyXmlLayout : XmlLayoutBase 
{ 
    protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) 
    { 
     writer.WriteStartElement("LogEntry"); 
     writer.WriteStartElement("Message"); 
     writer.WriteString(loggingEvent.RenderedMessage); 
     writer.WriteEndElement(); 
     writer.WriteEndElement(); 
    } 
} 

Y en app.config poner esto:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 
    </configSections> 

    <log4net> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <param name="File" value="log.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="MyNamespace.MyXmlLayout" /> 
    </appender> 

    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
    </log4net> 
</configuration> 

esto producirá entradas como se muestra en el archivo de registro:

<LogEntry><Message>Hello world</Message></LogEntry> 
+0

Darin, muchas gracias, finalmente llego al fondo de esto, pero ¿puede decirme por favor, necesito tener esta base de diseño personalizada en su propia biblioteca de clase, en mi biblioteca de clases de aplicaciones, o en la biblioteca de clases de log4net (recomplile)? –

+0

Puede tener esta clase en su propia biblioteca de clase o en su biblioteca de clase de aplicación. Si lo tiene en su propia biblioteca de clases, necesita especificar el nombre del ensamblado que lo contiene:

+0

Darin, ¿sigue monitoreando esta pregunta? –

3

Echa un vistazo a la clase XmlLayoutBase. Creo que eso es probablemente lo que necesitas. Hay una función FormatXML que deberá sobrescribir para proporcionar al XmlWriter los datos formateados correctamente.

+0

¿Podría tener un poco más de detalle, por favor? –