On this page本页内容
As part of normal operation, MongoDB maintains a running log of events, including entries such as incoming connections, commands run, and issues encountered. Generally, log messages are useful for diagnosing issues, monitoring your deployment, and tuning performance.
Starting in MongoDB 4.4, mongod / mongos instances output all log messages in structured JSON format. Log entries are written as a series of key-value pairs, where each key indicates a log message field type, such as “severity”, and each corresponding value records the associated logging information for that field type, such as “informational”. Previously, log entries were output as plaintext.
Example
The following is an example log message in JSON format as it would appear in the MongoDB log file:
JSON log entries can be pretty-printed for readability. Here is the same log entry pretty-printed:
In this log entry, for example, the key s, representing severity, has a corresponding value of I, representing “Informational”, and the key c, representing component, has a corresponding value of NETWORK, indicating that the “network” component was responsible for this particular message. The various field types are presented in detail in the Log Message Field Types section.
Structured logging with key-value pairs allows for efficient parsing by automated tools or log ingestion services, and makes programmatic search and analysis of log messages easier to perform. Examples of analyzing structured log messages can be found in the Parsing Structured Log Messages section.
With MongoDB 4.4, all log output is now in JSON format. This includes log output sent to the file, syslog, and stdout (standard out)
log destinations, as well as the output of the getLog command.
Each log entry is output as a self-contained JSON object which follows the Relaxed Extended JSON v2.0 specification, and has the following layout and field order:
ISO-8601 format. See Timestamp.["startupWarnings"].The message and attributes fields will escape control characters as necessary according to the Relaxed Extended JSON v2.0 specification:
| Character Represented | Escape Sequence |
|---|---|
Quotation Mark (") |
\" |
Backslash (\) |
\\ |
Backspace (0x08) |
\b |
Formfeed (0x0C) |
\f |
Newline (0x0A) |
\n |
Carriage return (0x0D) |
\r |
Horizontal tab (0x09) |
\t |
Control characters not listed above are escaped with \uXXXX where “XXXX” is the unicode codepoint in hexadecimal. Bytes with invalid UTF-8 encoding are replaced with the unicode replacement character represented by \ufffd.
An example of message escaping is provided in the examples section.
Any attributes that exceed the maximum size defined with maxLogSizeKB (default: 10 KB) are truncated. Truncated attributes omit log data beyond the configured limit, but retain the JSON formatting of the entry to ensure that the entry remains parsable.
Here is an example of a log entry with a truncated attribute:
In this case, the request attribute has been truncated and the specific instance of its subfield _id that triggered truncation (i.e. caused the attribute to overrun maxLogSizeKB) is printed without data as {"_id":{}}. The remainder of the request attribute is then omitted.
Log entires containing one or more truncated attributes include a truncated object which provides the following information for each truncated attribute in the log entry:
type of the truncated fieldsize of the truncated fieldLog entries with truncated attributes may also include an additional size field at the end of the entry which indicates the original size of the attribute before truncation, in this case 46328 or about 46KB. This final size field is only shown if it is different from the size field in the truncated object, i.e. if the total object size of the attribute is different from the size of the truncated subobject, as is the case in the example above.
When output to the file or the syslog log destinations, padding is added after the severity, context, and id fields to increase readability when viewed with a fixed-width font.
The following MongoDB log file excerpt demonstrates this padding:
When working with MongoDB structured logging, the third-party jq command-line utility is a useful tool that allows for easy pretty-printing of log entries, and powerful key-based matching and filtering.
jq is an open-source JSON parser, and is available for Linux, Windows, and macOS.
You can use jq to pretty-print log entires as follows:
More examples of working with MongoDB structured logs are available in the Parsing Structured Log Messages section.
MongoDB log messages can be output to file, syslog, or stdout (standard output).
To configure the log output destination, use one of the following settings, either in the configuration file or on the command-line:
systemLog.destination option for file or syslogNot specifying either file or syslog sends all logging output to stdout.
For the full list of logging settings and options see:
mongodmongosNote
Error messages sent to stderr (standard error), such as fatal errors during startup when not using the file or syslog log destinations, or messages having to do with misconfigured logging settings, are not affected by the log output destination setting, and are printed to stderr in plaintext format.
The timestamp field type indicates the precise date and time at which the logged event occurred.
When logging to file or to syslog [1], the default format for the timestamp is iso8601-local. To modify the timestamp format, use the --timeStampFormat runtime option or the systemLog.timeStampFormat setting.
See Filtering by Date Range for log parsing examples that filter on the timestamp field.
Note
Starting in MongoDB 4.4, the ctime timestamp format is no longer supported.
| [1] | If logging to syslog, the syslog daemon generates timestamps when it logs a message, not when MongoDB issues the message. This can lead to misleading timestamps for log entries, especially when the system is under heavy load. |
The severity field type indicates the severity level associated with the logged event.
Severity levels range from “Fatal” (most severe) to “Debug” (least severe):
| Level | |
|---|---|
F |
Fatal |
E |
Error |
W |
Warning |
I |
Informational, for verbosity level 0 |
D1 - D5 |
Debug, for verbosity levels > Starting in version 4.2, MongoDB indicates the specific debug verbosity level. For example, if verbosity level is 2, MongoDB indicates In previous versions, MongoDB log messages specified |
You can specify the verbosity level of various components to determine the amount of Informational and Debug messages MongoDB outputs. Severity categories above these levels are always shown. [2] To set verbosity levels, see Configure Log Verbosity Levels.
The component field type indicates the category a logged event is a member of, such as NETWORK or COMMAND.
Each component is individually configurable via its own verbosity filter. The available components are as follows:
ACCESS¶Messages related to access control, such as authentication. To specify the log level for ACCESS components, use the systemLog.component.accessControl.verbosity setting.
COMMAND¶Messages related to database commands, such as count. To specify the log level for COMMAND components, use the systemLog.component.command.verbosity setting.
CONTROL¶Messages related to control activities, such as initialization. To specify the log level for CONTROL components, use the systemLog.component.control.verbosity setting.
ELECTION¶Messages related specifically to replica set elections. To specify the log level for ELECTION components, set the systemLog.component.replication.election.verbosity parameter.
REPL is the parent component of ELECTION. If systemLog.component.replication.election.verbosity is unset, MongoDB uses the REPL verbosity level for ELECTION components.
FTDC¶New in version 3.2.版本3.2中的新功能。
Messages related to the diagnostic data collection mechanism, such as server statistics and status messages. To specify the log level for FTDC components, use the systemLog.component.ftdc.verbosity setting.
GEO¶Messages related to the parsing of geospatial shapes, such as verifying the GeoJSON shapes. To specify the log level for GEO components, set the systemLog.component.geo.verbosity parameter.
INDEX¶Messages related to indexing operations, such as creating indexes. To specify the log level for INDEX components, set the systemLog.component.index.verbosity parameter.
INITSYNC¶Messages related to initial sync operation. To specify the log level for INITSYNC components, set the systemLog.component.replication.initialSync.verbosity parameter.
REPL is the parent component of INITSYNC. If systemLog.component.replication.initialSync.verbosity is unset, MongoDB uses the REPL verbosity level for INITSYNC components.
JOURNAL¶Messages related specifically to storage journaling activities. To specify the log level for JOURNAL components, use the systemLog.component.storage.journal.verbosity setting.
STORAGE is the parent component of JOURNAL. If systemLog.component.storage.journal.verbosity is unset, MongoDB uses the STORAGE verbosity level for JOURNAL components.
NETWORK¶Messages related to network activities, such as accepting connections. To specify the log level for NETWORK components, set the systemLog.component.network.verbosity parameter.
QUERY¶Messages related to queries, including query planner activities. To specify the log level for QUERY components, set the systemLog.component.query.verbosity parameter.
RECOVERY¶Messages related to storage recovery activities. To specify the log level for RECOVERY components, use the systemLog.component.storage.recovery.verbosity setting.
STORAGE is the parent component of RECOVERY. If systemLog.component.storage.recovery.verbosity is unset, MongoDB uses the STORAGE verbosity level for RECOVERY components.
REPL¶Messages related to replica sets, such as initial sync, heartbeats, steady state replication, and rollback. [2] To specify the log level for REPL components, set the systemLog.component.replication.verbosity parameter.
REPL is the parent component of the ELECTION, INITSYNC, REPL_HB, and ROLLBACK components.
REPL_HB¶Messages related specifically to replica set heartbeats. To specify the log level for REPL_HB components, set the systemLog.component.replication.heartbeats.verbosity parameter.
REPL is the parent component of REPL_HB. If systemLog.component.replication.heartbeats.verbosity is unset, MongoDB uses the REPL verbosity level for REPL_HB components.
ROLLBACK¶Messages related to rollback operations. To specify the log level for ROLLBACK components, set the systemLog.component.replication.rollback.verbosity parameter.
REPL is the parent component of ROLLBACK. If systemLog.component.replication.rollback.verbosity is unset, MongoDB uses the REPL verbosity level for ROLLBACK components.
SHARDING¶Messages related to sharding activities, such as the startup of the mongos. To specify the log level for SHARDING components, use the systemLog.component.sharding.verbosity setting.
STORAGE¶Messages related to storage activities, such as processes involved in the fsync command. To specify the log level for STORAGE components, use the systemLog.component.storage.verbosity setting.
TXN¶New in version 4.0.2.
Messages related to multi-document transactions. To specify the log level for TXN components, use the systemLog.component.transaction.verbosity setting.
WRITE¶Messages related to write operations, such as update commands. To specify the log level for WRITE components, use the systemLog.component.write.verbosity setting.
-¶Messages not associated with a named component. Unnamed components have the default log level specified in the systemLog.verbosity setting. The systemLog.verbosity setting is the default setting for both named and unnamed components.
See Filtering by Component for log parsing examples that filter on the component field.
MongoDB drivers and client applications (including the mongo shell) have the ability to send identifying information at the time of connection to the server. After the connection is established, the client does not send the identifying information again unless the connection is dropped and reestablished.
This identifying information is contained in the attributes field of the log entry. The exact information included varies by client.
Below is a sample log message containing the client data document as transmitted from a mongo shell connection. The client data is contained in the doc object in the attributes field:
When secondary members of a replica set initiate a connection to a primary, they send similar data. A sample log message containing this initiation connection might appear as follows. The client data is contained in the doc object in the attributes
field:
See the examples section for a pretty-printed example showing client data.
For a complete description of client information and required fields, see the MongoDB Handshake specification.
You can specify the logging verbosity level to increase or decrease the the amount of log messages MongoDB outputs. Verbosity levels can be adjusted for all components together, or for specific named components individually.
Verbosity affects log entires in the severity categories Informational and Debug only. Severity categories above these levels are always shown.
You might set verbosity levels to a high value to show detailed logging for debugging or development, or to a low value to minimize writes to the log on a vetted production deployment. [2]
To view the current verbosity levels, use the db.getLogComponents() method:
Your output might resemble the following:
The initial verbosity entry is the parent verbosity level for all components, while the individual named components that follow, such as accessControl, indicate the specific verbosity level for that component, overriding the global verbosity level for that particular component if set.
A value of -1, indicates that the component inherits the verbosity level of their parent, if they have one (as with recovery above, inheriting from storage), or the global verbosity level if they do not (as with command). Inheritance relationships for verbosity levels are indicated in the components section.
You can configure the verbosity level using: the systemLog.verbosity and systemLog.component.<name>.verbosity settings, the logComponentVerbosity parameter, or the db.setLogLevel() method. [2]
systemLog Verbosity Settings¶To configure the default log level for all components, use the systemLog.verbosity setting. To configure the level of specific components, use the systemLog.component.<name>.verbosity settings.
For example, the following configuration sets the systemLog.verbosity to 1, the systemLog.component.query.verbosity to 2, the systemLog.component.storage.verbosity to 2, and the systemLog.component.storage.journal.verbosity to 1:
You would set these values in the configuration file or on the command line for your mongod or mongos instance.
All components not specified explicitly in the configuration have a verbosity level of -1, indicating that they inherit the verbosity level of their parent, if they have one, or the global verbosity level (systemLog.verbosity) if they do not.
logComponentVerbosity Parameter¶To set the logComponentVerbosity parameter, pass a document with the verbosity settings to change.
For example, the following sets the default verbosity level to 1, the query to 2, the storage to 2, and the storage.journal to 1.
You would set these values from the mongo shell.
db.setLogLevel()¶Use the db.setLogLevel() method to update a single component log level. For a component, you can specify verbosity level of 0 to 5, or you can specify -1 to inherit the verbosity of the parent. For example, the following sets the systemLog.component.query.verbosity to its parent verbosity (i.e. default verbosity):
You would set this value from the mongo shell.
| [2] | (1, 2, 3, 4, 5) Starting in version 4.2 (also available starting in 4.0.6), secondary members of a replica set now log oplog entries that take longer than the slow operation threshold to apply. These slow oplog messages are logged for the secondaries in the diagnostic log under the REPL component with the text applied op: <oplog entry> took <num>ms. These slow oplog entries depend only on the slow operation threshold. They do not depend on the log levels (either at the system or component level), or the profiling level, or the slow operation sample rate. The profiler does not capture slow oplog entries. |
Client operations (such as queries) appear in the log if their duration exceeds the slow operation threshold or when the log verbosity level is 1 or higher. [2] These log entries include the full command object associated with the operation.
Starting in MongoDB 4.2, the profiler entries and the diagnostic log messages (i.e. mongod/mongos log messages) for read/write operations include:
queryHash to help identify slow queries with the same query shape.planCacheKey to provide more insight into the query plan cache for slow queries.The following example output includes information about a slow aggregation operation:
See the examples section for a pretty-printed version of this log entry.
Log parsing is the act of programmatically searching through and analyzing log files, often in an automated manner. With the introduction of structured logging in MongoDB 4.4, log parsing is made simpler and more powerful. For example:例如:
The following examples demonstrate common log parsing workflows when working with MongoDB JSON log output.
When working with MongoDB structured logging, the third-party jq command-line utility is a useful tool that allows for easy pretty-printing of log entries, and powerful key-based matching and filtering.
jq is an open-source JSON parser, and is available for Linux, Windows, and macOS.
These examples use jq to simplify log parsing.
The following example shows the top 10 unique message values in a given log file, sorted by frequency:
Remote client connections are shown in the log under the “remote” key in the attribute object. The following counts all unique connections over the course of the log file and presents them in descending order by number of occurrences:
Note that connections from the same IP address, but connecting over different ports, are treated as different connections by this command. You could limit output to consider IP addresses only, with the following change:
The following example counts all remote MongoDB driver connections, and presents each driver type and version in descending order by number of occurrences:
The following example analyzes the reported client data of remote MongoDB driver connections and client applications, including the mongo shell, and prints a total for each unique operating system type that connected, sorted by frequency:
The string “Darwin”, as reported in this log field, represents a macOS client.
With slow operation logging enabled, the following returns only the slow operations that took above 2000 milliseconds:, for further analysis:
Consult the jq documentation for more information on the jq filters shown in this example.
Log components (the third field in the JSON log output format) indicate the general category a given log message falls under. Filtering by component is often a great starting place when parsing log messages for relevant events.
The following example prints only the log messages of component type REPL:
The following example prints all log messages except those of component type REPL:
The following example print log messages of component type REPL or STORAGE:
Consult the jq documentation for more information on the jq filters shown in this example.
Log IDs (the fifth field in the JSON log output format) map to specific log events, and can be relied upon to remain stable over successive MongoDB releases.
As an example, you might be interested in the following two log events, showing a client connection followed by a disconnection:
The log IDs for these two entires are 22943 and 22944 respectively. You could then filter your log output to show only these log IDs, effectively showing only client connection activity, using the following jq syntax:
Consult the jq documentation for more information on the jq filters shown in this example.
Log output can be further refined by filtering on the timestamp field, limiting log entires returned to a specific date range. For example, the following returns all log entries that occurred on April 15th, 2020:
Note that this syntax includes the full timestamp, including milliseconds but excluding the timezone offset.
Filtering by date range can be combined with any of the examples above, creating weekly reports or yearly summaries for example. The following syntax expands the “Monitoring Connections” example from earlier to limit results to the month of May, 2020:
Consult the jq documentation for more information on the jq filters shown in this example.
Log ingestion services are third-party products that intake and aggregate log files, usually from a distributed cluster of systems, and provide ongoing analysis of that data in a central location.
The JSON log format, introduced with MongoDB 4.4, allows for more flexibility when working with log ingestion and analysis services. Whereas plaintext logs generally require some manner of transformation before being eligible for use with these products, JSON files can often be consumed out of the box, depending on the service. Further, JSON-formatted logs offer more control when performing filtering for these services, as the key-value structure offers the ability to specifically import only the fields of interest, while omitting the rest.
Consult the documentation for your chosen third-party log ingestion service for more information.
The following examples show log messages in JSON output format.
These log messages are presented in pretty-printed format for convenience.
This example shows a startup warning:
This example shows a client connection that includes client data:
This example shows a slow operation message:
This example demonstrates character escaping, as shown in the setName field of the attribute object: