Yo uso el log4net.Appender.AdoNetAppender appender.

Mi log4net tabla son los siguientes campos [Date],[Thread],[Level],[Logger],[Message],[Exception]

Yo tendría que añadir otro campo para la log4net tabla (e.g SalesId), pero ¿cómo puedo especificar en mi xml y en el código para registrar el «SalesId» cuando el registro de un Error o un mensaje de Información?

por ejemplo, log.Info("SomeMessage", SalesId)

Aquí está el log4net xml

  <appender name="SalesDBAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value ="System.Data.SqlClient.SqlConnection" />
<connectionString value="Data Source=..." />
<commandText value="INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
InformationsquelleAutor Eminem | 2012-08-27

3 Comentarios

  1. 179

    1) Modificar el texto de comando: INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception],[MyColumn]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @CustomColumn)

    2) Agregar la definición de los parámetros para la columna personalizada:

    <parameter>
    <parameterName value="@CustomColumn"/>
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%property{CustomColumn}" />
    </layout>
    </parameter>

    3) a Continuación, utilice uno de log4net de contextos para la transferencia de valores para el parámetro:

    //thread properties...
    log4net.LogicalThreadContext.Properties["CustomColumn"] = "Custom value";
    log.Info("Message"); 
    //...or global properties
    log4net.GlobalContext.Properties["CustomColumn"] = "Custom value";
    • Puede alguien sugerir que el Contexto es lo mejor para el registro de las características del navegador.
    • por lo general, usted va a utilizar el contexto del Subproceso. El GlobalContext es útil para establecer las propiedades que no cambian muy a menudo.
    • Usted debe ser muy cuidadoso al utilizar el ThreadContext en una Aplicación Web, aunque ya que estos tienden a saltar hilos y el ThreadContext no se mueve junto con ella.
    • Podrías explicar un poco más? Parece que el hilo contexto cuestión de negarlo como un buen método para registro de la Información del Usuario? Si el GlobalContext utilizarse en su lugar?
    • Como el nombre implica, el ThreadContext está enlazado con el hilo. Cuando usted está utilizando el async/await patrón es muy probable que el código después de la espera se ejecute en un subproceso diferente y por lo tanto puede conducir a muy extraño comportamiento cuando está usando el ThreadContext de la propiedad.
    • Alguna idea de si LogicalThreadContext es aceptar cuando se utiliza con las Tareas y asincrónica (es decir, en escenarios donde no es seguro que subproceso actual continuará en el procesamiento de la solicitud)?
    • está bien usar con las Tareas, Es no aceptar el uso de ThreadContext aunque, porque siempre se limita a un hilo en concreto.
    • gracias por este. Después de días de búsqueda, finalmente he llegado a través de esta. Impresionante.
    • Es mi opinión, pero me parece un poco raro de esta manera, yo esperaba una sobrecarga que lleva más argumentos para agregar a la nueva LoggingEvent instancia.
    • Yo estaba esperando algo así. Encontrado alguna solución?
    • Nope, por desgracia, finalmente se implementó esta manera :/
    • Donde puedo añadir la columna personalizada a las Propiedades? Debo agregar la columna en todas partes yo soy de registro?
    • Me temo que para que @Ron.

  2. 4

    Tres tipos de registro de contexto disponible en Log4Net.

    1. Log4Net.GlobalContext :- Este contexto compartido a través de todas las aplicaciones de subprocesos y dominios.Si dos hilos de conjunto de la misma propiedad en GlobalContext, Un Valor anula la otra.

    2. Log4Net.ThreadContext :- Este contexto, ámbito de aplicación limitado a subproceso de llamada. Aquí dos hilos pueden establecer misma propiedad para diferentes valores sin primordial para cada uno de los otros.

    3. Log4Net.ThreadLogicalContext :- Este contexto se comporta de manera similar a la ThreadContext. si estás trabajando con una medida de rosca piscina algoritmo o alojamiento de la CLR, usted puede encontrar algunos de uso de este.

    Agregue el código siguiente a su programa.cs archivo:

    static void Main( string[] args )
    {
    log4net.Config.XmlConfigurator.Configure();
    log4net.ThreadContext.Properties[ "myContext" ] = "Logging from Main";
    Log.Info( "this is an info message" );
    Console.ReadLine();
    }

    2) Agregar la definición de los parámetros para la columna personalizada:

      <log4net>      
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%logger (%property{myContext}) [%level]- %message%newline" />
    </layout>
    </appender> 
    </log4net>
  3. 1

    Aquí es una versión de trabajo con algunas preferencias personalizadas. He añadido una columna personalizada para el almacenamiento de generar un código de excepción.

    1) Agregar su columna personalizada(exceptionCode aquí) para Log4net config:

    <commandText value="INSERT INTO Log([Date],[Thread],[Level],[Logger],[Message],[Exception],[ExceptionCode]) 
    VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@exceptionCode)" />
    <parameter>
    <parameterName value="@exceptionCode" />
    <dbType value="String" />
    <size value="11" />
    <layout type="Common.Utils.LogHelper.Log4NetExtentedLoggingPatternLayout">
    <conversionPattern value="%exceptionCode{Code}" />
    </layout>
    </parameter>

    2) Log4NetExtentedLoggingCustomParameters.cs

    namespace Common.Utils.LogHelper
    {
    public class Log4NetExtentedLoggingCustomParameters
    {
    public string ExceptionCode { get; set; }
    public string Message { get; set; }
    public override string ToString()
    {
    return Message;
    }
    }
    }

    3) Log4NetExtentedLoggingPatternConverter.cs

    namespace Common.Utils.LogHelper
    {
    public class Log4NetExtentedLoggingPatternConverter : PatternConverter
    {
    protected override void Convert(TextWriter writer, object state)
    {
    if (state == null)
    {
    writer.Write(SystemInfo.NullText);
    return;
    }
    var loggingEvent = state as LoggingEvent;
    var messageObj = loggingEvent.MessageObject as Log4NetExtentedLoggingCustomParameters;
    if (messageObj == null)
    {
    writer.Write(SystemInfo.NullText);
    }
    else
    {
    switch (this.Option.ToLower()) //this.Option = "Code"
    {
    case "code": //config conversionPattern parameter -> %exceptionCode{Code}
    writer.Write(messageObj.ExceptionCode);
    break;  
    default:
    writer.Write(SystemInfo.NullText);
    break;
    }
    }
    }
    }
    }

    4) Log4NetExtentedLoggingPatternLayout.cs

    namespace Common.Utils.LogHelper
    {
    public class Log4NetExtentedLoggingPatternLayout : PatternLayout
    {
    public Log4NetExtentedLoggingPatternLayout()
    {
    var customConverter = new log4net.Util.ConverterInfo()
    {
    Name = "exceptionCode",
    Type = typeof(Log4NetExtentedLoggingPatternConverter)
    };
    AddConverter(customConverter);
    }
    }
    }

    5) Registrador.cs //Disfrutar de tu registrador con la nueva columna! 🙂

    namespace Common.Utils.LogHelper
    {
    public class Logger
    {
    static ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    public static string LogError(string message, Exception exception = null)
    {
    var logWithErrCode = GetLogWithErrorCode(message);
    Logger.Error(logWithErrCode, exception);
    return logWithErrCode.ExceptionCode;
    }
    private static Log4NetExtentedLoggingCustomParameters GetLogWithErrorCode(string message)
    {
    var logWithErrCode = new Log4NetExtentedLoggingCustomParameters();
    logWithErrCode.ExceptionCode = GenerateErrorCode(); //this method is absent for simplicity. Use your own implementation
    logWithErrCode.Message = message;
    return logWithErrCode;
    }
    }
    }

    referencias:

    http://blog.stvjam.es/2014/01/logging-custom-objects-and-fields-with

Dejar respuesta

Please enter your comment!
Please enter your name here