socketで繋いでtailした結果を出力する
Webサーバが分散されてる場合に、ログを収集しつつリアルタイムに解析したい。そんな要望があるため、まずは各ノードでtail -fした結果をソケットで受け取る方法を探った。
①各Webサーバ側でtailした結果をsokectクライアントに返す
以下を参考にした。
Real time online activity monitor example with node.js and WebSocket
そして出来上がったのが以下。
Socket.IOで作るってのが今は一般的かもしれないが、もっと低レベルで、通信方法をあとからアレンジしたいと考えているので、とりあえずはここから始めることにする。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);
②tailサーバに接続し、結果を標準出力に書きだす
非常に単純。
var util = require("util");
var net = require("net");var socket = net.createConnection(8888, 'localhost');
socket.addListener('data', function(data) {
util.debug(data);
});
以上。