passenger 6.0.12 → 6.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +37 -1
- data/bin/passenger-install-nginx-module +1 -1
- data/dev/copy_boost_headers +30 -15
- data/resources/mime.types +1 -0
- data/resources/templates/standalone/server.erb +1 -0
- data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -0
- data/src/agent/Core/ApplicationPool/Options.h +5 -0
- data/src/agent/Core/Config.h +1 -1
- data/src/agent/Core/Controller/Config.h +5 -2
- data/src/agent/Core/Controller/InitRequest.cpp +2 -0
- data/src/agent/Core/OptionParser.h +4 -0
- data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h +7 -0
- data/src/agent/Core/SpawningKit/Config.h +13 -0
- data/src/agent/Core/SpawningKit/Handshake/Prepare.h +4 -0
- data/src/agent/Core/SpawningKit/Spawner.h +1 -0
- data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +4 -0
- data/src/agent/Watchdog/Config.h +1 -1
- data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +5 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +5 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +18 -0
- data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +3 -0
- data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +3 -0
- data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +11 -0
- data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +7 -0
- data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +17 -0
- data/src/apache2_module/Hooks.cpp +1 -0
- data/src/cxx_supportlib/Constants.h +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/align/align.hpp +19 -0
- data/src/cxx_supportlib/vendor-modified/boost/align/alignment_of.hpp +54 -0
- data/src/cxx_supportlib/vendor-modified/boost/align/alignment_of_forward.hpp +20 -0
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/align_cxx11.hpp +21 -0
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/aligned_alloc.hpp +52 -0
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/alignment_of.hpp +31 -0
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/alignment_of_cxx11.hpp +23 -0
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/element_type.hpp +91 -0
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/integral_constant.hpp +53 -0
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/min_size.hpp +26 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +8 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +6 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +12 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +5 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +18 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +13 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +3 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +4 -0
- data/src/nginx_module/ngx_http_passenger_module.c +1 -0
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/common.js +50 -29
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config/cli-config.js +20 -20
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config/npm-config.js +11 -11
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config/syslog-config.js +3 -3
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config.js +8 -2
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/container.js +2 -1
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/logger.js +174 -146
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/console.js +4 -2
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/file.js +15 -5
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/http.js +14 -4
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports.js +26 -24
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston.js +5 -5
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/async/package.json +4 -13
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/colors/package.json +19 -33
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/cycle/package.json +11 -29
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/eyes/package.json +12 -40
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/isstream/package.json +3 -12
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/stack-trace/lib/stack-trace.js +49 -24
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/stack-trace/package.json +4 -16
- data/src/nodejs_supportlib/vendor-copy/winston/package.json +11 -55
- data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +6 -0
- data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +6 -0
- data/src/ruby_supportlib/phusion_passenger/platform_info/linux.rb +2 -1
- data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +18 -18
- data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +7 -1
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
- data/src/ruby_supportlib/phusion_passenger.rb +5 -5
- metadata +12 -7
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/daily-rotate-file.js +0 -601
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/webhook.js +0 -146
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/pkginfo/LICENSE +0 -19
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/pkginfo/lib/pkginfo.js +0 -136
- data/src/nodejs_supportlib/vendor-copy/winston/node_modules/pkginfo/package.json +0 -56
@@ -1,601 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* daily-rotate-file.js: Transport for outputting to a local log file
|
3
|
-
*
|
4
|
-
* (C) 2010 Charlie Robbins
|
5
|
-
* MIT LICENCE
|
6
|
-
*
|
7
|
-
*/
|
8
|
-
|
9
|
-
var events = require('events'),
|
10
|
-
fs = require('fs'),
|
11
|
-
path = require('path'),
|
12
|
-
util = require('util'),
|
13
|
-
common = require('../common'),
|
14
|
-
Transport = require('./transport').Transport,
|
15
|
-
Stream = require('stream').Stream,
|
16
|
-
os = require('os');
|
17
|
-
|
18
|
-
//
|
19
|
-
// ### function DailyRotateFile (options)
|
20
|
-
// #### @options {Object} Options for this instance.
|
21
|
-
// Constructor function for the DailyRotateFile transport object responsible
|
22
|
-
// for persisting log messages and metadata to one or more files.
|
23
|
-
//
|
24
|
-
var DailyRotateFile = exports.DailyRotateFile = function (options) {
|
25
|
-
Transport.call(this, options);
|
26
|
-
|
27
|
-
//
|
28
|
-
// Helper function which throws an `Error` in the event
|
29
|
-
// that any of the rest of the arguments is present in `options`.
|
30
|
-
//
|
31
|
-
function throwIf (target /*, illegal... */) {
|
32
|
-
Array.prototype.slice.call(arguments, 1).forEach(function (name) {
|
33
|
-
if (options[name]) {
|
34
|
-
throw new Error('Cannot set ' + name + ' and ' + target + 'together');
|
35
|
-
}
|
36
|
-
});
|
37
|
-
}
|
38
|
-
|
39
|
-
if (options.filename || options.dirname) {
|
40
|
-
throwIf('filename or dirname', 'stream');
|
41
|
-
this._basename = this.filename = options.filename
|
42
|
-
? path.basename(options.filename)
|
43
|
-
: 'winston.log';
|
44
|
-
|
45
|
-
this.dirname = options.dirname || path.dirname(options.filename);
|
46
|
-
this.options = options.options || { flags: 'a' };
|
47
|
-
|
48
|
-
//
|
49
|
-
// "24 bytes" is maybe a good value for logging lines.
|
50
|
-
//
|
51
|
-
this.options.highWaterMark = this.options.highWaterMark || 24;
|
52
|
-
}
|
53
|
-
else if (options.stream) {
|
54
|
-
throwIf('stream', 'filename', 'maxsize');
|
55
|
-
this._stream = options.stream;
|
56
|
-
this._stream.on('error', function(error){
|
57
|
-
self.emit('error', error);
|
58
|
-
});
|
59
|
-
|
60
|
-
//
|
61
|
-
// We need to listen for drain events when
|
62
|
-
// write() returns false. This can make node
|
63
|
-
// mad at times.
|
64
|
-
//
|
65
|
-
this._stream.setMaxListeners(Infinity);
|
66
|
-
}
|
67
|
-
else {
|
68
|
-
throw new Error('Cannot log to file without filename or stream.');
|
69
|
-
}
|
70
|
-
|
71
|
-
this.json = options.json !== false;
|
72
|
-
this.colorize = options.colorize || false;
|
73
|
-
this.maxsize = options.maxsize || null;
|
74
|
-
this.maxFiles = options.maxFiles || null;
|
75
|
-
this.label = options.label || null;
|
76
|
-
this.prettyPrint = options.prettyPrint || false;
|
77
|
-
this.showLevel = options.showLevel === undefined ? true : options.showLevel;
|
78
|
-
this.timestamp = options.timestamp != null ? options.timestamp : true;
|
79
|
-
this.datePattern = options.datePattern != null ? options.datePattern : '.yyyy-MM-dd';
|
80
|
-
this.depth = options.depth || null;
|
81
|
-
this.eol = options.eol || os.EOL;
|
82
|
-
this.maxRetries = options.maxRetries || 2;
|
83
|
-
|
84
|
-
if (this.json) {
|
85
|
-
this.stringify = options.stringify;
|
86
|
-
}
|
87
|
-
|
88
|
-
//
|
89
|
-
// Internal state variables representing the number
|
90
|
-
// of files this instance has created and the current
|
91
|
-
// size (in bytes) of the current logfile.
|
92
|
-
//
|
93
|
-
this._size = 0;
|
94
|
-
this._created = 0;
|
95
|
-
this._buffer = [];
|
96
|
-
this._draining = false;
|
97
|
-
this._failures = 0;
|
98
|
-
|
99
|
-
var now = new Date();
|
100
|
-
this._year = now.getFullYear();
|
101
|
-
this._month = now.getMonth();
|
102
|
-
this._date = now.getDate();
|
103
|
-
this._hour = now.getHours();
|
104
|
-
this._minute = now.getMinutes();
|
105
|
-
|
106
|
-
var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhM])\1?/g,
|
107
|
-
pad = function (val, len) {
|
108
|
-
val = String(val);
|
109
|
-
len = len || 2;
|
110
|
-
while (val.length < len) val = "0" + val;
|
111
|
-
return val;
|
112
|
-
};
|
113
|
-
|
114
|
-
this.getFormattedDate = function() {
|
115
|
-
var flags = {
|
116
|
-
yy: String(this._year).slice(2),
|
117
|
-
yyyy: this._year,
|
118
|
-
M: this._month + 1,
|
119
|
-
MM: pad(this._month + 1),
|
120
|
-
d: this._date,
|
121
|
-
dd: pad(this._date),
|
122
|
-
H: this._hour,
|
123
|
-
HH: pad(this._hour),
|
124
|
-
m: this._minute,
|
125
|
-
mm: pad(this._minute)
|
126
|
-
};
|
127
|
-
return this.datePattern.replace(token, function ($0) {
|
128
|
-
return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
|
129
|
-
});
|
130
|
-
};
|
131
|
-
};
|
132
|
-
|
133
|
-
//
|
134
|
-
// Inherit from `winston.Transport`.
|
135
|
-
//
|
136
|
-
util.inherits(DailyRotateFile, Transport);
|
137
|
-
|
138
|
-
//
|
139
|
-
// Expose the name of this Transport on the prototype
|
140
|
-
//
|
141
|
-
DailyRotateFile.prototype.name = 'dailyRotateFile';
|
142
|
-
|
143
|
-
//
|
144
|
-
// ### function log (level, msg, [meta], callback)
|
145
|
-
// #### @level {string} Level at which to log the message.
|
146
|
-
// #### @msg {string} Message to log
|
147
|
-
// #### @meta {Object} **Optional** Additional metadata to attach
|
148
|
-
// #### @callback {function} Continuation to respond to when complete.
|
149
|
-
// Core logging method exposed to Winston. Metadata is optional.
|
150
|
-
//
|
151
|
-
DailyRotateFile.prototype.log = function (level, msg, meta, callback) {
|
152
|
-
if (this.silent) {
|
153
|
-
return callback(null, true);
|
154
|
-
}
|
155
|
-
|
156
|
-
//
|
157
|
-
// If failures exceeds maxRetries then we can't access the
|
158
|
-
// stream. In this case we need to perform a noop and return
|
159
|
-
// an error.
|
160
|
-
//
|
161
|
-
if (this._failures >= this.maxRetries) {
|
162
|
-
return callback(new Error('Transport is in a failed state.'));
|
163
|
-
}
|
164
|
-
|
165
|
-
var self = this;
|
166
|
-
|
167
|
-
var output = common.log({
|
168
|
-
level: level,
|
169
|
-
message: msg,
|
170
|
-
meta: meta,
|
171
|
-
json: this.json,
|
172
|
-
colorize: this.colorize,
|
173
|
-
prettyPrint: this.prettyPrint,
|
174
|
-
timestamp: this.timestamp,
|
175
|
-
label: this.label,
|
176
|
-
stringify: this.stringify,
|
177
|
-
showLevel: this.showLevel,
|
178
|
-
depth: this.depth,
|
179
|
-
formatter: this.formatter,
|
180
|
-
humanReadableUnhandledException: this.humanReadableUnhandledException
|
181
|
-
}) + this.eol;
|
182
|
-
|
183
|
-
this._size += output.length;
|
184
|
-
|
185
|
-
if (!this.filename) {
|
186
|
-
//
|
187
|
-
// If there is no `filename` on this instance then it was configured
|
188
|
-
// with a raw `WriteableStream` instance and we should not perform any
|
189
|
-
// size restrictions.
|
190
|
-
//
|
191
|
-
this._write(output, callback);
|
192
|
-
this._lazyDrain();
|
193
|
-
}
|
194
|
-
else {
|
195
|
-
this.open(function (err) {
|
196
|
-
if (err) {
|
197
|
-
//
|
198
|
-
// If there was an error enqueue the message
|
199
|
-
//
|
200
|
-
return self._buffer.push([output, callback]);
|
201
|
-
}
|
202
|
-
|
203
|
-
self._write(output, callback);
|
204
|
-
self._lazyDrain();
|
205
|
-
});
|
206
|
-
}
|
207
|
-
};
|
208
|
-
|
209
|
-
//
|
210
|
-
// ### function _write (data, cb)
|
211
|
-
// #### @data {String|Buffer} Data to write to the instance's stream.
|
212
|
-
// #### @cb {function} Continuation to respond to when complete.
|
213
|
-
// Write to the stream, ensure execution of a callback on completion.
|
214
|
-
//
|
215
|
-
DailyRotateFile.prototype._write = function(data, callback) {
|
216
|
-
// If this is a file write stream, we could use the builtin
|
217
|
-
// callback functionality, however, the stream is not guaranteed
|
218
|
-
// to be an fs.WriteStream.
|
219
|
-
var ret = this._stream.write(data);
|
220
|
-
if (!callback) return;
|
221
|
-
if (ret === false) {
|
222
|
-
return this._stream.once('drain', function() {
|
223
|
-
callback(null, true);
|
224
|
-
});
|
225
|
-
}
|
226
|
-
callback(null, true);
|
227
|
-
};
|
228
|
-
|
229
|
-
//
|
230
|
-
// ### function query (options, callback)
|
231
|
-
// #### @options {Object} Loggly-like query options for this instance.
|
232
|
-
// #### @callback {function} Continuation to respond to when complete.
|
233
|
-
// Query the transport. Options object is optional.
|
234
|
-
//
|
235
|
-
DailyRotateFile.prototype.query = function (options, callback) {
|
236
|
-
if (typeof options === 'function') {
|
237
|
-
callback = options;
|
238
|
-
options = {};
|
239
|
-
}
|
240
|
-
|
241
|
-
// TODO when maxfilesize rotate occurs
|
242
|
-
var file = path.join(this.dirname, this._basename + this.getFormattedDate()),
|
243
|
-
options = this.normalizeQuery(options),
|
244
|
-
buff = '',
|
245
|
-
results = [],
|
246
|
-
row = 0;
|
247
|
-
|
248
|
-
var stream = fs.createReadStream(file, {
|
249
|
-
encoding: 'utf8'
|
250
|
-
});
|
251
|
-
|
252
|
-
stream.on('error', function (err) {
|
253
|
-
if (stream.readable) {
|
254
|
-
stream.destroy();
|
255
|
-
}
|
256
|
-
if (!callback) return;
|
257
|
-
return err.code !== 'ENOENT'
|
258
|
-
? callback(err)
|
259
|
-
: callback(null, results);
|
260
|
-
});
|
261
|
-
|
262
|
-
stream.on('data', function (data) {
|
263
|
-
var data = (buff + data).split(/\n+/),
|
264
|
-
l = data.length - 1,
|
265
|
-
i = 0;
|
266
|
-
|
267
|
-
for (; i < l; i++) {
|
268
|
-
if (!options.start || row >= options.start) {
|
269
|
-
add(data[i]);
|
270
|
-
}
|
271
|
-
row++;
|
272
|
-
}
|
273
|
-
|
274
|
-
buff = data[l];
|
275
|
-
});
|
276
|
-
|
277
|
-
stream.on('close', function () {
|
278
|
-
if (buff) add(buff, true);
|
279
|
-
if (options.order === 'desc') {
|
280
|
-
results = results.reverse();
|
281
|
-
}
|
282
|
-
if (callback) callback(null, results);
|
283
|
-
});
|
284
|
-
|
285
|
-
function add(buff, attempt) {
|
286
|
-
try {
|
287
|
-
var log = JSON.parse(buff);
|
288
|
-
if (check(log)) push(log);
|
289
|
-
} catch (e) {
|
290
|
-
if (!attempt) {
|
291
|
-
stream.emit('error', e);
|
292
|
-
}
|
293
|
-
}
|
294
|
-
}
|
295
|
-
|
296
|
-
function push(log) {
|
297
|
-
if (options.rows && results.length >= options.rows) {
|
298
|
-
if (stream.readable) {
|
299
|
-
stream.destroy();
|
300
|
-
}
|
301
|
-
return;
|
302
|
-
}
|
303
|
-
|
304
|
-
if (options.fields) {
|
305
|
-
var obj = {};
|
306
|
-
options.fields.forEach(function (key) {
|
307
|
-
obj[key] = log[key];
|
308
|
-
});
|
309
|
-
log = obj;
|
310
|
-
}
|
311
|
-
|
312
|
-
results.push(log);
|
313
|
-
}
|
314
|
-
|
315
|
-
function check(log) {
|
316
|
-
if (!log) return;
|
317
|
-
|
318
|
-
if (typeof log !== 'object') return;
|
319
|
-
|
320
|
-
var time = new Date(log.timestamp);
|
321
|
-
if ((options.from && time < options.from)
|
322
|
-
|| (options.until && time > options.until)) {
|
323
|
-
return;
|
324
|
-
}
|
325
|
-
|
326
|
-
return true;
|
327
|
-
}
|
328
|
-
};
|
329
|
-
|
330
|
-
//
|
331
|
-
// ### function stream (options)
|
332
|
-
// #### @options {Object} Stream options for this instance.
|
333
|
-
// Returns a log stream for this transport. Options object is optional.
|
334
|
-
//
|
335
|
-
DailyRotateFile.prototype.stream = function (options) {
|
336
|
-
var file = path.join(this.dirname, this._basename + this.getFormattedDate()),
|
337
|
-
options = options || {},
|
338
|
-
stream = new Stream;
|
339
|
-
|
340
|
-
var tail = {
|
341
|
-
file: file,
|
342
|
-
start: options.start
|
343
|
-
};
|
344
|
-
|
345
|
-
stream.destroy = common.tailFile(tail, function (err, line) {
|
346
|
-
|
347
|
-
if(err){
|
348
|
-
return stream.emit('error',err);
|
349
|
-
}
|
350
|
-
|
351
|
-
try {
|
352
|
-
stream.emit('data', line);
|
353
|
-
line = JSON.parse(line);
|
354
|
-
stream.emit('log', line);
|
355
|
-
} catch (e) {
|
356
|
-
stream.emit('error', e);
|
357
|
-
}
|
358
|
-
});
|
359
|
-
|
360
|
-
if(stream.resume){
|
361
|
-
stream.resume();
|
362
|
-
}
|
363
|
-
|
364
|
-
return stream;
|
365
|
-
};
|
366
|
-
|
367
|
-
//
|
368
|
-
// ### function open (callback)
|
369
|
-
// #### @callback {function} Continuation to respond to when complete
|
370
|
-
// Checks to see if a new file needs to be created based on the `maxsize`
|
371
|
-
// (if any) and the current size of the file used.
|
372
|
-
//
|
373
|
-
DailyRotateFile.prototype.open = function (callback) {
|
374
|
-
var now = new Date();
|
375
|
-
if (this.opening) {
|
376
|
-
//
|
377
|
-
// If we are already attempting to open the next
|
378
|
-
// available file then respond with a value indicating
|
379
|
-
// that the message should be buffered.
|
380
|
-
//
|
381
|
-
return callback(true);
|
382
|
-
}
|
383
|
-
else if (!this._stream || (this.maxsize && this._size >= this.maxsize) ||
|
384
|
-
(this._year < now.getFullYear() || this._month < now.getMonth() || this._date < now.getDate() || this._hour < now.getHours() || this._minute < now.getMinutes())) {
|
385
|
-
//
|
386
|
-
// If we dont have a stream or have exceeded our size, then create
|
387
|
-
// the next stream and respond with a value indicating that
|
388
|
-
// the message should be buffered.
|
389
|
-
//
|
390
|
-
callback(true);
|
391
|
-
return this._createStream();
|
392
|
-
}
|
393
|
-
|
394
|
-
//
|
395
|
-
// Otherwise we have a valid (and ready) stream.
|
396
|
-
//
|
397
|
-
callback();
|
398
|
-
};
|
399
|
-
|
400
|
-
//
|
401
|
-
// ### function close ()
|
402
|
-
// Closes the stream associated with this instance.
|
403
|
-
//
|
404
|
-
DailyRotateFile.prototype.close = function () {
|
405
|
-
var self = this;
|
406
|
-
|
407
|
-
if (this._stream) {
|
408
|
-
this._stream.end();
|
409
|
-
this._stream.destroySoon();
|
410
|
-
|
411
|
-
this._stream.once('drain', function () {
|
412
|
-
self.emit('flush');
|
413
|
-
self.emit('closed');
|
414
|
-
});
|
415
|
-
}
|
416
|
-
};
|
417
|
-
|
418
|
-
//
|
419
|
-
// ### function flush ()
|
420
|
-
// Flushes any buffered messages to the current `stream`
|
421
|
-
// used by this instance.
|
422
|
-
//
|
423
|
-
DailyRotateFile.prototype.flush = function () {
|
424
|
-
var self = this;
|
425
|
-
|
426
|
-
//
|
427
|
-
// Iterate over the `_buffer` of enqueued messaged
|
428
|
-
// and then write them to the newly created stream.
|
429
|
-
//
|
430
|
-
this._buffer.forEach(function (item) {
|
431
|
-
var str = item[0],
|
432
|
-
callback = item[1];
|
433
|
-
|
434
|
-
process.nextTick(function () {
|
435
|
-
self._write(str, callback);
|
436
|
-
self._size += str.length;
|
437
|
-
});
|
438
|
-
});
|
439
|
-
|
440
|
-
//
|
441
|
-
// Quickly truncate the `_buffer` once the write operations
|
442
|
-
// have been started
|
443
|
-
//
|
444
|
-
self._buffer.length = 0;
|
445
|
-
|
446
|
-
//
|
447
|
-
// When the stream has drained we have flushed
|
448
|
-
// our buffer.
|
449
|
-
//
|
450
|
-
self._stream.once('drain', function () {
|
451
|
-
self.emit('flush');
|
452
|
-
self.emit('logged');
|
453
|
-
});
|
454
|
-
};
|
455
|
-
|
456
|
-
//
|
457
|
-
// ### @private function _createStream ()
|
458
|
-
// Attempts to open the next appropriate file for this instance
|
459
|
-
// based on the common state (such as `maxsize` and `_basename`).
|
460
|
-
//
|
461
|
-
DailyRotateFile.prototype._createStream = function () {
|
462
|
-
var self = this;
|
463
|
-
this.opening = true;
|
464
|
-
|
465
|
-
(function checkFile (target) {
|
466
|
-
var fullname = path.join(self.dirname, target);
|
467
|
-
|
468
|
-
//
|
469
|
-
// Creates the `WriteStream` and then flushes any
|
470
|
-
// buffered messages.
|
471
|
-
//
|
472
|
-
function createAndFlush (size) {
|
473
|
-
if (self._stream) {
|
474
|
-
self._stream.end();
|
475
|
-
self._stream.destroySoon();
|
476
|
-
}
|
477
|
-
|
478
|
-
self._size = size;
|
479
|
-
self.filename = target;
|
480
|
-
self._stream = fs.createWriteStream(fullname, self.options);
|
481
|
-
self._stream.on('error', function(error){
|
482
|
-
if (self._failures < self.maxRetries) {
|
483
|
-
self._createStream();
|
484
|
-
self._failures++;
|
485
|
-
}
|
486
|
-
else {
|
487
|
-
self.emit('error', error);
|
488
|
-
}
|
489
|
-
});
|
490
|
-
|
491
|
-
//
|
492
|
-
// We need to listen for drain events when
|
493
|
-
// write() returns false. This can make node
|
494
|
-
// mad at times.
|
495
|
-
//
|
496
|
-
self._stream.setMaxListeners(Infinity);
|
497
|
-
|
498
|
-
//
|
499
|
-
// When the current stream has finished flushing
|
500
|
-
// then we can be sure we have finished opening
|
501
|
-
// and thus can emit the `open` event.
|
502
|
-
//
|
503
|
-
self.once('flush', function () {
|
504
|
-
self.opening = false;
|
505
|
-
self.emit('open', fullname);
|
506
|
-
});
|
507
|
-
|
508
|
-
//
|
509
|
-
// Remark: It is possible that in the time it has taken to find the
|
510
|
-
// next logfile to be written more data than `maxsize` has been buffered,
|
511
|
-
// but for sensible limits (10s - 100s of MB) this seems unlikely in less
|
512
|
-
// than one second.
|
513
|
-
//
|
514
|
-
self.flush();
|
515
|
-
}
|
516
|
-
|
517
|
-
fs.stat(fullname, function (err, stats) {
|
518
|
-
if (err) {
|
519
|
-
if (err.code !== 'ENOENT') {
|
520
|
-
return self.emit('error', err);
|
521
|
-
}
|
522
|
-
|
523
|
-
return createAndFlush(0);
|
524
|
-
}
|
525
|
-
|
526
|
-
if (!stats || (self.maxsize && stats.size >= self.maxsize)) {
|
527
|
-
//
|
528
|
-
// If `stats.size` is greater than the `maxsize` for
|
529
|
-
// this instance then try again
|
530
|
-
//
|
531
|
-
return checkFile(self._getFile(true));
|
532
|
-
}
|
533
|
-
|
534
|
-
var now = new Date();
|
535
|
-
if (self._year < now.getFullYear() || self._month < now.getMonth() || self._date < now.getDate() || self._hour < now.getHours() || self._minute < now.getMinutes()) {
|
536
|
-
self._year = now.getFullYear();
|
537
|
-
self._month = now.getMonth();
|
538
|
-
self._date = now.getDate();
|
539
|
-
self._hour = now.getHours();
|
540
|
-
self._minute = now.getMinutes();
|
541
|
-
self._created = 0;
|
542
|
-
return checkFile(self._getFile());
|
543
|
-
}
|
544
|
-
|
545
|
-
createAndFlush(stats.size);
|
546
|
-
});
|
547
|
-
})(this._getFile());
|
548
|
-
};
|
549
|
-
|
550
|
-
//
|
551
|
-
// ### @private function _getFile ()
|
552
|
-
// Gets the next filename to use for this instance
|
553
|
-
// in the case that log filesizes are being capped.
|
554
|
-
//
|
555
|
-
DailyRotateFile.prototype._getFile = function (inc) {
|
556
|
-
var self = this,
|
557
|
-
filename = this._basename + this.getFormattedDate(),
|
558
|
-
remaining;
|
559
|
-
|
560
|
-
if (inc) {
|
561
|
-
//
|
562
|
-
// Increment the number of files created or
|
563
|
-
// checked by this instance.
|
564
|
-
//
|
565
|
-
// Check for maxFiles option and delete file
|
566
|
-
if (this.maxFiles && (this._created >= (this.maxFiles - 1))) {
|
567
|
-
remaining = this._created - (this.maxFiles - 1);
|
568
|
-
if (remaining === 0) {
|
569
|
-
fs.unlinkSync(path.join(this.dirname, filename));
|
570
|
-
}
|
571
|
-
else {
|
572
|
-
fs.unlinkSync(path.join(this.dirname, filename + '.' + remaining));
|
573
|
-
}
|
574
|
-
}
|
575
|
-
|
576
|
-
this._created += 1;
|
577
|
-
}
|
578
|
-
|
579
|
-
return this._created
|
580
|
-
? filename + '.' + this._created
|
581
|
-
: filename;
|
582
|
-
};
|
583
|
-
|
584
|
-
//
|
585
|
-
// ### @private function _lazyDrain ()
|
586
|
-
// Lazily attempts to emit the `logged` event when `this.stream` has
|
587
|
-
// drained. This is really just a simple mutex that only works because
|
588
|
-
// Node.js is single-threaded.
|
589
|
-
//
|
590
|
-
DailyRotateFile.prototype._lazyDrain = function () {
|
591
|
-
var self = this;
|
592
|
-
|
593
|
-
if (!this._draining && this._stream) {
|
594
|
-
this._draining = true;
|
595
|
-
|
596
|
-
this._stream.once('drain', function () {
|
597
|
-
this._draining = false;
|
598
|
-
self.emit('logged');
|
599
|
-
});
|
600
|
-
}
|
601
|
-
};
|