Skip to content

Instantly share code, notes, and snippets.

@leommoore
Last active July 4, 2021 10:51
Show Gist options
  • Save leommoore/c12801438550ef0375ed to your computer and use it in GitHub Desktop.
Save leommoore/c12801438550ef0375ed to your computer and use it in GitHub Desktop.
MongoDB 3.2.x Logging

MongoDB 3.2.x Logging

The main log file is the mongod.log. You can specify the log file location when you are starting the mongod process but if you have installed on Ubuntu from a package then you log file will normally be located in /var/log/mongodb/mongod.log.

You can tail the log file using:

tail -f /var/log/mongodb/mongod.log

From the Mongo shell you can also view the log file using:

show logs
global

show log global

Log Levels

Mongo logs have a number of verbosity levels from 0 to 5. 0 is the quietest and 5 is the most verbose. The default level is 0.

The typical log entry follows the following pattern:

<timestamp> <severity> <components> [<context>] <message>
2016-03-03-07T35:22:33.456-700 I NETWORK [initandlisten] waiting...

One nice feature is that you canset the logging level for a specific component. So if you are having a problem wiht the network you can just increase the level for this one component. The command to do this is:

db.setLogLevel(verbosity from 0 to 5, [component])
db.setLogLevel(2,'query')

The components are:

  • accessControl
  • command
  • control
  • geo
  • index
  • network
  • query
  • replication
  • storage
  • journal
  • write

Note: The component is optional but if you do not specify a component then the new logging level is set for all components.

To see the current log levels use:

db.getLogComponents()

You can reset the loglevel by setting it to -1 which means it will use the default level.

db.setLogLevel(-1,'query')

Logging Configuration

You can set the logging level in the mongod.conf.

storage:
   dbPath: "/data"
   
systemLog:
   destination: file
   path: "/var/log/mongodb/mongod.log"
   
   component:
      query:
         verbosity: 2
      command:
         verbosity: 1

Mongo will use the new setting the next time mongo is restarted.

Query Profiling

You can set the Profiling Level so that you can flag slow queries. The format is:

db.setProfilingLevel(Level 0-2, Threshold in ms)
db.setProfilingLevel(2,20)

You can look at the details of a query using:

db.system.profile.find({op: 'query', ns: 'mydatabase.mycollection'})

MongoStat

The mongostat tool comes with mongo and it gives runtime statistics for mongod servers. To use it just attach it to a server using:

mongostat --host myserver --port 27017

If you do not specify a host or port it will assume the local server on the default port. You can also specify a specific number of rows ie --rowcount 10, otherwise it will just keep producing statistics.

MongoTop

The mongotop tool show you where mongod spends monst of its time. Like mongostat it will continiously show data.

db.stats()

You can run db.stats() in the shell to get a picture of disk and memory usage.

db.stats()
{
    "db" : "mydatabase",
    "collections" : 19,
    "objects" : 347914,
    "avgObjSize" : 817.9144041343551,
    "dataSize" : 284563872,
    "storageSize" : 352567296,
    "numExtents" : 72,
    "indexes" : 28,
    "indexSize" : 57101184,
    "fileSize" : 520093696,
    "nsSizeMB" : 16,
    "extentFreeList" : {
            "num" : 0,
            "totalSize" : 0
    },
    "dataFileVersion" : {
            "major" : 4,
            "minor" : 22
    },
    "ok" : 1
}

This returns the result in bytes. It is better to look at the data in megabytes (1000000) so we pass that to the db.stats() function.

db.stats(1000000)     
{                                          
    "db" : "mydatabase",                  
    "collections" : 19,                
    "objects" : 347914,                
    "avgObjSize" : 817.9144041343551,  
    "dataSize" : 284.563872,           
    "storageSize" : 352.567296,        
    "numExtents" : 72,                 
    "indexes" : 28,                    
    "indexSize" : 57.101184,           
    "fileSize" : 520.093696,           
    "nsSizeMB" : 16,                   
    "extentFreeList" : {               
            "num" : 0,                 
            "totalSize" : 0            
    },                                 
    "dataFileVersion" : {              
            "major" : 4,               
            "minor" : 22               
    },                                 
    "ok" : 1                           
}                                          

You can also just gets stats on a particular collection:

db.locations.stats(1000000)
{
    "ns" : "mydatabase.locations",
    "count" : 29123,
    "size" : 55,
    "avgObjSize" : 1896,
    "numExtents" : 9,
    "storageSize" : 58,
    "lastExtentSize" : 20.64384,
    "paddingFactor" : 1,
    "paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
    "userFlags" : 1,
    "capped" : false,
    "nindexes" : 4,
    "totalIndexSize" : 3,
    "indexSizes" : {
            "_id_" : 0,
            "vendorName_Lower_1" : 0,
            "geo_2dsphere" : 0,
            "locationName_1" : 1
    },
    "ok" : 1
}

Server Status

You can get the server runtime status by using db.serverStatus() or running the db.runCommand({serverStatus:1}) command.

You can also just get a piece of information, for example the network status:

db.serverStatus().network
{
    "bytesIn" : NumberLong(82899),
    "bytesOut" : NumberLong(183990),
    "numRequests" : NumberLong(402)
}

Or Memory:

db.serverStatus().mem
{
"bits" : 64,
"resident" : 76,
"virtual" : 660,
"supported" : true,
"mapped" : 0,
"mappedWithJournal" : 0
}

Or Cursors (which are a limited resource too)

db.serverStatus().metrics.cursor
{
    "timedOut" : NumberLong(0),
    "open" : {
        "noTimeout" : NumberLong(0),
        "pinned" : NumberLong(2),
         "total" : NumberLong(2)
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment