Skip to content
This repository has been archived by the owner on Sep 2, 2019. It is now read-only.

Commit

Permalink
added support to select log files from /var/log
Browse files Browse the repository at this point in the history
  • Loading branch information
netroy committed Mar 13, 2011
1 parent 2587eb5 commit d80afd0
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 26 deletions.
21 changes: 19 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,17 @@
<script src="/socket.io/socket.io.js"></script>
<style type="text/css" rel="stylesheet">
body{background-color:#222;}
#selector{ float:left;}
#info{ font-size: 32px; color:#000;text-shadow:#444 1px 1px 2px; text-align:right;margin:20px 10px;text-transform:lowercase;}
#tail{ border: 1px solid #444; overflow-x:hidden; overflow-y:auto; background-color:#333; color: #EEE; text-shadow:#000 0 0 2px; height: 400px; padding: 10px; font-size:12px; line-height:20px;}
#tail{ clear:both; border: 1px solid #444; overflow-x:hidden; overflow-y:auto; background-color:#333; color: #EEE; text-shadow:#000 0 0 2px; height: 400px; padding: 10px; font-size:12px; line-height:20px;}
.trebuchet{font-family: "Trebuchet MS","Lucida Sans Unicode","Lucida Grande","Lucida Sans",Arial,sans-serif;}
.monospace{font-family: Monaco,"Bitstream Vera Sans Mono","Lucida Console",Terminal,monospace;}
.selection::selection , .selection *::selection{background: #EEE;color:#000;border-color:#000; text-shadow:#fff 0 0 2px;}
.selection::-moz-selection , .selection *::-moz-selection{background: #EEE;color:#000;border-color:#000; text-shadow:#fff 0 0 2px;}
</style>
</head>
<body>
<div id="selector"><select><option value="" selected>-- select a log --</option></select></div>
<div id="info" class="trebuchet"></div>
<div id="tail" class="monospace selection"></div>
<script type="text/javascript">
Expand All @@ -27,7 +29,22 @@
console.log('Connected to:', socket.host);
});
socket.on('message', function(message) {
if (message.filename) {
if (message.logs){
var selector = $("#selector select");
$.each(message.logs,function(){
var log = new Option(this,this);
if ($.browser.msie) selector[0].add(log);
else selector[0].add(log,null);
});
selector.bind('change',function(e){
var log = selector[0];
if(log.selectedIndex == 0){
$("#info,#tail").empty();
return;
}
socket.send({log:log.options[log.selectedIndex].value});
});
}else if (message.filename) {
notice.html( 'watching ' + message.filename );
}else if (message.tail) {
buffer.append( message.tail.join('<br/>') );
Expand Down
72 changes: 48 additions & 24 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,42 +6,66 @@ var http = require('http'),
fs = require('fs');

var backlog_size = 2000;
var filename = process.ARGV[2];
if (!filename) return util.puts("Usage: node <server.js> <filename>");
var log_dir = "/var/log/";
var logs = [];
// look up the dir for logs
fs.readdir(log_dir, function(err,files){
if(err) throw err;
files = Array.prototype.sort.apply(files,[]);
for(var file in files){
file = files[file];
if(fs.statSync(log_dir+file).isFile()) logs.push(file);
}
});

// -- Node.js HTTP Server ----------------------------------------------------------
server = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/html'})
fs.readFile(__dirname + '/index.html', function(err, data){
res.write(data, 'utf8');
res.end();
res.write(data, 'utf8');
res.end();
});
})
server.listen(8000, '0.0.0.0');
server.listen(8000);

// -- Setup Socket.IO ---------------------------------------------------------
var socket = io.listen(server);
socket.on('connection', function(client){
client.send( { filename : filename } );
fs.stat(filename,function(err,stats){
if (err) throw err;
var start = (stats.size > backlog_size)?(stats.size - backlog_size):0;
var stream = fs.createReadStream(filename,{start:start, end:stats.size});
stream.addListener("data", function(lines){
lines = lines.toString('utf-8');
lines = lines.slice(lines.indexOf("\n")+1).split("\n");
client.send({ tail : lines});
});
});
});
var filename;
client.send( { logs : logs } );
client.on("message",function(message){
if(message.log){
// Stop watching the last file and send the new one
fs.unwatchFile(filename);
filename = log_dir + message.log;
client.send({filename: filename});
// send some back log
fs.stat(filename,function(err,stats){
if (err) throw err;
var start = (stats.size > backlog_size)?(stats.size - backlog_size):0;
var stream = fs.createReadStream(filename,{start:start, end:stats.size});
stream.addListener("data", function(lines){
lines = lines.toString('utf-8');
lines = lines.slice(lines.indexOf("\n")+1).split("\n");
client.send({ tail : lines});
});
});

// watch the file now
fs.watchFile(filename, function(curr, prev) {
if(prev.size > curr.size) return {clear:true};
var stream = fs.createReadStream(filename, { start: prev.size, end: curr.size});
stream.addListener("data", function(lines) {
client.send({ tail : lines.toString('utf-8').split("\n") });
});
});

// watch the file now
fs.watchFile(filename, function(curr, prev) {
if(prev.size > curr.size) return {clear:true};
var stream = fs.createReadStream(filename, { start: prev.size, end: curr.size});
stream.addListener("data", function(lines) {
socket.broadcast({ tail : lines.toString('utf-8').split("\n") });
// stop watching the file
client.on("disconnect",function(){
fs.unwatchFile(filename);
});
}
});
});

console.log('Server running at http://0.0.0.0:8000/, connect with a browser to see tail output');
console.log('Log Server running now at http://[HOSTNAME]:8000/ in your browser');

0 comments on commit d80afd0

Please sign in to comment.