123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- '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;
|