Registrador

Un middleware para Fiber que se utiliza para registrar información detallada sobre las solicitudes y respuestas HTTP.

Interfaz

func New(config ...Config) fiber.Handler

Ejemplo

Importa el paquete de middleware del framework web Fiber:

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/logger"
)

Nota: El orden de registro es crucial. Solo se registrarán las rutas registradas después de este middleware. Por lo tanto, este middleware debe ser uno de los primeros en registrarse.

Después de inicializar la aplicación Fiber, es posible registrar el middleware de las siguientes maneras:

// Inicializar con la configuración predeterminada
app.Use(logger.New())

// O personalizar la configuración
// Registrar IP y puerto remotos
app.Use(logger.New(logger.Config{
    Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
}))

// Registrar ID de solicitud
app.Use(requestid.New())
app.Use(logger.New(logger.Config{
    // Para más opciones, consulta la sección de Configuración
    Format: "${pid} ${locals:requestid} ${status} - ${method} ${path}\n",
}))

// Cambiar zona horaria y formato de hora
app.Use(logger.New(logger.Config{
    Format:     "${pid} ${status} - ${method} ${path}\n",
    TimeFormat: "02-Ene-2006",
    TimeZone:   "America/Nueva_York",
}))

// Escritor de archivo personalizado
archivo, err := os.OpenFile("./123.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
    log.Fatalf("error al abrir el archivo: %v", err)
}
defer archivo.Close()
app.Use(logger.New(logger.Config{
    Output: archivo,
}))

// Agregar etiqueta personalizada
app.Use(logger.New(logger.Config{
    CustomTags: map[string]logger.LogFunc{
        "tag_personalizado": func(output logger.Buffer, c *fiber.Ctx, data *logger.Data, extraParam string) (int, error) {
            return output.WriteString("Esta es una etiqueta personalizada")
        },
    },
}))

// Función de devolución de llamada después del registro
app.Use(logger.New(logger.Config{
    TimeFormat: time.RFC3339Nano,
    TimeZone:   "Asia/Shanghai",
    Done: func(c *fiber.Ctx, logString []byte) {
        if c.Response().StatusCode() != fiber.StatusOK {
            reporter.SendToSlack(logString) 
        }
    },
}))

// Deshabilitar colores al generar en el formato predeterminado
app.Use(logger.New(logger.Config{
    DisableColors: true,
}))

Configuración

Propiedad Tipo Descripción Valor predeterminado
Next func(*fiber.Ctx) bool Next define una función que omite el middleware cuando devuelve true. nil
Done func(*fiber.Ctx, []byte) Done es una función que se llama después de escribir la cadena de registro de la solicitud en Output, con la cadena de registro pasada como parámetro. nil
CustomTags map[string]LogFunc tagFunctions define operaciones de etiquetas personalizadas. map[string]LogFunc
Format string Format define las etiquetas de registro. [${time}] ${status} - ${latency} ${method} ${path}\n
TimeFormat string TimeFormat define el formato de hora del sello de tiempo del registro. 15:04:05
TimeZone string TimeZone se puede especificar como "UTC", "America/Nueva_York", "Asia/Chongqing", etc. "Local"
TimeInterval time.Duration TimeInterval es el tiempo de espera antes de actualizar el sello de tiempo. 500 * time.Millisecond
Output io.Writer Output es un escritor utilizado para escribir registros. os.Stdout
DisableColors bool DisableColors define si la salida del registro debe tener color. false
enableColors bool Campo interno para habilitar colores en la salida del registro. (Este no es un campo configurable) -
enableLatency bool Campo interno para habilitar la medición de latencia en los registros. (Este no es un campo configurable) -
timeZoneLocation *time.Location Campo interno para la ubicación de la zona horaria. (Este no es un campo configurable) -

Configuración Predeterminada

var ConfigDefault = Config{
    Siguiente:     nil,
    Hecho:         nil,
    Formato:       "[${time}] ${status} - ${latency} ${method} ${path}\n",
    FormatoTiempo: "15:04:05",
    ZonaHoraria:   "Local",
    IntervaloTiempo:  500 * time.Millisecond,
    Salida:        os.Stdout,
    DeshabilitarColores: false,
}

Constantes

// Variables del registro
const (
    TagPid               = "pid"               	// Identificador del Proceso
    TagTiempo            = "time"              	// Tiempo
    TagReferer           = "referer"           	// Referente
    TagProtocolo         = "protocol"          	// Protocolo
    TagPuerto            = "port"              	// Puerto
    TagIP                = "ip"                	// Dirección IP
    TagIPs               = "ips"               	// Direcciones IP
    TagHost              = "host"              	// Anfitrión
    TagMetodo            = "method"            	// Método de Solicitud
    TagRuta              = "path"              	// Ruta
    TagURL               = "url"               	// URL
    TagUA                = "ua"                	// Agente de Usuario
    TagLatencia          = "latency"           	// Latencia
    TagEstado            = "status"            	// Estado de Respuesta
    TagCuerpoRespuesta   = "resBody"           	// Cuerpo de Respuesta
    TagEncabezadosSolicitud = "reqHeaders"     	// Encabezados de la Solicitud
    TagParametrosConsulta = "queryParams"      	// Parámetros de Consulta
    TagCuerpoSolicitud   = "body"              	// Cuerpo de la Solicitud
    TagBytesEnviados     = "bytesSent"         	// Bytes Enviados
    TagBytesRecibidos    = "bytesReceived"     	// Bytes Recibidos
    TagRuta              = "route"             	// Ruta
    TagError             = "error"             	// Error
    // Obsoleto: Usar TagEncabezadoSol en su lugar
    TagEncabezado        = "header:"           	// Encabezado de Solicitud
    TagEncabezadoSol     = "reqHeader:"        	// Encabezado de Solicitud
    TagEncabezadoResp    = "respHeader:"       	// Encabezado de Respuesta
    TagConsulta          = "query:"            	// Consulta
    TagFormulario        = "form:"             	// Formulario
    TagCookie            = "cookie:"           	// Cookie
    TagLocales           = "locals:"           	// Variables Locales
    // Colores
    TagNegro             = "black"             	// Negro
    TagRojo              = "red"               	// Rojo
    TagVerde             = "green"             	// Verde
    TagAmarillo          = "yellow"            	// Amarillo
    TagAzul              = "blue"              	// Azul
    TagMagenta           = "magenta"           	// Magenta
    TagCyan              = "cyan"              	// Cian
    TagBlanco            = "white"             	// Blanco
    TagReset             = "reset"             	// Restablecer Color
)