sql-server-2005 - net - manejo de logs en c#
Log4net no se inserta en la base de datos? (4)
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.
<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í está mi clase que estoy usando para llamar a 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í está 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);
}
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.
Realmente no entiendo tu problema con solo mirar tu configuración, pero puedes intentar agregar esto a la configuración de tu aplicación para ver si log4net puede decirte lo que está pasando mal:
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
Consulte la sección titulada "¿Cómo habilito la depuración interna de log4net?" para obtener una descripción de cómo capturar el registro interno de log4net.
Yo 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
<bufferSize value="100" />
Se dice que mantendrá 100 registros en la memoria hasta que se escriban en DB. Tal vez es por eso que no ves nada en DB?