egg-logger
Version:
114 lines (100 loc) • 2.34 kB
JavaScript
'use strict';
const depd = require('depd')('egg-logger');
const FileTransport = require('./file');
const utils = require('../utils');
/**
* extends from {@link FileTransport}
* save log in memory and flush to log file at intervals
*/
class FileBufferTransport extends FileTransport {
/**
* @class
* @param {Object} options
* - {String} file - log file path
* - {Number} [flushInterval = 1000] - interval for flush to file
* - {Number} [maxBufferLength = 1000] - max buffer queue length
* - {String} [level = INFO] - log level
*/
constructor(options) {
super(options);
this._bufSize = 0;
this._buf = [];
this._timer = this._createInterval();
}
get defaults() {
return utils.assign(super.defaults, {
flushInterval: 1000,
maxBufferLength: 1000,
});
}
/**
* close stream and interval
*/
close() {
this._closeInterval();
super.close();
}
/**
* @deprecated
*/
end() {
depd('transport.end() is deprecated, use transport.close()');
this.close();
}
/**
* flush log into file
*/
flush() {
if (this._buf.length > 0 && this.writable) {
if (this.options.encoding === 'utf8') {
this._stream.write(this._buf.join(''));
} else {
this._stream.write(Buffer.concat(this._buf, this._bufSize));
}
this._buf = [];
this._bufSize = 0;
}
}
/**
* override, flush before close stream
* @private
*/
_closeStream() {
// FileTransport 在初始化时会 reload,这时 _buf 还未初始化
if (this._buf && this._buf.length > 0) {
this.flush();
}
super._closeStream();
}
/**
* override, save in memory temporary
* @param {Buffer} buf - log buffer
* @private
*/
_write(buf) {
this._bufSize += buf.length;
this._buf.push(buf);
if (this._buf.length > this.options.maxBufferLength) {
this.flush();
}
}
/**
* create interval to flush log into file
* @return {Interval} 定时器
* @private
*/
_createInterval() {
return setInterval(() => this.flush(), this.options.flushInterval);
}
/**
* close interval
* @private
*/
_closeInterval() {
if (this._timer) {
clearInterval(this._timer);
this._timer = null;
}
}
}
module.exports = FileBufferTransport;