Docs Menu
Docs Home
/ /

Registro

En esta guía, aprenderá a usar el controlador para configurar el registro de su aplicación. El propósito del registro es registrar los eventos del controlador.

Un registrador registra los mensajes con un nivel de severidad o nivel de detalle que usted puede especificar. Al habilitar un registrador en su aplicación, puede recibir información sobre las actividades de su aplicación a un nivel alto, detallado o intermedio.

Tip

Para aprender más sobre los niveles de gravedad del registro, consulte la entrada de Wikipedia sobre el Estándar Syslog para el registro de mensajes.

Para configurar un registrador en su Client Por ejemplo, llame al método SetLoggerOptions() al crear su objeto ClientOptions. El método SetLoggerOptions() toma un tipo LoggerOptions como parámetro. Configure este tipo LoggerOptions para configurar el registrador de su aplicación.

El siguiente código muestra cómo crear un cliente con el registro habilitado:

loggerOptions := options.
Logger().
SetComponentLevel(options.LogComponentCommand, options.LogLevelDebug)
clientOptions := options.
Client().
ApplyURI(uri).
SetLoggerOptions(loggerOptions)
client, err := mongo.Connect(clientOptions)

Para crear un objeto LoggerOptions, llame al método options.Logger(). La siguiente tabla describe cómo establecer propiedades en un tipo LoggerOptions para configurar el registrador. La primera columna enumera las propiedades LoggerOptions, la segunda las describe y la tercera enumera el método de establecimiento correspondiente y los parámetros para cada propiedad:

Propiedad
Descripción
Método de establecimiento
ComponentLevels

Type: map[LogComponent]LogLevel
A mapping of components to log severity levels. The driver uses the LogLevel for each LogComponent to determine if the log message is generated.

To learn more about the LogComponent and LogLevel types, see the Log Components and Severity Levels section of this guide.
SetComponentLevel()

Parameters: LogComponent, LogLevel
Sink

Type: LogSink
The logging interface that the driver uses to log messages. The LogSink type is an interface that you can implement to provide a custom sink or integrate a third-party logger for the driver's logs. If you don't set this property, the driver uses the standard logging library.

To learn more, see the Use a Custom Logger and Integrate Third-Party Loggers sections of this guide.
SetSink()

Parameter: LogSink
MaxDocumentLength

Type: uint
Default: 1000
The maximum length in bytes of each log message that the driver emits. If the message is larger than this value, the driver truncates it and appends ellipses to the partial log message.
SetMaxDocumentLength()

Parameter: uint

Tip

Escribir registros en un archivo específico

De forma predeterminada, el registrador estándar registra los mensajes en la consola (stderr). Puede especificar un destino de registro configurando la variable de entorno MONGODB_LOG_PATH en stdout o una ruta de archivo.

Para especificar los componentes que el controlador registra, configure el tipo LogComponent. La siguiente tabla describe las especificaciones integradas para LogComponent:

Configuración
Descripción
Valor de enumeración

LogComponentAll

Habilita el registro para todos los componentes

0

LogComponentCommand

Habilita el registro del monitor de comandos

1

LogComponentTopology

Habilita el registro de topología

2

LogComponentServerSelection

Habilita el registro de selección de servidor

3

LogComponentConnection

Habilita el registro de servicios de conexión

4

Puede especificar el componente de registro mediante el nombre de la configuración o su valor de enumeración. El siguiente código muestra métodos equivalentes para habilitar la monitorización de comandos:

// Using named value
comp := options.LogComponentCommand
// Using enumeration
comp := options.LogComponent(1)

Para especificar el nivel de gravedad del registro, configure el tipo LogLevel. El siguiente código muestra cómo habilitar el registro en el nivel LevelDebug:

lvl := options.LogLevelDebug

Importante

El controlador Go actualmente solo emite LevelDebug mensajes de nivel, pero admite otras especificaciones LogLevel para. Para obtener más información, consulte la documentación de la API LogLevel.

