질문은 간단합니다. 기본적으로 mongodb의 "꼬리"가능한 로그 파일에 모든 쿼리를 어떻게 기록합니까?
나는 시도했다 :
- 프로파일 링 레벨 설정
- 느린 ms 매개 변수 시작 설정
- -vv 옵션을 가진 mongod
/var/log/mongodb/mongodb.log는 현재 활성 연결 수만 계속 표시합니다.
질문은 간단합니다. 기본적으로 mongodb의 "꼬리"가능한 로그 파일에 모든 쿼리를 어떻게 기록합니까?
나는 시도했다 :
/var/log/mongodb/mongodb.log는 현재 활성 연결 수만 계속 표시합니다.
답변:
모든 쿼리를 기록 할 수 있습니다.
$ mongo
MongoDB shell version: 2.4.9
connecting to: test
> use myDb
switched to db myDb
> db.getProfilingLevel()
0
> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 1, "ok" : 1 }
> db.getProfilingLevel()
2
> db.system.profile.find().pretty()
출처 : http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/
db.setProfilingLevel(2)
"모든 작업 기록"을 의미합니다.
db.setProfilingLevel(2,-1)
system.profile
컬렉션에 씁니다 .
db.system.profile.find().pretty()
나를 위해 아무것도주지
나는 이런 식으로 mongod를 시작하여 이것을 해결했다. (망치고 못생긴, 그래 ...하지만 개발 환경에서 작동한다) :
mongod --profile=1 --slowms=1 &
그러면 프로파일 링이 가능하고 "느린 쿼리"에 대한 임계 값을 1ms로 설정하여 모든 쿼리가 파일에 "느린 쿼리"로 기록됩니다.
/var/log/mongodb/mongodb.log
이제 다음 명령을 사용하여 지속적인 로그 출력을 얻습니다.
tail -f /var/log/mongodb/mongodb.log
로그 예 :
Mon Mar 4 15:02:55 [conn1] query dendro.quads query: { graph: "u:http://example.org/people" } ntoreturn:0 ntoskip:0 nscanned:6 keyUpdates:0 locks(micros) r:73163 nreturned:6 reslen:9884 88ms
profile=1
하고 slowms=1
에 선 /etc/mongodb.conf
?
--profile=2
에 /etc/mongodb.conf
공식 몽고의 문서에 따르면, 어떤 모든 작업이 기록됩니다.
db.setProfilingLevel(level,slowms)
. 예를 들어 : db.setProfilingLevel(2,1)
레벨을 2로 설정하고 느린 쿼리 임계 값을 1ms로 설정합니다.
구글 최초의 답변이기 때문에 ...
버전 3
$ mongo
MongoDB shell version: 3.0.2
connecting to: test
> use myDb
switched to db
> db.setLogLevel(1)
http://docs.mongodb.org/manual/reference/method/db.setLogLevel/
MongoDB
정교한 프로파일 링 기능이 있습니다. 로깅은 system.profile
수집 에서 발생합니다 . 로그는 다음에서 볼 수 있습니다.
db.system.profile.find()
3 가지 로깅 레벨 ( source )이 있습니다.
데이터베이스가 실행중인 프로파일 링 레벨을 확인하려면 다음을 사용하십시오.
db.getProfilingLevel()
그리고 상태를 볼 수
db.getProfilingStatus()
프로파일 링 상태를 변경하려면 다음 명령을 사용하십시오.
db.setProfilingLevel(level, milliseconds)
여기서 level
프로파일 링 수준 milliseconds
을 나타내며 쿼리를 기록해야하는 기간 (ms)입니다. 로깅을 끄려면
db.setProfilingLevel(0)
타임 스탬프 내림차순으로 1 초 이상 걸린 모든 쿼리에 대해 시스템 프로필 모음에서 확인할 쿼리는 다음과 같습니다.
db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
프로파일 러 활동을 활성화하고 "꼬리"가능한 방식으로 "mongotail" 로그를 확인하는 명령 줄 도구를 만들었습니다 .
그러나보다 흥미로운 기능 (과 같은 tail
)은 옵션을 사용하여 "실시간" 의 변경 사항을보고 -f
때로는 grep
특정 작업을 찾기 위해 결과를 필터링하는 것입니다 .
https://github.com/mrsarm/mongotail 에서 설명서 및 설치 지침을 참조하십시오.
수준을 프로파일 링하면 사용하여 설정됩니다 db.setProfilingLevel(2)
.
아래 명령은 마지막으로 실행 된 쿼리를 인쇄합니다.
더 적거나 더 많은 쿼리를보기 위해 limit (5)를 변경할 수도 있습니다.
$ nin-프로필을 필터링하고 쿼리를 인덱싱합니다.
또한 쿼리 필드를 볼 때만 쿼리 프로젝션 { 'query': 1}을 사용하십시오.
db.system.profile.find(
{
ns: {
$nin : ['meteor.system.profile','meteor.system.indexes']
}
}
).limit(5).sort( { ts : -1 } ).pretty()
쿼리 프로젝션 만있는 로그
db.system.profile.find(
{
ns: {
$nin : ['meteor.system.profile','meteor.system.indexes']
}
},
{'query':1}
).limit(5).sort( { ts : -1 } ).pretty()
조회를 mongodb 로그 파일에 로그하려면 다음과 같이 로그 레벨과 프로파일 링을 모두 설정해야합니다.
db.setLogLevel(1)
db.setProfilingLevel(2)
( https://docs.mongodb.com/manual/reference/method/db.setLogLevel 참조 )
프로파일 링 만 설정하면 쿼리가 파일에 기록되지 않으므로 다음에서 얻을 수 있습니다.
db.system.profile.find().pretty()
프로파일 러 데이터는 파일이 아닌 DB의 컬렉션에 기록됩니다. http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/를 참조 하십시오
UI에서 필터링하고 정렬 할 수있는 10gen의 MMS 서비스를 사용하고 개발 프로파일 러 데이터를 제공하는 것이 좋습니다 .
우아하지는 않지만 oplog 는 이 목적으로 부분적으로 사용될 . 그것은 모든 쓰기를 기록하지만 읽기는 기록하지 않습니다 ...
내가 옳다면 복제 만화를 활성화해야합니다. 이 질문에 대한 정보는 MongoDB 컬렉션의 변경 사항을 듣는 방법에 대한 것입니다.
mongosniff를 확인하는 것이 좋습니다. 이 도구는 원하는 모든 것을 할 수 있습니다. 특히 대규모 mongo 시스템의 문제와 모든 mongo 관련 통신에 대한 네트워크 인터페이스를 청취하여 쿼리가 라우팅되는 방법과 쿼리가 발생하는 위치를 진단하는 데 도움이 될 수 있습니다.
쿼리가 들어 오면 실시간으로 system.profile 로그를 인쇄하는 스크립트를 작성했습니다. 다른 답변에서 설명한대로 먼저 로깅을 활성화해야합니다. 꼬리가 여전히 작동하지 않는 Linux 용 Windows 하위 시스템을 사용하고 있기 때문에 이것이 필요했습니다.
이것은 오래 전에 요청되었지만 여전히 누군가를 도울 수 있습니다.
MongoDB 프로파일 러는 캡핑 된 콜렉션 system.profile 에 모든 쿼리를 기록합니다 . 이 참조 : 데이터베이스 프로파일 러
--profile=2
모든 쿼리를 기록 가능 옵션
또는 실행 mongoshell에서, mongod 인스턴스 경우 이미 실행되고, db.setProfilingLevel(2)
선택 데이터베이스 후. (이를 확인할 수있다 db.getProfilingLevel()
반환해야하는,2
)tail -f ../logs/mongologs.txt
. 이 스크립트는 백그라운드에서 시작될 수 있으며 db의 모든 작업을 파일에 기록합니다.system.profile 컬렉션의 꼬리 커서에 대한 내 코드는 nodejs에 있습니다. 모든 MyDb 모음에서 발생하는 쿼리와 함께 모든 작업을 기록합니다.
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
const fs = require('fs');
const file = '../logs/mongologs'
// Connection URL
const url = 'mongodb://localhost:27017';
// Database Name
const dbName = 'MyDb';
//Mongodb connection
MongoClient.connect(url, function (err, client) {
assert.equal(null, err);
const db = client.db(dbName);
listen(db, {})
});
function listen(db, conditions) {
var filter = { ns: { $ne: 'MyDb.system.profile' } }; //filter for query
//e.g. if we need to log only insert queries, use {op:'insert'}
//e.g. if we need to log operation on only 'MyCollection' collection, use {ns: 'MyDb.MyCollection'}
//we can give a lot of filters, print and check the 'document' variable below
// set MongoDB cursor options
var cursorOptions = {
tailable: true,
awaitdata: true,
numberOfRetries: -1
};
// create stream and listen
var stream = db.collection('system.profile').find(filter, cursorOptions).stream();
// call the callback
stream.on('data', function (document) {
//this will run on every operation/query done on our database
//print 'document' to check the keys based on which we can filter
//delete data which we dont need in our log file
delete document.execStats;
delete document.keysExamined;
//-----
//-----
//append the log generated in our log file which can be tailed from command line
fs.appendFile(file, JSON.stringify(document) + '\n', function (err) {
if (err) (console.log('err'))
})
});
}
pymongo를 사용하는 파이썬의 꼬리 커서는 MyCollection을 필터링하고 삽입 작업 만 필터링하는 다음 코드를 참조하십시오.
import pymongo
import time
client = pymongo.MongoClient()
oplog = client.MyDb.system.profile
first = oplog.find().sort('$natural', pymongo.ASCENDING).limit(-1).next()
ts = first['ts']
while True:
cursor = oplog.find({'ts': {'$gt': ts}, 'ns': 'MyDb.MyCollection', 'op': 'insert'},
cursor_type=pymongo.CursorType.TAILABLE_AWAIT)
while cursor.alive:
for doc in cursor:
ts = doc['ts']
print(doc)
print('\n')
time.sleep(1)
참고 : 테일러 블 커서는 캡이있는 컬렉션에서만 작동합니다. 콜렉션에 대한 조작을 직접 로그하는 데 사용할 수 없으며 대신 필터를 사용하십시오.'ns': 'MyDb.MyCollection'
참고 : 위의 nodejs 및 python 코드는 일부에게는 큰 도움이되지 않을 수 있음을 이해합니다. 방금 참조를 위해 코드를 제공했습니다.
이 링크를 사용하여 언어 / 드라이버 선택에서 꼬리 커서에 대한 설명서를 찾으십시오. 하여 MongoDB 드라이버
이 logrotate 후에 추가 한 다른 기능입니다 .
oplog 작업없이 모든 쿼리를 처리하려면이 패키지를 사용해보십시오. https://www.npmjs.com/package/mongo-tail-queries
(면책 조항 :이 필요에 맞게이 패키지를 썼습니다)
mongod -vv
나를 위해 일했다