Skip to content

Instantly share code, notes, and snippets.

@fkowal
Created August 24, 2012 08:13
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save fkowal/3447400 to your computer and use it in GitHub Desktop.
Save fkowal/3447400 to your computer and use it in GitHub Desktop.
NodeJs tail with websocket
.idea
node_modules
atlassian-ide-plugin.xml

on your server run: node tail.js file1 file2

in your browser open http://localhost:8090/files/file1

and voila all changes show up in your client/browser

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<script type="text/javascript" src="http://yui.yahooapis.com/3.6.0/build/yui/yui-min.js"></script>
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
</head>
<body>
<div id='files'></div>
<pre id="output"></pre>
<script type="text/javascript">
YUI().use('node', function(Y) {
var path = window.location.pathname,
output = Y.one('#output'),
files = Y.one('#files'),
socket= io.connect(path)
;
socket.on('files', function (data) {
Y.log(data);
output.append(data);
Y.Array.each(data, function (file, index) {
files.append('<a href="/files/'+index+'">'+file+'</a>&nbsp;');
});
});
socket.on('message', function(data) {
output.append(data);
});
});
</script>
</body>
</html>
{
"name": "tailjs",
"description": "broadcast logs using websockets",
"version": "0.0.3",
"private": true,
"dependencies": {
"socket.io": "*",
"socket.io-client": "*",
"express": "*"
},
"homepage": "https://gist.github.com/3447400",
"repository": "git://gist.github.com/3447400.git",
"author": ["Maciej Kowalski"],
"keywords": [ "tail", "websocket", "express" ],
"bin": "./tail.js",
"config": {
"port": 8090
}
}
#!/usr/bin/env node
var fs = require('fs'),
port = process.env.npm_package_config_port || 8090,
express = require('express'),
http = require('http'),
app = express(),
server = http.createServer(app),
io = require('socket.io').listen(server),
files = [],
os = require('os'),
buf = new Buffer(4096);
server.listen(port);
if (process.argv.length < 3) {
console.error("Usage: " + __filename + " filename");
process.exit(1);
}
// server the browser dependencies
app.configure(function () {
app.use(express.static(__dirname + '/public'));
});
// server socket.io client to the browser
app.get('/socket.io/socket.io.js', function (req, res) {
res.sendfile(__dirname + '/node_modules/socket.io-client/dist/socket.io.js');
});
// open a route for each file from the command line
app.get('/files/:filename', function (req, res) {
res.sendfile(__dirname + '/public/index.html');
});
// for each file from the command line open an route
process.argv.splice(2).forEach(function (filename) {
"use strict";
fs.open(filename, 'r', function (err, fd) {
if (err) {
console.error('Unable to open: ' + filename);
return;
}
files.push(filename);
var nsName = '/files/' + (-1 + files.length),
ns = io.of(nsName)
.on('connection', function(socket) {
socket.emit('files', files);
});
console.info('Listening on http://' + os.hostname() + ':' + port + nsName + ' ' + filename);
// watch file
fs.watchFile(filename, function (curr, prev) {
var len = curr.size - prev.size, position = prev.size;
if (len > 0) {
fs.read(fd, buf, 0, len, position,
function (err, bytesRead, buffer) {
if (err) {
console.error(err);
return;
}
var msg = buffer.toString('utf8', 0, bytesRead);
ns.emit('message', msg);
});
} else {
console.log(curr);
}
});
});
});
console.info('Listing on http://' + os.hostname() + ':' + port);
// on connection broadcast file names the server is tailing
io.sockets
.on('connection', function (socket) {
"use strict";
// broadcast opened files
socket.emit('files', files);
});
@fkowal
Copy link
Author

fkowal commented Aug 24, 2012

on your server run:
node tail.js path_to_log_you_wish_to_track

in your browser open
client.html?host=hostname by the default hostname is localhost

and voila all changes show up in your client/browser

@ricardoreis
Copy link

Hello

how can i fix this error below?

io = require('socket.io').listen(server),
^
TypeError: require(...).listen is not a function
at Object. (/data/data/com.termux/files/home/andronode/web2/tail.js:8:31)
at Module._compile (node:internal/modules/cjs/loader:1120:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1174:10)
at Module.load (node:internal/modules/cjs/loader:998:32)
at Module._load (node:internal/modules/cjs/loader:839:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47

Node.js v18.7.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment