- 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;
- 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:
| Campo | Descripción |
|---|---|
| Id | Clave primaria autoincremental |
| AddTime | Hora en la que se generó el registro |
| Thread | Nombre del hilo que generó el registro |
| Level | Nivel de registro: DEBUG/INFO/WARN/ERROR/FATAL |
| Logger | Nombre del registrador actual (nombre completo de la clase) |
| Message | Texto normal del registro |
| Exception | Rastreo 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
Previous: Introducción e instalación