Cómo Monitorear Logs del Servidor de MU Online en Tiempo Real
Aprende a monitorear logs del servidor MU Online en tiempo real con herramientas nativas de Windows, scripts batch y consultas SQL para diagnosticar errores rápidamente.
Mantener un servidor privado de MU Online estable requiere visibilidad constante de lo que ocurre a nivel de proceso y de base de datos. Sin un monitoreo adecuado de logs, un crash, un intento de exploit o una degradación de rendimiento puede pasar desapercibido durante horas. Este tutorial cubre la lectura de archivos de log en tiempo real, la automatización de alertas de errores con scripts batch y la consulta de SQL Server para rastrear la actividad de los jugadores.
Por Qué el Monitoreo de Logs es Fundamental
El MuServer genera logs en dos capas separadas, cada una con un propósito distinto:
- Archivos de texto (.log): eventos del proceso en tiempo de ejecución, errores de memoria, fallos de carga de mapas y errores de red
- Tablas de SQL Server: historial de acciones de jugadores, transacciones de ítems, conexiones, registros de comandos GM
Monitorear solo una capa deja puntos ciegos. Un crash del GameServer puede aparecer en Error.log antes de reflejarse en la base de datos, mientras que los intentos de duplicación de ítems solo quedan registrados en las tablas SQL.
Parte 1 — Estructura de Logs del MuServer
1.1 Ubicación de los Archivos de Log
La instalación estándar del MuServer Season 6 organiza los logs de la siguiente manera:
MuServer/
├── GameServer/
│ └── Log/
│ ├── GameServer.log ← eventos generales del proceso
│ ├── Error.log ← errores críticos y excepciones
│ ├── ServerInfo.log ← registros de conexión y handshakes
│ └── GMCommand.log ← comandos GM ejecutados en el juego
├── ConnectServer/
│ └── Log/
│ ├── ConnectServer.log ← intentos de conexión al CS
│ └── Error.log
├── DataServer/
│ └── Log/
│ └── DataServer.log ← eventos de sincronización con la BD
└── EventServer/
└── Log/
└── EventServer.log ← logs de eventos (Blood Castle, Devil Square, etc.)
GameServer01.log, GameServer02.log, etc., dentro de subcarpetas por servidor. Ajusta las rutas de monitoreo según corresponda.1.2 Verificar la Configuración de Logs
Antes de configurar el monitoreo, confirma que el logging esté habilitado. Abre GameServer/GameServer.ini y revisa la sección de log:
[Log]
LogSave=1
LogType=3
LogPath=./Log/
MaxLogFileSize=10240
Parámetros clave:
LogSave=1— habilita la escritura en archivo (0 desactiva el logging por completo)LogType=3— nivel de detalle (1=solo errores, 2=advertencias+errores, 3=informativo, 4=debug)MaxLogFileSize=10240— tamaño máximo en KB antes de rotar el archivo (10 MB)
LogType=4 en un entorno de producción puede generar cientos de megabytes de datos de log por día, causando una sobrecarga de I/O en disco que afecta el rendimiento del servidor. Usa el logging de debug únicamente durante sesiones activas de diagnóstico.Parte 2 — Monitoreo en Tiempo Real con Herramientas de Windows
2.1 PowerShell — El Método Más Rápido, Sin Instalación
Paso 1 — Abre PowerShell como Administrador.
Paso 2 — Visualiza el GameServer.log en tiempo real:
Get-Content -Path "C:\MuServer\GameServer\Log\GameServer.log" -Wait -Tail 100
Paso 3 — Filtra solo las líneas relacionadas con errores para reducir el ruido:
Get-Content -Path "C:\MuServer\GameServer\Log\GameServer.log" -Wait -Tail 100 |
Where-Object { $_ -match "Error|FAIL|Critical|Exception" }
Paso 4 — Monitorea múltiples logs simultáneamente creando C:\MuServer\Tools\monitor_logs.ps1:
$logs = @(
"C:\MuServer\GameServer\Log\GameServer.log",
"C:\MuServer\ConnectServer\Log\ConnectServer.log",
"C:\MuServer\DataServer\Log\DataServer.log"
)
$jobs = foreach ($log in $logs) {
Start-Job -ScriptBlock {
param($path)
Get-Content -Path $path -Wait -Tail 50
} -ArgumentList $log
}
while ($true) {
foreach ($job in $jobs) {
Receive-Job -Job $job | ForEach-Object {
Write-Host "[$(Split-Path $job.Name -Leaf)] $_" -ForegroundColor Cyan
}
}
Start-Sleep -Milliseconds 500
}
Ejecuta este script en una ventana de PowerShell dedicada para ver los tres flujos de log en una sola consola con código de colores.
2.2 Script Batch para Alertas Automáticas de Errores
Crea C:\MuServer\Tools\alerta_errores.bat para revisar errores críticos cada 60 segundos:
@echo off
:loop
findstr /I "Critical Error Exception FAIL" "C:\MuServer\GameServer\Log\Error.log" > "%TEMP%\mu_errores.txt"
for %%A in ("%TEMP%\mu_errores.txt") do if %%~zA GTR 0 (
echo [%DATE% %TIME%] ERRORES DETECTADOS - Revisa Error.log de inmediato
type "%TEMP%\mu_errores.txt"
)
timeout /t 60 /nobreak > nul
goto loop
Parte 3 — Monitoreo de Logs via SQL Server
3.1 Tablas de Log Principales en la Base de Datos MuOnline
El MuServer registra las acciones de los jugadores en la base de datos MuOnline. Las tablas más útiles para el monitoreo en tiempo real son:
| Tabla | Contenido |
|---|---|
LOG_ConnectMember | Inicios y cierres de sesión de jugadores |
LOG_DropItem | Ítems tirados al suelo |
LOG_PickupItem | Ítems recogidos por jugadores |
LOG_TradeItem | Intercambios entre jugadores |
LOG_WareHouseItem | Depósitos y retiros del almacén |
LOG_GMCommand | Todos los comandos GM ejecutados en el juego |
3.2 Consultas SQL para Monitoreo en Tiempo Real
Conexiones de la última hora:
SELECT
TOP 50
sID AS CuentaID,
sCharName AS Personaje,
sIP AS DireccionIP,
sDate AS FechaHora,
sType AS Accion -- 0=login, 1=logout
FROM MuOnline..LOG_ConnectMember
WHERE sDate >= DATEADD(HOUR, -1, GETDATE())
ORDER BY sDate DESC;
Jugadores conectados ahora con posición en el mapa:
SELECT
a.memb_guid,
a.memb___id AS Cuenta,
c.Name AS Personaje,
c.MapNumber AS Mapa,
c.MapPosX,
c.MapPosY,
a.ConnectStat
FROM MuOnline..MEMB_INFO a
INNER JOIN MuOnline..Character c ON a.memb___id = c.AccountID
WHERE a.ConnectStat = 1
ORDER BY a.memb_guid;
Actividad reciente de alto volumen en el almacén (posible exploit de apilado de ítems):
SELECT TOP 20
sID AS Cuenta,
sCharName AS Personaje,
sItemName AS Item,
sItemCount AS Cantidad,
sDate AS FechaHora
FROM MuOnline..LOG_WareHouseItem
WHERE sDate >= CAST(GETDATE() AS DATE)
AND sItemCount > 50
ORDER BY sDate DESC;
SQLLog=1 esté configurado en GameServer/GameServer.ini y que los scripts de creación de tablas hayan sido ejecutados durante la instalación original del MuServer. Estos scripts generalmente se encuentran en la carpeta SQL/ del paquete del servidor.3.3 Vista SQL para Dashboard de Estado del Servidor
Crea una vista consolidada para revisar el estado general del servidor de un vistazo:
USE MuOnline;
GO
CREATE VIEW vw_EstadoServidor AS
SELECT
(SELECT COUNT(*) FROM MEMB_INFO WHERE ConnectStat = 1) AS JugadoresConectados,
(SELECT COUNT(*) FROM Character WHERE CtlCode > 0) AS GMsConectados,
(SELECT MAX(sDate) FROM LOG_ConnectMember) AS UltimoLogin,
(SELECT COUNT(*) FROM LOG_ConnectMember
WHERE sDate >= CAST(GETDATE() AS DATE) AND sType = 0) AS LoginsHoy,
GETDATE() AS VerificadoEn;
GO
-- Consulta esta vista cada 30 segundos en el SSMS para monitorear el servidor:
SELECT * FROM vw_EstadoServidor;
Parte 4 — Rotación y Limpieza de Logs
4.1 Script de Rotación Automática de Logs
Los archivos de log antiguos se acumulan rápidamente. Crea C:\MuServer\Tools\rotar_logs.bat para archivar logs con más de 7 días de antigüedad:
@echo off
set LOG_DIR=C:\MuServer\GameServer\Log
set ARCHIVE_DIR=C:\MuServer\GameServer\Log\Archivo
set DATE_TAG=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
if not exist "%ARCHIVE_DIR%" mkdir "%ARCHIVE_DIR%"
:: Mover archivos de log con más de 7 días a la carpeta de archivo
forfiles /p "%LOG_DIR%" /m *.log /d -7 /c "cmd /c move @path %ARCHIVE_DIR%\@fname_%DATE_TAG%@ext"
echo [%DATE% %TIME%] Rotacion de logs completada.
4.2 Limpieza de Logs SQL para Recuperar Espacio en Disco
-- Conservar solo los últimos 30 días de logs de conexión
DELETE FROM MuOnline..LOG_ConnectMember
WHERE sDate < DATEADD(DAY, -30, GETDATE());
-- Conservar solo los últimos 15 días de logs de ítems
DELETE FROM MuOnline..LOG_DropItem
WHERE sDate < DATEADD(DAY, -15, GETDATE());
DELETE FROM MuOnline..LOG_PickupItem
WHERE sDate < DATEADD(DAY, -15, GETDATE());
-- Verificar cuánto espacio se recuperó
EXEC sp_spaceused 'LOG_ConnectMember';
SELECT * INTO MuOnline..LOG_ConnectMember_respaldo FROM MuOnline..LOG_ConnectMember WHERE sDate < DATEADD(DAY, -30, GETDATE()).Resolución de Problemas Comunes
El archivo de log dejó de actualizarse: El archivo probablemente alcanzó el límite de MaxLogFileSize. Renombra el archivo actual a GameServer_old.log — el servidor creará uno nuevo automáticamente sin necesidad de reiniciar el proceso.
DataServer.log muestra errores de timeout frecuentes: Verifica la cadena de conexión en DataServer/DataServer.ini bajo el parámetro DBConnString. Los timeouts repetidos indican un problema de red entre el host del servidor de juego y la instancia de SQL Server, o una fragmentación severa de índices en la base de datos. Ejecuta DBCC INDEXDEFRAG(MuOnline) para reconstruir los índices.
ConnectServer.log muestra ciclos continuos de reconexión: Esto generalmente significa que el archivo ServerList.dat en el directorio de GameServer contiene una IP desactualizada del ConnectServer, o que el parámetro ServerAddr en ConnectServer/ConnectServer.ini no coincide con la interfaz de red real a la que está vinculado el proceso.
Perguntas frequentes
¿Dónde se encuentran los archivos de log del GameServer?
Los logs del GameServer se almacenan en GameServer/Log/, con archivos separados por categoría: GameServer.log (eventos generales del proceso), Error.log (errores críticos) y ServerInfo.log (registros de conexión). Algunos builds del Season 6 también generan una subcarpeta ConnectLog/ dentro de ese directorio.
¿Cómo monitoreo múltiples archivos de log al mismo tiempo en Windows?
Usa PowerShell con el comando Get-Content -Path 'GameServer/Log/GameServer.log' -Wait -Tail 50 en varias ventanas simultáneas, o usa la herramienta gratuita mTail para abrir varios archivos en pestañas separadas con actualización automática en vivo.
El log del GameServer no se está generando, ¿qué puede estar causando esto?
Verifica que GameServer/GameServer.ini tenga el parámetro LogSave=1 habilitado. En algunos builds del MuServer el archivo de log solo se crea si la carpeta GameServer/Log/ ya existe previamente — créala manualmente si falta y reinicia el proceso GameServer.
¿Cómo filtro solo los errores de conexión de jugadores desde los logs de SQL?
Ejecuta SELECT TOP 100 * FROM MuOnline..LOG_ConnectMember WHERE sDate >= CAST(GETDATE() AS DATE) ORDER BY sDate DESC en SQL Server Management Studio para ver los registros de conexión del día actual ordenados por más recientes primero.