Este ejemplo muestra cómo configurar el registrador estándar con las siguientes especificaciones:

  • La longitud máxima del documento es 25 bytes.

  • El componente de registro es LogComponentCommand.

  • El nivel de gravedad del registro es LevelDebug.

loggerOptions := options.
Logger().
SetMaxDocumentLength(25).
SetComponentLevel(options.LogComponentCommand, options.LogLevelDebug)
// Creates options that include the logger specification
clientOptions := options.
Client().
ApplyURI(uri).
SetLoggerOptions(loggerOptions)

El siguiente código realiza una operación de inserción, que genera mensajes de registro:

type Item struct {
Name string
}
coll := client.Database("db").Collection("testColl")
_, err = coll.InsertOne(context.TODO(), Item{Name: "grapefruit"})
{"command":"{\"insert\": \"testColl\",\"or...","commandName":"insert","databaseName":"db","driverConnectionId":1,"message":"Command started","operationId":0,"requestId":13,"serverConnectionId":97377,"serverHost":"...","serverPort":27017,"timestamp":...}
{"commandName":"insert","driverConnectionId":1,"durationMS":19,"message":"Command succeeded","operationId":0,"reply":"{\"n\": {\"$numberInt\":\"1\"},...","requestId":13,"serverConnectionId":97377,"serverHost":"...","serverPort":27017,"timestamp":...}

Si la librería estándar de logging no satisface tus necesidades, puedes implementar un registrador personalizado. Al personalizar tu configuración de logging, tienes más control sobre el contenido, formato y frecuencia de los mensajes de registro.

Para usar un registrador personalizado, defina una estructura de registrador e implemente los métodos Info() y Error() para ella. A continuación, configure el registrador como LogSink para su Client llamando al método SetSink() en su instancia LoggerOptions.

Este ejemplo demuestra cómo definir e implementar un registrador personalizado.

1
type CustomLogger struct {
io.Writer
mu sync.Mutex
}

Nota

El ejemplo de código anterior usa un tipo Mutex en la estructura CustomLogger para garantizar escrituras atómicas y evitar condiciones de carrera. Al establecer un tipo Mutex, el registrador es seguro para el uso simultáneo de varias go-rutinas.

2
func (logger *CustomLogger) Info(level int, msg string, _ ...any) {
logger.mu.Lock()
defer logger.mu.Unlock()
if options.LogLevel(level+1) == options.LogLevelDebug {
fmt.Fprintf(logger, "level: %d DEBUG, message: %s\n", level, msg)
} else {
fmt.Fprintf(logger, "level: %d INFO, message: %s\n", level, msg)
}
}
func (logger *CustomLogger) Error(err error, msg string, _ ...any) {
logger.mu.Lock()
defer logger.mu.Unlock()
fmt.Fprintf(logger, "error: %v, message: %s\n", err, msg)
}
3

En este ejemplo, el registrador registra comandos y eventos de conexión en el nivel LevelDebug:

buf := bytes.NewBuffer(nil)
sink := &CustomLogger{Writer: buf}
loggerOptions := options.
Logger().
SetSink(sink).
SetComponentLevel(options.LogComponentCommand, options.LogLevelDebug).
SetComponentLevel(options.LogComponentConnection, options.LogLevelDebug)
// Creates options that include the logger specification
clientOptions := options.
Client().
ApplyURI(uri).
SetLoggerOptions(loggerOptions)
4

El siguiente código realiza una operación de inserción, que genera mensajes de registro:

