From 9007f9de9e9b601cc606263f59208f6a5dc1810e Mon Sep 17 00:00:00 2001 From: Andrew Darqui Date: Wed, 2 Oct 2013 01:15:45 -0400 Subject: [PATCH] added socket.io logging which can be dynamically enabled/disabled via the /admin/logger panel --- public/templates/admin/logger.tpl | 17 +++++++- src/webserver.js | 8 +++- src/websockets.js | 65 +++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/public/templates/admin/logger.tpl b/public/templates/admin/logger.tpl index c8abacff9b..e47d330f95 100644 --- a/public/templates/admin/logger.tpl +++ b/public/templates/admin/logger.tpl @@ -17,7 +17,22 @@
-
+ +
+
+
+ + +
+ + + + +
+
+ diff --git a/src/webserver.js b/src/webserver.js index 3911c59c16..b11c01e7c8 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -81,11 +81,17 @@ var express = require('express'), app.use(express.compress()); if(nconf.get("express:logger") == true || meta.config.loggerStatus > 0) { + /* + * HTTP request logging is enabled + */ var loggerObj = {}; if(meta.config.loggerPath) { loggerObj.stream = fs.createWriteStream(meta.config.loggerPath, {flags: 'a'}); - meta.config.loggerStream = loggerObj.stream } + else { + loggerObj.stream = process.stdout; + } + meta.config.loggerStream = loggerObj.stream; app.use(express.logger(loggerObj)); } diff --git a/src/websockets.js b/src/websockets.js index 27cdb0ef8a..04d2b96c93 100644 --- a/src/websockets.js +++ b/src/websockets.js @@ -16,6 +16,8 @@ var cookie = require('cookie'), async = require('async'), RedisStoreLib = require('connect-redis')(express), RDB = require('./redis'), + util = require('util'), + fs = require('fs') RedisStore = new RedisStoreLib({ client: RDB, ttl: 60 * 60 * 24 * 14 @@ -54,6 +56,26 @@ module.exports.init = function(io) { var hs = socket.handshake, sessionID, uid; + + +/* +(function() { + var emit = socket.emit; + socket.emit = function() { + console.log('***','emit', Array.prototype.slice.call(arguments)); + emit.apply(socket, arguments); + }; + var $emit = socket.$emit; + socket.$emit = function() { + console.log('***','on',Array.prototype.slice.call(arguments)); + $emit.apply(socket, arguments); + }; +})(); +*/ + + + + // Validate the session, if present socketCookieParser(hs, {}, function(err) { sessionID = socket.handshake.signedCookies["express.sid"]; @@ -64,6 +86,49 @@ module.exports.init = function(io) { userSockets[uid] = userSockets[uid] || []; userSockets[uid].push(socket); + + if(meta.config.loggerIOStatus > 0) { + var _prepare_loggerIO_string = function(_type, _uid, _args) { + try { + return 'io: '+_uid+' '+_type+' '+util.inspect(Array.prototype.slice.call(_args))+'\n'; + } catch(err) { + winston.err(err) + } + } + + + /* + * socket.io emit/on logging is enabled + */ + if(!meta.config.loggerIOStream) { + var loggerObj = {}; + if(meta.config.loggerIOPath) { + loggerObj.stream = fs.createWriteStream(meta.config.loggerIOPath, {flags: 'a'}); + } + else { + loggerObj.stream = process.stdout; + } + meta.config.loggerIOStream = loggerObj.stream; + } + + + (function() { + // courtesy of: http://stackoverflow.com/a/9674248 + var user = uid + if(!user) user = "?" + var emit = socket.emit; + socket.emit = function() { + meta.config.loggerIOStream.write(_prepare_loggerIO_string("emit",uid,arguments)); + emit.apply(socket, arguments); + }; + var $emit = socket.$emit; + socket.$emit = function() { + meta.config.loggerIOStream.write(_prepare_loggerIO_string("on",uid,arguments)); + $emit.apply(socket, arguments); + }; + })(); + } + if (uid) { RDB.zadd('users:online', Date.now(), uid, function(err, data) {