Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

socketで繋いでtailした結果を出力する

Webサーバが分散されてる場合に、ログを収集しつつリアルタイムに解析したい。そんな要望があるため、まずは各ノードでtail -fした結果をソケットで受け取る方法を探った。

①各Webサーバ側でtailした結果をsokectクライアントに返す

以下を参考にした。
Real time online activity monitor example with node.js and WebSocket

そして出来上がったのが以下。

var util = require('util');
var net = require('net');
var spawn = require('child_process').spawn;

var filename = process.ARGV[2];

if (!filename)
return console.log("Usage: node <server.js> <filename>");

var tail = spawn("tail", ["-f", filename]);
var server = net.createServer(function (stream) {
stream.setNoDelay(true);
stream.addListener('connect', function(data) {
util.log('connect!');
});

stream.addListener('data', function(data) {
stream.end();
stream.destroy();
});

tail.stdout.on("data", function (data) {
stream.writable = true;
stream.write(data);
});
});

server.listen(8888);

Socket.IOで作るってのが今は一般的かもしれないが、もっと低レベルで、通信方法をあとからアレンジしたいと考えているので、とりあえずはここから始めることにする。

②tailサーバに接続し、結果を標準出力に書きだす
非常に単純。


var util = require("util");
var net = require("net");

var socket = net.createConnection(8888, 'localhost');
socket.addListener('data', function(data) {
util.debug(data);
});

以上。