type Item struct {
Name string
}
coll := client.Database("db").Collection("testColl")
_, err = coll.InsertOne(context.TODO(), Item{Name: "grapefruit"})
level: 1 DEBUG, message: Connection pool created
level: 1 DEBUG, message: Connection pool ready
level: 1 DEBUG, message: Connection pool created
level: 1 DEBUG, message: Connection pool ready
level: 1 DEBUG, message: Connection pool created
level: 1 DEBUG, message: Connection pool ready
level: 1 DEBUG, message: Connection checkout started
level: 1 DEBUG, message: Connection created
level: 1 DEBUG, message: Connection ready
level: 1 DEBUG, message: Connection checked out
level: 1 DEBUG, message: Command started
level: 1 DEBUG, message: Command succeeded
level: 1 DEBUG, message: Connection checked in

Hay muchos paquetes de registro de terceros disponibles en Go. Para usar un registrador de terceros en su aplicación, cree un registrador y asígnelo como receptor en su instancia LoggerOptions.

Este ejemplo demuestra cómo integrar logrus, un paquete de registro de terceros, en su aplicación.

1

Ejecuta los siguientes comandos go get en tu terminal para descargar los paquetes logrus requeridos para este ejemplo:

go get github.com/bombsimon/logrusr/v4
go get github.com/sirupsen/logrus
2

El siguiente código crea un registrador logrus con estas especificaciones:

  • El registrador registra mensajes en la consola.

  • El registrador registra mensajes en el nivel DebugLevel.

  • El registrador formatea los mensajes utilizando el formateador JSONFormatter.

myLogger := &logrus.Logger{
Out: os.Stderr,
Level: logrus.DebugLevel,
Formatter: &logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
PrettyPrint: true,
},
}
3

En el siguiente ejemplo de código, el registrador está configurado para registrar comandos en el nivel LevelDebug.

sink := logrusr.New(myLogger).GetSink()
// Sets options when configuring the logrus logger
loggerOptions := options.
Logger().
SetSink(sink).
SetComponentLevel(options.LogComponentCommand, options.LogLevelDebug)
// Creates options that include the logger specification
clientOptions := options.
Client().
ApplyURI(uri).
SetLoggerOptions(loggerOptions)
4

El siguiente código realiza algunas operaciones CRUD, que generan mensajes de registro:

type Item struct {
Name string
}
coll := client.Database("db").Collection("testColl")
docs := []any{
Item{Name: "starfruit"},
Item{Name: "kiwi"},
Item{Name: "cantaloupe"},
}
_, err = coll.InsertMany(context.TODO(), docs)
if err != nil {
panic(err)
}
_, err = coll.DeleteOne(context.TODO(), Item{Name: "kiwi"})
if err != nil {
panic(err)
}
{
"command": "{\"insert\": \"testColl\", ...}",
"commandName": "insert",
"databaseName": "db",
...
"level": "debug",
"message": "Command started",
"msg": "Command started",
...
"time": "2023-07-06 10:23:42"
}
{
"commandName": "insert",
...
"level": "debug",
"message": "Command succeeded",
"msg": "Command succeeded",
...
"time": "2023-07-06 10:23:42"
}
{
"command": "{\"delete\": \"testColl\", ...}",
"commandName": "delete",
"databaseName": "db",
...
"level": "debug",
"message": "Command started",
"msg": "Command started",
...
"time": "2023-07-06 10:23:42"
}
{
"commandName": "delete",
...
"level": "debug",
"message": "Command succeeded",
"msg": "Command succeeded",
...
"time": "2023-07-06 10:23:42"
}

Tip

Paquetes de registro

Puedes encontrar más información sobre paquetes de logs de terceros en sus respectivos repositorios de GitHub:

Para ver ejemplos de código completos que integran estos registradores, consulte las pruebas de registro en el repositorio de Github del controlador Go.

Para obtener más información sobre cómo configurar las opciones del cliente, consulte la guía Crear un MongoClient.

Tip

Monitoring

Además del registro, puede habilitar la selección de servidores y la monitorización de topología en su aplicación. Para obtener más información, consulte la guía "Fundamentos de la monitorización de eventos de la aplicación".

Para obtener más información sobre cualquiera de los tipos o métodos analizados en esta guía, consulte la siguiente documentación de API:

Volver

Monitoring

En esta página