DEV Community

Cover image for Enabling Logs Query in Mongodb using Go
Eduardo Hitek
Eduardo Hitek

Posted on

Enabling Logs Query in Mongodb using Go

One way to debug an application is through logs. They can be used to identify issues, understand the execution flow, and also monitor the application's behavior. Among their types, database query logs are very useful for understanding what is happening with queries and other write operations. In this post, I will show how to enable MongoDB query logs in the official Go driver.

By default, logs in the official MongoDB driver for Go are disabled. To enable them, you just need to implement your own CommandMonitor and set it in the ClientOptions configuration.

Whenever I work with database connections, I like to create a struct that holds the necessary connection information. In this case, I'll create a struct called MongoConfig.

type MongoConfig struct {
    URL       string       // MongoDB connection URL
    AppName   string       // Application name
    DebugMode bool         // Flag to enable debug logs
    Log       slog.Logger  // Logger to be used
}
Enter fullscreen mode Exit fullscreen mode

After that, I implement a createMongoClient function that takes this configuration struct and returns a *mongo.Client. The advantage of passing configurations via a struct is that if you want to add other parameters like ConnectionTimeout or MaxPoolSize, for example, you don't need to change the function's signature.

func createMongoClient(cfg MongoConfig) (*mongo.Client, error) {
    clientOptions := options.Client().ApplyURI(cfg.URL)
    clientOptions.SetAppName(cfg.AppName)

    if cfg.DebugMode { // Verifico se a flag de debug está habilitada
        monitor := &event.CommandMonitor{
            Started: func(_ context.Context, e *event.CommandStartedEvent) {
                if e.CommandName != "endSessions" { // Ignoro os comandos de finalização de sessão
                    cfg.Log.Info(e.Command.String())
                }
            },
        }

        clientOptions.SetMonitor(monitor)
    }

    client, err := mongo.Connect(context.Background(), clientOptions)
    if err != nil {
        return nil, err
    }

    return client, nil
}
Enter fullscreen mode Exit fullscreen mode

Afterward, I use the function to create the MongoDB client and perform operations in my application.

mongoCfg := MongoConfig{
        URL:       "mongodb://localhost:27017",
        AppName:   "MongoDB with query log",
        DebugMode: true,
        Log:       *slog.Default(),
    }

    client, err := createMongoClient(mongoCfg)
    if err != nil {
        log.Fatal(err)
    }
Enter fullscreen mode Exit fullscreen mode

Examples of logs for some operations:

PING
2023/09/02 08:48:09 INFO {"ping": {"$numberInt":"1"},"lsid": {"id": {"$binary":{"base64":"HBu0mDZaRHaNx0TPpBcaeg==","subType":"04"}}},"$db": "admin"}

INSERT
2023/09/02 09:04:43 INFO {"insert": "users","ordered": true,"lsid": {"id": {"$binary":{"base64":"ZIZW5N5OR+ympGFggFu6uA==","subType":"04"}}},"$db": "example-mongo","documents": [{"_id": {"$oid":"64f324db99a1dac5fdc37251"},"name": "Eduardo","alias": "eduardohitek","site": "https://eduardohitek.dev"}]}

FIND
2023/09/02 09:05:59 INFO {"find": "users","filter": {"alias": "eduardohitek"},"lsid": {"id": {"$binary":{"base64":"+ji9+sJIRVC0HsawBmTAPw==","subType":"04"}}},"$db": "example-mongo"}
Enter fullscreen mode Exit fullscreen mode

Here is a gist with the code used in the post.

Top comments (0)