我们在带有Linux AMI的AWS环境中使用mongodb版本3。
最初mongo正在logging整个文件。 然后,我们降低了yaml的详细程度。 这似乎使大多数(99%)的文件不被logging。 但是我们仍然发现它偶尔还会logging这个logging。 它似乎做了一个写,然后一个命令,都包含整个logging。
有没有办法确保文档永远不会被写入日志,同时仍然有用的日志logging?
谢谢
systemLog: quiet: true destination: file path: /var/log/mongodb.log logAppend: true logRotate: rename traceAllExceptions: false timeStampFormat: iso8601-utc verbosity: 1 # This will be inherited by any component with verbosity -1 component: accessControl: verbosity: -1 # NOTE: Negative one (-1) means "inherit" command: verbosity: 0 # MUST BE ZERO!!! Otherwise, inserted/updated records (all the data) will get logged. control: verbosity: -1 geo: verbosity: 0 index: verbosity: -1 network: verbosity: -1 query: verbosity: -1 replication: verbosity: -1 sharding: verbosity: 0 storage: verbosity: -1 write: verbosity: 0 # MUST BE ZERO!!! Otherwise, inserted/updated records (all the data) will get logged.
版本和日志看起来像这样。 请注意我input的数据,所以任何无效的JSON或错别字是由于我不是mongo。
版本3.0.6
TIMESTAMP I WRITE [conn0001] insert project.collection query {<insert our json document here>} ninserted:1 keyUpdates:0 writeConflicts:0 numYields:0 locks:{Global: {acquireCount: {r: 2, w: 2}}, MMAPV1Journal: {acquireCount: {w:2},aquireWaitCount: {w:2}, timeAquiringMicros: {w: 119326}}, Database: {acquireCount:w: 2}}, Collection" {acquireCount: {W:1}}, oplog: {acquireCount: {w: 1}}} 119ms TIMESTAMP I COMMAND [conn0001] insert project.$cmd command: insert {<insert our json document here>} ninserted:1 keyUpdates:0 writeConflicts:0 numYields:0 reslen: 80 locks:{Global: {acquireCount: {r: 2, w: 2}}, MMAPV1Journal: {acquireCount: {w:2},aquireWaitCount: {w:2}, timeAquiringMicros: {w: 119326} timeAquiringMicros: {w: 119326}}, Database: {acquireCount:w: 2}}, Collection" {acquireCount: {W:1}}, oplog: {acquireCount: {w: 1}}} 119ms
您的插入查询正在被logging,因为它们被认为是慢速查询 – 比缺省值100ms的operationProfiling.slowOpThresholdMs值更长。 就像在MongoDB 3.2中一样,没有任何configuration用于缓慢查询logging什么细节,因为这个上下文有助于理解查询速度慢的原因。
您可以通过增加mongodconfiguration文件中的slowOpThresholdMs来避免logging缓慢的插入/命令。 例如,设置较高的250ms的slowOpThresholdMs可能足以确保大多数插入不会被logging(尽pipe真正慢的仍然可以):
operationProfiling: slowOpThresholdMs: 250
如果要确保从不logging缓慢的操作,可以设置更高的值,但这可能会抑制与部署性能相关的细节。
有没有办法确保文档永远不会被写入日志,同时仍然有用的日志logging?
通常情况下,有用的日志logging故障排除包括慢查询的细节以及连接/复制/身份validation信息(您已经用quiet:true取消)。
如果不logging这些详细信息,则可能无法调整和支持生产环境。
如果您担心访问mongod日志文件中的私人信息,我会确保您通过操作系统和文件系统权限正确限制对日志文件的访问,并encryption备份或排除敏感日志文件。 访问查看mongod服务器日志需要更多的权限,而不仅仅是通过mongo shelllogin,并且有权查看服务器日志的任何人都可能有权访问复制数据文件。
由于您的部署位于AWS,因此您可以考虑使用Amazon EBSencryption ,这将encryption卷中静止的数据,卷和实例之间的数据以及从卷创build的所有快照。
另一个需要考虑的select是对应用程序中的敏感字段进行encryption,使其不会被传输,logging或以明文保存。
有关保护您的部署的更多信息,请参阅MongoDB安全清单 。