【问题标题】:Save line by line buffer in mongoDB using NodeJS使用NodeJS在mongoDB中逐行保存缓冲区
【发布时间】:2014-02-28 00:28:45
【问题描述】:

我正在制作一个用 nodejs 编写的服务器,它通过server.on('connection', function(conn) { 接收文件,该文件将该数据存储在缓冲区中。

此数据是一个日志文件,其中每行有 3 个重要列:

时间 - 源文件 - 消息

例如:

2014-02-05 22:12:33,268 - test.py:__init__() - This is message
2014-02-05 22:12:33,268 - test.py:__init__() - This is message 2

我想将此数据存储在 mongoDB 系统上,将接收到的日志文件分成行并将这些行分成列。我考虑使用客户端 IP 作为密钥。

现在我正在创建放置孔数据的文件,因为我不知道如何逐行读取以这种方式存储的数据,因为 readline 模块仅用于文件。

任何帮助都会很棒。谢谢

这是我服务器的小代码:

var net = require('net'),
    fs = require('fs'),
    buffer = require('buffer');


var server = net.createServer(function(conn) {
    console.log('server connected');

});

var HOST = '127.0.0.1';
var PORT = '9001';
var DEST_DIR = './logs';

server.listen(PORT, HOST, function() {
    // Check if DEST_DIR exists
    if (!fs.existsSync(DEST_DIR)) {
        console.log(DEST_DIR + ' not found. Creating it now...');
        fs.mkdir('logs', '700');
    }
    //listening
    console.log('Listening on port ' + PORT + '\n');

    server.on('connection', function(conn) {
        var current_time = Date.now();

        console.log('connection made...\n')
        conn.on('data', function(data) {
            console.log('data received');
            console.log('data is: \n' + data);
            // Create file
            fs.writeFile(DEST_DIR + '/' + current_time + '.txt', data, function(err){
                if(err){
                    console.log(err);
                }else{
                    console.log("File saved");
                }
            });
        });
    })
});

【问题讨论】:

  • 我没有看到任何与 MongoDB 相关的代码。所以,不清楚你想寻求什么帮助。
  • 我可以稍后弄清楚,但我想准备缓冲区以逐行读取并将其分成每行的列。谢谢
  • 你用什么分开的列?发布示例数据条目

标签: javascript node.js


【解决方案1】:

在换行符\n处拆分数据。对于每个条目,拆分列,将每一列添加为对象的属性,然后将对象存储在 mongoDB 中。

data = "time / source file / message \n time / source file / message";
var item, format = ['time', 'source', 'message'];

data = data.toString().split('\n');
while(item = data.pop()){
    item = item.split(/\W-\W/);
    var obj = {};
    item.forEach(function(v, i){
        obj[format[i]] = v;
    });
    // save the object to db
}

【讨论】:

  • 一行就像'2014-02-05 22:12:33,268 - test.py:__init__() - 这是消息'(由 - 每一列分隔)。通过您的示例以及数据如何保存在我的代码中,我得到:TypeError: Object 2014-02-05 22:12:33,268 - test.py:__init__() - This is message has no method 'split'
  • 文件发送完整,所以数据有几行我告诉你的格式的日志文件
  • 听起来data 是一个缓冲区,而不是一个字符串。我更新了代码来处理这个
  • 此外,需要使用正则表达式拆分列,以排除日期中的-
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2015-11-15
  • 1970-01-01
  • 2013-06-02
相关资源
最近更新 更多