본문 바로가기

Database/MongoDB

MongoDB 로그 관리 : logRotate와 로그파일 권한

MongoDB의 경우 mongod.log를 뱉는다. 

이 mongod.log는 자동으로 rotate가 되지 않고, rotate를 해주지 않으면 파일의 크기가 계속 커지게 된다. 

 

이때, MongoDB의 admin database에 logRotate 명령을 날려주면 MongoDB가 이쁘게 파일을 변경해준다. 

replset1:PRIMARY> db.adminCommand({logRotate:1});
{
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1700066060, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1700066060, 1)
}

 

 

https://www.mongodb.com/docs/manual/reference/command/logRotate/ 

 

logRotate — MongoDB Manual

Docs Home → MongoDB Manual logRotateThe logRotate command is an administrative command that allows you to rotate the MongoDB server log and/or audit log to prevent a single logfile from consuming too much disk space.You must issue the logRotate command a

www.mongodb.com

 

이 경우 MongoDB가 mongod.log 파일을 새로 생성하게 되는데 이때 변경된 파일의 권한은 MongoDB daemon이 동작하고 있는 os 유저만 쓰고 볼 수 있는 권한이 된다. 

MongoDB daemon을 실행시키는 os user가 많은 프로세스들에서 공통적으로 사용되는 os user인 경우 크게 문제가 없지만

MongoDB daemon이 root 로 수행되고 있다면 이야기가 달라진다. 

mongod.log가 root user만 읽고 쓸 수 있는 파일이 되어 filebeat가 mongod.log 수집할 수 없게 된다. 

$ ll
total 798676
-rw------- 1 root root      3570 Nov 16 01:34 mongod.log
-rw------- 1 root root     60352 Nov  7 10:28 mongod.log.2023-11-07T01-28-44
...

 

,,,,, 그럼 어떻게 해야할까? 

 

 

config file에 honorSystemUmask 옵션을 주거나, 서버 시작시에 --setParameter honorSystemUmask=true 옵션을 주면 된다. 

honorSystemUmask 옵션을 true로 주게 되면, 사용자의 umask 설정에 따라 파일을 생성한다. 

https://jira.mongodb.org/browse/SERVER-36251

 

[SERVER-36251] change logfile permissions. - MongoDB Jira

There are some questions about mongod permissions. When you restart or start mongod, the permissions of the mongo log are 644. However, when logrotate is run, the permissions of the mongod log change to 600. I wonder why this is happening. And I do not wan

jira.mongodb.org

 

https://www.mongodb.com/docs/manual/reference/parameters/#mongodb-parameter-param.honorSystemUmask

 

MongoDB Server Parameters — MongoDB Manual

Docs Home → MongoDB Manual MongoDB provides a number of configuration options that you can set using:the setParameter command:db.adminCommand( { setParameter: 1, : } )the setParameter configuration setting:setParameter: : ...the --setParameter command-li

www.mongodb.com

 

혹은 processUmask 파라미터를 사용하며 된다. 

processUmask 옵션을 주게 되면 기본 권한 셋팅을 덮어쓰게 된다. 

mongod --setParameter processUmask=011

https://www.mongodb.com/docs/manual/reference/parameters/#mongodb-parameter-param.processUmask

 

MongoDB Server Parameters — MongoDB Manual

Docs Home → MongoDB Manual MongoDB provides a number of configuration options that you can set using:the setParameter command:db.adminCommand( { setParameter: 1, : } )the setParameter configuration setting:setParameter: : ...the --setParameter command-li

www.mongodb.com

 

근데 두 설정 모두 mongod only 이다. 

그럼 mongos가 뱉는 mongos.log는...? 

 

결국 mongos.log는 MongoDB 레벨이 아닌 수동으로 권한 변경을 해주는 script를 작성해야한다. 

왜 MongoDB는 mongos에 대해서도 해당 옵션을 제공해주지 않는걸까? 

.... 슬프다.