Skip to content

Commit f11610e

Browse files
committed
[minor api] Update to optional debugging. Various small style updates
1 parent 686d009 commit f11610e

File tree

3 files changed

+114
-83
lines changed

3 files changed

+114
-83
lines changed

bin/forever

+40-16
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,18 @@ var path = require('path'),
66
sys = require('sys'),
77
forever = require('./../lib/forever');
88

9-
var accepts = ['start', 'stop', 'stopall', 'list', 'config', 'clear', 'set', 'cleanlogs', 'restart'], action;
9+
var action, accepts = [
10+
'start',
11+
'stop',
12+
'stopall',
13+
'list',
14+
'config',
15+
'clear',
16+
'set',
17+
'cleanlogs',
18+
'restart'
19+
];
20+
1021
if (accepts.indexOf(process.argv[2]) !== -1) {
1122
action = process.argv.splice(2,1)[0];
1223
}
@@ -34,13 +45,14 @@ var help = [
3445
' -l LOGFILE Logs the forever output to LOGFILE',
3546
' -o OUTFILE Logs stdout from child script to OUTFILE',
3647
' -e ERRFILE Logs stderr from child script to ERRFILE',
37-
' -d SOURCEDIR The source directory for which SCRIPT is relative to',
3848
' -p PATH Base path for all forever related files (pid files, etc.)',
3949
' -c COMMAND COMMAND to execute (defaults to node)',
40-
' --pidfile The pid file',
4150
' -a, --append Append logs',
51+
' --pidfile The pid file',
52+
' --sourceDir The source directory for which SCRIPT is relative to',
4253
' --minUptime Minimum uptime (millis) for a script to not be considered "spinning"',
43-
' --spinSleepTime Time to wait (millis) between launches of a spinning script. (defaults to killing a spinning script).',
54+
' --spinSleepTime Time to wait (millis) between launches of a spinning script.',
55+
' -d, --debug Forces forever to log debug output',
4456
' -v, --verbose Turns on the verbose messages from Forever',
4557
' -s, --silent Run the child script silencing stdout and stderr',
4658
' -h, --help You\'re staring at it',
@@ -68,14 +80,12 @@ function isSimpleAction () {
6880
//
6981
if (argv.h || argv.help || (argv._.length === 0 && !isSimpleAction())
7082
&& (!argv.c && !argv.command)) {
71-
sys.puts(help);
72-
return;
83+
return sys.puts(help);
7384
}
7485

7586
var mappings = {
7687
'c': 'command',
7788
'e': 'errFile',
78-
'd': 'sourceDir',
7989
'l': 'logFile',
8090
'a': 'appendLog',
8191
'append': 'appendLog',
@@ -85,10 +95,13 @@ var mappings = {
8595
'pidfile': 'pidFile',
8696
's': 'silent',
8797
'silent': 'silent',
98+
'sourceDir': 'sourceDir',
8899
'minUptime': 'minUptime',
89100
'spinSleepTime': 'spinSleepTime',
90101
'v': 'verbose',
91-
'verbose': 'verbose'
102+
'verbose': 'verbose',
103+
'd': 'debug',
104+
'debug': 'debug'
92105
};
93106

94107
//
@@ -127,10 +140,10 @@ if (typeof options['max'] === 'undefined') {
127140
}
128141

129142
if (typeof options['minUptime'] !== 'undefined') {
130-
options['minUptime'] = parseFloat(options['minUptime']);
143+
options['minUptime'] = parseFloat(options['minUptime']);
131144
}
132145
if (typeof options['spinSleepTime'] !== 'undefined') {
133-
options['spinSleepTime'] = parseFloat(options['spinSleepTime']);
146+
options['spinSleepTime'] = parseFloat(options['spinSleepTime']);
134147
}
135148

136149
if (!options.sourceDir) {
@@ -169,10 +182,8 @@ options.spawnWith = {
169182
//
170183
// Configure winston for forever based on the CLI options
171184
//
172-
winston.defaultTransports().console.timestamp = false;
173-
winston.defaultTransports().console.colorize = true;
174185
if (options.verbose) {
175-
winston.defaultTransports().console.level = 'silly';
186+
forever.log.transports.console.level = 'silly';
176187
}
177188

178189
//
@@ -186,12 +197,25 @@ var config = {
186197
// Only call `forever.load()` if the root path is different than
187198
// the default root exposed by forever.
188199
//
189-
if (config.root && config.root !== forever.root) {
190-
winston.silly('Loading forever with config: ', config);
200+
if ((config.root && config.root !== forever.root)) {
201+
forever.log.silly('Loading forever with config: ', config);
191202
forever.load(config);
192-
winston.silly('Loaded forever successfully.');
203+
forever.log.silly('Loaded forever successfully.');
193204
}
194205

206+
//
207+
// If we should debug this forever process then
208+
// configure it to do so.
209+
//
210+
if (argv.d || argv.debug) {
211+
forever.log.warn('Forever debugging enabled');
212+
forever._debug();
213+
}
214+
215+
//
216+
// If this is a set action then get the first
217+
// value from the options and continue.
218+
//
195219
if (action === 'set') {
196220
options = options.options[0];
197221
}

lib/forever.js

+32-34
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,26 @@ var fs = require('fs'),
1919

2020
var forever = exports;
2121

22+
//
23+
// Setup `forever.log` to be a custom `winston` logger.
24+
//
25+
forever.log = new (winston.Logger)({
26+
transports: [
27+
new (winston.transports.Console)()
28+
]
29+
});
30+
31+
forever.log.cli();
32+
2233
//
2334
// ### Export Components / Settings
2435
// Export `version` and important Prototypes from `lib/forever/*`
2536
//
2637
forever.initialized = false;
27-
forever._debug = false;
2838
forever.root = path.join(process.env.HOME, '.forever');
2939
forever.config = new nconf.stores.File({ file: path.join(forever.root, 'config.json') });
30-
forever.cli = require('./forever/cli');
31-
forever.Forever = forever.Monitor = require('./forever/monitor').Monitor;
40+
forever.Forever = forever.Monitor = require('./forever/monitor').Monitor;
41+
forever.cli = require('./forever/cli');
3242

3343
//
3444
// Expose version through `pkginfo`
@@ -80,12 +90,7 @@ forever.load = function (options) {
8090
// If we have been indicated to debug this forever process
8191
// then setup `forever._debug` to be an instance of `winston.Logger`.
8292
//
83-
forever.config.set('debug', options.debug);
84-
forever._debug = new (winston.Logger)({
85-
transports: [
86-
new (winston.transports.File)({ file: path.join(options.root, 'forever.debug.log') })
87-
]
88-
});
93+
forever._debug();
8994
}
9095

9196
//
@@ -111,6 +116,17 @@ forever.load = function (options) {
111116
forever.initialized = true;
112117
};
113118

119+
//
120+
// ### @private function _debug ()
121+
// Sets up debugging for this forever process
122+
//
123+
forever._debug = function () {
124+
forever.config.set('debug', true);
125+
forever.log.add(winston.transports.File, {
126+
filename: path.join(forever.config.get('root'), 'forever.debug.log')
127+
});
128+
}
129+
114130
//
115131
// Ensure forever will always be loaded the first time it is required.
116132
//
@@ -135,12 +151,12 @@ forever.stat = function (logFile, script, callback) {
135151

136152
fs.stat(script, function (err, stats) {
137153
if (err) {
138-
return callback(new Error('script ' + script + ' does not exist.'));
154+
return callback(new Error('Script ' + script + ' does not exist.'));
139155
}
140156

141157
return logAppend ? callback(null) : fs.stat(logFile, function (err, stats) {
142158
return !err
143-
? callback(new Error('log file ' + logFile + ' exists.'))
159+
? callback(new Error('Log file ' + logFile + ' exists.'))
144160
: callback(null);
145161
});
146162
});
@@ -367,7 +383,9 @@ forever.list = function (format, procs) {
367383
// Iterate over the procs to see which has the longest options string
368384
procs.forEach(function (proc) {
369385
proc.length = [proc.command || 'node', proc.file].concat(proc.options).join(' ').length;
370-
if (proc.length > maxLen) maxLen = proc.length;
386+
if (proc.length > maxLen) {
387+
maxLen = proc.length;
388+
}
371389
});
372390

373391
procs.forEach(function (proc) {
@@ -463,8 +481,7 @@ forever.cleanUp = function (cleanLogs, allowManager) {
463481
? cleanBatch(processes.splice(0, 10))
464482
: emitter.emit('cleanUp');
465483
});
466-
})(processes.splice(0, 10));
467-
484+
})(processes.splice(0, 10));
468485
}
469486
else {
470487
process.nextTick(function () {
@@ -561,25 +578,6 @@ forever.checkProcess = function (pid, callback) {
561578
});
562579
};
563580

564-
//
565-
// ### function debug (msg, meta, callback)
566-
// #### @msg {string} Message to log
567-
// #### @meta {Object} **Optional** Additional metadata to log.
568-
// #### @callback
569-
//
570-
forever.debug = function (msg, meta, callback) {
571-
if (!callback && typeof meta === 'function') {
572-
callback = meta;
573-
meta = {};
574-
}
575-
576-
if (!forever._debug) {
577-
return callback && callback();
578-
}
579-
580-
forever._debug.info(msg, meta, callback);
581-
};
582-
583581
//
584582
// ### function formatProcess (proc index, padding)
585583
// #### @proc {Object} Process to format
@@ -592,7 +590,7 @@ function formatProcess (proc, index, padding) {
592590
var command = proc.command || 'node';
593591

594592
// Create an array of the output we can later join
595-
return [' [' + index + ']', command.grey, proc.file.grey]
593+
return ['[' + index + ']', command.grey, proc.file.grey]
596594
.concat(proc.options.map(function (opt) { return opt.grey }))
597595
.concat([padding + '[' + proc.pid + ',', proc.foreverPid + ']'])
598596
.concat(proc.logFile ? proc.logFile.magenta : '')

0 commit comments

Comments
 (0)