Los registros se guardan en la base de datos

  • Registros en archivo: requiere iniciar sesión en el servidor para descargar o abrir archivos de texto, con una búsqueda complicada;
  • Registros en base de datos: se puede crear directamente una página de gestión de registros en el panel administrativo, compatible con búsqueda por condiciones SQL, filtros y paginación;
  1. Facilita el mantenimiento unificado, auditoría de registros y seguimiento de errores.

Desventaja: los escenarios con muchos registros aumentan la carga de la base de datos. En entornos de producción se puede optimizar mediante escritura con búfer, tablas particionadas y eliminación periódica de registros antiguos.

1 Crear tabla de registros (SQL Server)

-- Tabla de registros Log
create table Log (
    Id bigint identity,
    AddTime datetime not null,
    Thread nvarchar(100) not null,
    Level nvarchar(200) not null,
    Logger nvarchar(500) not null,
    Message nvarchar(3000) not null,
    Exception nvarchar(4000) null,
    constraint PK_LOG primary key (Id)
)
go

-- ========== Comentarios de campos (opcional, para facilitar la consulta en base de datos) ==========
declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Tabla de registros log4net',
'user', @CurrentUser, 'table', 'Log'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Clave primaria del registro',
'user', @CurrentUser, 'table', 'Log', 'column', 'Id'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Fecha de creación',
'user', @CurrentUser, 'table', 'Log', 'column', 'AddTime'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Hilo de ejecución',
'user', @CurrentUser, 'table', 'Log', 'column', 'Thread'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Nivel de registro (Info/Debug/Error, etc.)',
'user', @CurrentUser, 'table', 'Log', 'column', 'Level'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Nombre del registrador de logs',
'user', @CurrentUser, 'table', 'Log', 'column', 'Logger'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Contenido del mensaje de registro',
'user', @CurrentUser, 'table', 'Log', 'column', 'Message'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Información de excepción',
'user', @CurrentUser, 'table', 'Log', 'column', 'Exception'
goLenguaje del código: PHP (php)

Descripción de los campos:

CampoDescripción
IdClave primaria autoincremental
AddTimeHora en la que se generó el registro
ThreadNombre del hilo que generó el registro
LevelNivel de registro: DEBUG/INFO/WARN/ERROR/FATAL
LoggerNombre del registrador actual (nombre completo de la clase)
MessageTexto normal del registro
ExceptionRastreo de excepción, vacío si no hay errores

2 Paquete de instalación NuGet

Install-Package log4net

Se usa directamente en .NET Framework; también compatible con .NET Core/.NET5+/ASP.NET Core.

3 Configuración completa log4net (App.config / Web.config)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- Registrar nodo de configuración log4net -->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <log4net>
    <!-- ADONetAppender: complemento para escritura en base de datos -->
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <!-- bufferSize=1: sin búfer, escritura en tiempo real; aumente el valor para escritura por lotes y reducir la carga de la base de datos -->
      <bufferSize value="1" />

      <!-- Tipo de controlador de conexión SqlServer -->
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

      <!-- Cadena de conexión de base de datos, modifique nombre de base, usuario y contraseña -->
      <connectionString value="DATABASE=log4netdemo;SERVER=.;UID=sa;PWD=pwdpwd;Connect Timeout=15;" />

      <!-- SQL de inserción, los campos deben coincidir exactamente con la tabla y los parámetros -->
      <commandText value="INSERT INTO Log ([AddTime],[Thread],[Level],[Logger],[Message],[Exception])
VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />

      <!-- Parámetro 1: fecha del registro -->
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>

      <!-- Parámetro 2: nombre del hilo -->
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%t" />
        </layout>
      </parameter>

      <!-- Parámetro 3: nivel de registro -->
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p" />
        </layout>
      </parameter>

      <!-- Parámetro 4: nombre del Logger -->
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="500" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%c" />
        </layout>
      </parameter>

      <!-- Parámetro 5: mensaje de registro -->
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="3000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>

      <!-- Parámetro 6: información de excepción -->
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    <!-- Registrador raíz, activar salida en base de datos -->
    <root>
      <level value="Info" />
      <appender-ref ref="ADONetAppender" />
      <!-- También puede activar registros en archivo para doble salida: <appender-ref ref="nombre_del_complemento_archivo"/> -->
    </root>
  </log4net>
</configuration>Lenguaje del código: HTML, XML (xml)

Nota importante: en la captura solo aparecen los dos primeros parámetros. La configuración completa requiere los seis parámetros, de lo contrario habrá errores al iniciar la aplicación.

4 Activar log4net desde el código

1. Proyecto web .NET Framework (Global.asax)
protected void Application_Start(object sender, EventArgs e)
{
    // Cargar configuración log4net
    log4net.Config.XmlConfigurator.Configure();
}Lenguaje del código: JavaScript (javascript)
2. Aplicación de consola / WinForms

En la primera línea del método Main de Program.cs:

log4net.Config.XmlConfigurator.Configure();Lenguaje del código: CSS (css)
3. Código de uso diario
// Obtener instancia de registro
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

// Escribir registro normal
log.Info("Sistema iniciado correctamente");

// Escribir registro de error
try
{
    int a = 1 / 0;
}
catch (Exception ex)
{
    log.Error("Se produjo un error de cálculo", ex);
}Lenguaje del código: PHP (php)

Los registros se guardan en la base de datos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *