2011-04-05 13 views
20

Tengo la configuración de log4net y estoy configurado para insertar en una tabla sql server 2005. Mi mesa se llama Log. Cuando llamo al método log4net, no ingresa ningún dato en la base de datos de registro en el servidor sql. No recibo ningún error del código C# de mi cliente. ¿Debo agregar un usuario a la tabla de registro en sql? En este momento estoy usando la autenticación de Windows.¿Log4net no se está insertando en la base de datos?

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
</configSections> 
<log4net> 
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> 
    <bufferSize value="100" /> 
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
connectionString value="Data Source=V-FIN-SQL-D\SQL2005;Initial Catalog=DevMHAIC;Integrated Security=True;Connection Timeout=360" /> 
    <commandText value="INSERT INTO Log ([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="32" /> 
<layout type="log4net.Layout.PatternLayout"> 
<conversionPattern value="%t" /> 
</layout> 
</parameter> 
    <parameter> 
    <parameterName value="@log_level" /> 
    <dbType value="String" /> 
    <size value="512" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%p" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value="@logger" /> 
    <dbType value="String" /> 
    <size value="512" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%c" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value="@message" /> 
    <dbType value="String" /> 
    <size value="4000" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%m" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value="@exception" /> 
    <dbType value="String" /> 
    <size value="2000" /> 
    <layout type="log4net.Layout.ExceptionLayout" /> 
    </parameter> 
</appender> 
<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="ADONetAppender" /> 
</root> 
</log4net> 

Aquí está mi código SQL para la base de datos de registro:

CREATE TABLE [dbo].[Log](
[Id] [int] IDENTITY(1,1) NOT NULL, 
[Date] [datetime] NULL, 
[Thread] [varchar](255) NULL, 
[Level] [varchar](50) NULL, 
[Logger] [varchar](255) NULL, 
[Message] [varchar](4000) NULL, 
[Exception] [varchar](2000) NULL 
) ON [PRIMARY] 

Aquí es mi clase que estoy usando para llamar a la log4net.

public class ErrorLog : ILog 
{ 
    log4net.ILog _Log; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="ErrorLog"/> class. 
    /// </summary> 
    /// <param name="log">The log.</param> 
    public ErrorLog(log4net.ILog log) : this() 
    { 
     _Log = log; 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="ErrorLog"/> class. 
    /// </summary> 
    public ErrorLog() 
    { 
     _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

     log4net.Config.XmlConfigurator.Configure(); 
    } 

    /// <summary> 
    /// Informationals the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    public void informational(string message) 
    { 
     _Log.Info(message); 
    } 

    /// <summary> 
    /// Informationals the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    /// <param name="innerException">The innerException.</param> 
    public void informational(string message, Exception innerException) 
    { 
     _Log.Info(message, innerException); 
    } 

    /// <summary> 
    /// Debugs the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    public void debug(string message) 
    { 
     _Log.Debug(message); 
    } 

    /// <summary> 
    /// Debugs the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    /// <param name="innerException">The innerException.</param> 
    public void debug(string message, Exception innerException) 
    { 
     _Log.Debug(message, innerException); 
    } 

    /// <summary> 
    /// Errors the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    public void error(string message) 
    { 
     _Log.Error(message); 
    } 

    /// <summary> 
    /// Errors the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    /// <param name="innerException">The innerException.</param> 
    public void error(string message, Exception innerException) 
    { 
     _Log.Error(message, innerException); 
    } 

    /// <summary> 
    /// Warnings the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    public void warning(string message) 
    { 
     _Log.Warn(message); 
    } 

    /// <summary> 
    /// Warnings the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    /// <param name="innerException">The innerException.</param> 
    public void warning(string message, Exception innerException) 
    { 
     _Log.Warn(message, innerException); 
    } 
} 

Aquí es mi interfaz:

public interface ILog 
{ 
    /// <summary> 
    /// Informationals the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    void informational(string message); 

    /// <summary> 
    /// Informationals the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    /// <param name="innerException">The innerException.</param> 
    void informational(string message, Exception innerException); 

    /// <summary> 
    /// Debugs the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    void debug(string message); 

    /// <summary> 
    /// Debugs the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    /// <param name="innerException">The innerException.</param> 
    void debug(string message, Exception innerException); 

    /// <summary> 
    /// Errors the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    void error(string message); 

    /// <summary> 
    /// Errors the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    /// <param name="innerException">The innerException.</param> 
    void error(string message, Exception innerException); 

    /// <summary> 
    /// Warnings the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    void warning(string message); 

    /// <summary> 
    /// Warnings the specified message. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    /// <param name="innerException">The innerException.</param> 
    void warning(string message, Exception innerException); 
} 
+0

¿Puedes publicar tu archivo de configuración Log4Net? – taylonr

Respuesta

49
<bufferSize value="100" /> 

Se dice que mantendrá 100 registros en la memoria hasta que escrita en DB. Tal vez es por eso que no ves nada en DB?

+0

Este es el culpable más probable. Establezca ese buffer en 1 y obtendrá una escritura en la base de datos cada vez. Tal como está, está esperando que se acumulen 100 entradas de registro antes de que las escriba en un lote en la base de datos. – IAmTimCorey

+0

¿Alguien sabe el valor predeterminado de este valor si no se especifica? –

+0

@MikeCole Docs dice 500, pero ¿por qué aún no lo ha comprobado en el depurador? –

10

que realmente no tienen ninguna visión a su problema con sólo mirar a su configuración, pero es posible que trate de añadir esto a sus configuración de la aplicación para ver si log4net le puede decir lo que está mal:

<appSettings>   
    <add key="log4net.Internal.Debug" value="true"/> 
</appSettings> 

consulte la sección titulada "How do I enable log4net internal debugging?" para una descripción de cómo capturar el registro interno de log4net.

0

A menos que establezca específicamente un usuario en la cadena de conexión, Log4Net intentará iniciar sesión con la cuenta de usuario asignada al proceso (proceso de trabajo ASP.NET si ese es el caso). Log4Net tampoco lanzará excepciones si no puede iniciar sesión. Puede activar la depuración para ver cuál es el problema.

+0

¿Cómo activo la depuración? – barrypicker

+0

@barrypicker hbulens

1

Tuve el mismo problema. En mi caso, tuve que eliminar el uso de [Excepción] y @excepción del inserto.

Entonces, tuve que cambiar mi registro también. Básicamente tuve que crear un buen volcado de mi excepción y pasar eso al parámetro del mensaje.

Espero que esto ayude

Cuestiones relacionadas