【发布时间】:2013-09-16 00:21:55
【问题描述】:
我正在尝试编写一个程序来解析并将 iis 日志数据插入到 mongodb。文件不是很大,大约有 600 行。与 .net 和 sql server 相比,试图说服我的管理 nodejs 和 mongodb 更好:)。
在 nodejs 中查看以下代码。逻辑:我解析每一行并转换为json并将保存插入到db中。我正在使用 mongonative 驱动程序。
问题:即使在所有行都插入 Db 之前,db 连接也已关闭。
我看到日志文件有 6000 行,但 db 中的记录数仅为 arnd 4000. 我知道这是nodejs的异步特性,在这我怎样才能以更确定的方式关闭连接(在检查是否所有行都插入之后)?
var MongoClient = require('mongodb').MongoClient;
var mongoServer = require('mongodb').Server;
var serverOptions = {
'auto_reconnect': true,
'poolSize': 5
};
var fs = require('fs');
var readline = require('readline');
var rd = readline.createInterface({
input: fs.createReadStream('C:/logs/Advisor_Metrics/UI/P20VMADVSRUI01/u_ex130904.log'),
output: process.stdout,
terminal: false
});
var mongoClient = new MongoClient(new mongoServer('localhost', 27017, serverOptions));
var db = mongoClient.db('test');
var collection = db.collection('new_file_test');
var cntr = 0;
mongoClient.open(function (err, mongoClient) {
console.log(err);
if (mongoClient)
{
rd.on('line', function (line) {
if (line.indexOf('#') == -1) {
var lineSplit = line.split(' ');
var data =
{
d: lineSplit[0],
t: lineSplit[1],
sip: lineSplit[2],
met: lineSplit[3],
uri: lineSplit[4],
cip: lineSplit[8],
cua: lineSplit[9],
stat: lineSplit[10],
tt: lineSplit[13]
};
collection.insert(data, function (err, docs) {
console.log('closing connection');
//db.close();
});
}
});
}
})
rd.on('close', function () {
db.close();
});
Sol 1:解决方案是解析 json 对象并添加到数组中,然后将数组添加到 mongodb。我不想这样做,因为那会想将整个巨大的日志文件解析到内存中!,还有其他解决方案吗?
【问题讨论】:
-
我会坚持使用 C# 和 SQL 服务器。 :)
标签: javascript node.js mongodb iis-logs