1 日志格式说明
在之前的博客,我们了解了MongoDB 中的几种日志:
MongoDB 4.4 中 journal 和 oplog 日志 说明
https://www.cndba.cn/dave/article/107979
对于MongoDB 4.4 之前的版本,log 日志格式如下:
<timestamp> <severity> <component> [<context>] <message>
2014-11-03T18:28:32.450-0500 I NETWORK [initandlisten] waiting for connections on port 27017
从MongoDB 4.4 开始,mongod/mongos 实例的输出日志格式变成了JSON格式。
{"t":{"$date":"2020-05-01T15:16:17.180+00:00"},"s":"I", "c":"NETWORK", "id":12345, "ctx":"listener", "msg":"Listening on","attr":{"address":"127.0.0.1"}}
这种格式对程序可能比较友好,但对DBA来说,并不那么友好,格式化后:
{
"t": {
"$date": "2020-05-01T15:16:17.180+00:00"
},
"s": "I",
"c": "NETWORK",
"id": 12345,
"ctx": "listener",
"msg": "Listening on",
"attr": {
"address": "127.0.0.1"
}
}
相关格式的说明可以直接参考官方手册:
https://www.mongodb.com/docs/v4.2/reference/log-messages/
https://www.mongodb.com/docs/v5.0/reference/log-messages/index.html
具体格式如下:
{
"t": <Datetime>, // timestamp
"s": <String>, // severity
"c": <String>, // component
"ctx": <String>, // context
"id": <Integer>, // unique identifier
"msg": <String>, // message body
"attr": <Object> // additional attributes (optional)
"tags": <Array of strings> // tags (optional)
"truncated": <Object> // truncation info (if truncated)
"size": <Integer> // original size of entry (if truncated)
}
这里相关的Key 说明如下:
Timestamp:时间戳,日志事件发生的时间
Serverity:日志信息等级
F:Fatal
E:Error
W:Warning
I:Information
D1-D5:Debug级别,从4.2开始支持指定Debug级别。
Compontents:日志事件的分类
ACCESS:登入访问相关的信息,例如登录验证情况。
COMMAND:数据库执行命令相关信息,例如,查询。
CONTROL:记录控制管理相关的信息,例如数据库初始化。
ELECTION:副本集选举相关信息
FTDC:(full-time diagnostic data ) 全程检测数据信息,例如Server的状态统计信息。
GEO:解析地理空间模型相关信息。
INDEX:索引相关信息,例如索引的创建过程信息。
INITSYNC:初始化同步操作相关信息
JOURNAL:日志相关的信息
NETWORK:网络相关信息,例如网络连接信息。
QUERY:查询相关信息,例如查询计划信息。
REPL:副本集相关信息,包括:初始化同步,心疼,状态,回滚等信息,包括ELECTION,INITSYSNC,REPL_HB和ROLLBACK。
REPL_HB:副本集心跳相关信息
ROLLBACK:回滚操作相关信息
SHARDING:分片相关信息,例如mongos的启动信息
STORAGE:存储相关信息,例如将 storage 层的数据刷入磁盘的信息。
TXN:多文档事务相关信息,4.0.2新增
RECOVERY:还原活动相关的信息
WRITE:写操作相关的信息,例如更新(update)的命令。
Context:产生该日志事件的线程名称
id:日志语句的独一无二的编号
Message:日志事件详细信息
Attributes:(可选)附件信息,也就是发生该日志事件时的相关对象属性,例如:操作系统版本,端口号,pid进程号等。
Tags:标签
Truncated :日志截断信息
Size:发生日志截断时,之前的日志文件大小。
2 日志组件种类
在上节我们已经说明,JSON 输出的日志格式C代表日志的组件。 也可以通过MQL 进行查询。
[dave@www.cndba.cn_3 ~]# mongo_conn 27018
MongoDB shell version v5.0.8
shard1:SECONDARY> db.getLogComponents()
{
"verbosity" : 0,
"accessControl" : {
"verbosity" : -1
},
"command" : {
"verbosity" : -1
},
"control" : {
"verbosity" : -1
},
"executor" : {
"verbosity" : -1
},
"geo" : {
"verbosity" : -1
},
"index" : {
"verbosity" : -1
},
"network" : {
"verbosity" : -1,
"asio" : {
"verbosity" : -1
},
"bridge" : {
"verbosity" : -1
},
"connectionPool" : {
"verbosity" : -1
}
},
"processHealth" : {
"verbosity" : -1
},
"query" : {
"verbosity" : -1
},
"replication" : {
"verbosity" : -1,
"election" : {
"verbosity" : -1
},
"heartbeats" : {
"verbosity" : -1
},
"initialSync" : {
"verbosity" : -1
},
"rollback" : {
"verbosity" : -1
}
},
"sharding" : {
"verbosity" : -1,
"rangeDeleter" : {
"verbosity" : -1
},
"shardingCatalogRefresh" : {
"verbosity" : -1
},
"migration" : {
"verbosity" : -1
},
"reshard" : {
"verbosity" : -1
},
"migrationPerf" : {
"verbosity" : -1
}
},
"storage" : {
"verbosity" : -1,
"recovery" : {
"verbosity" : -1
},
"journal" : {
"verbosity" : -1
}
},
"write" : {
"verbosity" : -1
},
"ftdc" : {
"verbosity" : -1
},
"tracking" : {
"verbosity" : -1
},
"transaction" : {
"verbosity" : -1
},
"tenantMigration" : {
"verbosity" : -1
},
"test" : {
"verbosity" : -1
}
}
shard1:SECONDARY>
各值的含义在官方手册里有说明:
https://www.mongodb.com/docs/manual/reference/log-messages/#components
每个日志组件都有一个verbosity 选项:
结果中的最外层的verbosity值是0。相应的取值还有1~5,数字越大,表示日志的详细程度越高,当这个值取到5的时候,mongodb将会输出所有的调试debug日志,这个日志量将会非常大,一般情况下,默认的值是0.
每个子项目里面也有一个verbosity,它代表的是当前的组件的日志等级,它的取值和上面的verbosity取值一样,可以取0,1,2,3,4,5,不同的是,它还可以取值为-1,代表继承父日志级别。
3 日志等级设置
上节我们看到日志有很多的组件,有时为了收集某个组件的详细信息,可以对单个组件的日志级别进行调整。
3.1 方法一:db.setLogLevel()
它的常用方法如下:
db.setLogLevel()
db.setLogLevel(<level>,<component>)
其中,level是等级,可以取值0~5,component是组件名称。可以取accesscontrol、command、control、ftdc、 geo、index、network、query、replication、recovery、sharding、storage、storage.journal、transaction、write等。
全局设置:
shard1:PRIMARY> db.setLogLevel(1)
{
"was" : {
"verbosity" : 0,
"accessControl" : {
"verbosity" : -1
},
……
shard1:PRIMARY> db.getLogComponents()
{
"verbosity" : 1,
"accessControl" : {
"verbosity" : -1
},
"command" : {
"verbosity" : -1
},
……
设置某个具体组件:
shard1:PRIMARY> db.setLogLevel(2,"command")
{
"was" : {
"verbosity" : 1,
"accessControl" : {
"verbosity" : -1
},
"command" : {
"verbosity" : -1
},
"control" : {
"verbosity" : -1
},
……
shard1:PRIMARY> db.getLogComponents()
{
"verbosity" : 1,
"accessControl" : {
"verbosity" : -1
},
"command" : {
"verbosity" : 2
},
"control" : {
"verbosity" : -1
},
……
3.2 方法二:执行mongodb命令
setLogLevel命令只能设置单个组件的日志等级,如果想要一次性设置多个组件的日志等级,可以使用下面的方法:
shard1:PRIMARY> db.adminCommand( {
... setParameter: 1,
... logComponentVerbosity: {
... verbosity: 1,
... query: { verbosity: 2 },
... storage: {
... verbosity: 2,
... journal: {
... verbosity: 1
... }
... }
... }
... } )
3.3 方法三:写入配置文件
直接在配置文件中写入:
systemlog:
verbosity: 1
component:
query:
verbosity: 2
storage:
verbosity: 2
journal:
verbosity: 1
4 日志文件过大的处理方法
有时候,长时间没有清理日志,日志的数据量会变的很大,这个时候我们可以通过两种方法来对日志进行滚动:
4.1 方法一:move
直接关闭mongodb服务,然后把老的日志文件给mv掉,启动mongodb服务,此时会生成一个新的mongodb.log的日志;
这里要注意,如果不停实例,直接在物理层move 掉,那么不会生产新的日志文件。
4.2 方法二:执行logrotate
利用日志轮滚的方法,直接在mongodb的命令行里面输入:
use admin //切换到admin数据库
db.runCommand({logrotate:1})
可以将该命令放到OS的计划任务里执行。
Log Rotation 的配置参考:
MongoDB 4.4 启用 Log Rotation 功能
https://www.cndba.cn/dave/article/108011
版权声明:本文为博主原创文章,未经博主允许不得转载。