diff --git a/.gitignore b/.gitignore index 992011f..22c44e6 100755 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ logs/ debug/ npm-debug.log* yarn-error.log +*.log.* # test coverage/ @@ -18,9 +19,6 @@ coverage/ *.tgz # others +blinksocks*.js blinksocks*.json -blinksocks.client.js -blinksocks.server.js -blinksocks*.log -/*.log -/build/blinksocks.js.map +*.map diff --git a/src/behaviours/direct-close.js b/src/behaviours/direct-close.js index 2d21eca..1fcb390 100644 --- a/src/behaviours/direct-close.js +++ b/src/behaviours/direct-close.js @@ -1,13 +1,7 @@ -import {Logger} from '../utils'; - -let logger = null; +import {logger} from '../utils'; export default class DirectCloseBehaviour { - constructor() { - logger = Logger.getInstance(); - } - async run({remoteHost, remotePort, onClose}) { logger.warn(`[behaviour] [${remoteHost}:${remotePort}] connection closed`); onClose(); diff --git a/src/behaviours/random-timeout.js b/src/behaviours/random-timeout.js index a0150b4..9ed67ff 100644 --- a/src/behaviours/random-timeout.js +++ b/src/behaviours/random-timeout.js @@ -1,10 +1,8 @@ -import {getRandomInt, Logger} from '../utils'; +import {getRandomInt, logger} from '../utils'; const DEFAULT_TIMEOUT_MIN = 10; const DEFAULT_TIMEOUT_MAX = 40; -let logger = null; - export default class RandomTimeoutBehaviour { min = DEFAULT_TIMEOUT_MIN; @@ -12,7 +10,6 @@ export default class RandomTimeoutBehaviour { max = DEFAULT_TIMEOUT_MAX; constructor({min, max}) { - logger = Logger.getInstance(); if (min !== undefined) { if (!Number.isInteger(min)) { throw Error('\'min\' must be an integer'); diff --git a/src/behaviours/redirect.js b/src/behaviours/redirect.js index 4872043..04c0204 100644 --- a/src/behaviours/redirect.js +++ b/src/behaviours/redirect.js @@ -1,6 +1,4 @@ -import {Logger, isValidHostname, isValidPort} from '../utils'; - -let logger = null; +import {logger, isValidHostname, isValidPort} from '../utils'; export default class RedirectBehaviour { @@ -9,7 +7,6 @@ export default class RedirectBehaviour { _port = ''; constructor({host, port}) { - logger = Logger.getInstance(); if (!isValidHostname(host)) { throw Error('\'host\' is invalid'); } diff --git a/src/core/balancer.js b/src/core/balancer.js index e8d705a..9770365 100755 --- a/src/core/balancer.js +++ b/src/core/balancer.js @@ -1,5 +1,5 @@ import net from 'net'; -import {Logger} from '../utils'; +import {logger} from '../utils'; const QUERY_INTERVAL = 12e4; // 2min @@ -70,7 +70,6 @@ export class Balancer { } static _query() { - const logger = Logger.getInstance(); this._servers.map((server, i) => { const sstr = `${server.host}:${server.port}`; logger.verbose(`[balancer] querying ${sstr}`); diff --git a/src/core/config.js b/src/core/config.js index 8027fdf..206cde4 100755 --- a/src/core/config.js +++ b/src/core/config.js @@ -3,10 +3,11 @@ import fs from 'fs'; import path from 'path'; import os from 'os'; import net from 'net'; +import winston from 'winston'; import isPlainObject from 'lodash.isplainobject'; import {getBehaviourClassByName, BEHAVIOUR_EVENT_ON_PRESET_FAILED, behaviourEvents} from '../behaviours'; import {getPresetClassByName} from '../presets'; -import {isValidHostname, isValidPort, Logger} from '../utils'; +import {isValidHostname, isValidPort, logger} from '../utils'; import {DNS_DEFAULT_EXPIRE} from './dns-cache'; export const DEFAULT_LOG_LEVEL = 'info'; @@ -237,10 +238,29 @@ export class Config { // log_path & log_level const absolutePath = path.resolve(process.cwd(), json.log_path || '.'); - const isFile = fs.statSync(absolutePath).isFile(); + let isFile = false; + if (fs.existsSync(absolutePath)) { + isFile = fs.statSync(absolutePath).isFile(); + } else if (path.extname(absolutePath) !== '') { + isFile = true; + } + global.__LOG_PATH__ = isFile ? absolutePath : path.join(absolutePath, `bs-${__IS_CLIENT__ ? 'client' : 'server'}.log`); global.__LOG_LEVEL__ = (json.log_level !== undefined) ? json.log_level : DEFAULT_LOG_LEVEL; - Logger.init({file: __LOG_PATH__, level: __LOG_LEVEL__}); + + logger.configure({ + level: __LOG_LEVEL__, + transports: [ + new (winston.transports.Console)({ + colorize: true, + prettyPrint: true + }), + new (require('winston-daily-rotate-file'))({ + filename: __LOG_PATH__, + level: __LOG_LEVEL__ + }) + ] + }); // behaviours const behaviours = { diff --git a/src/core/hub.js b/src/core/hub.js index f47e1cf..0960f77 100755 --- a/src/core/hub.js +++ b/src/core/hub.js @@ -4,9 +4,7 @@ import net from 'net'; import {Config} from './config'; import {Socket} from './socket'; import {Balancer} from './balancer'; -import {Logger} from '../utils'; - -let logger = null; +import {logger} from '../utils'; const nextId = (function () { let i = 0; @@ -41,7 +39,6 @@ export class Hub extends EventEmitter { if (typeof config !== 'undefined') { Config.init(config); } - logger = Logger.getInstance(); this._hub = net.createServer(); this._hub.on('close', this.onClose.bind(this)); this._hub.on('connection', this.onConnect.bind(this)); diff --git a/src/core/socket.js b/src/core/socket.js index d3e3737..06228f6 100755 --- a/src/core/socket.js +++ b/src/core/socket.js @@ -1,6 +1,6 @@ import EventEmitter from 'events'; import net from 'net'; -import {Logger, isValidHostname, isValidPort} from '../utils'; +import {logger, isValidHostname, isValidPort} from '../utils'; import {Config} from './config'; import {DNSCache} from './dns-cache'; import {Balancer} from './balancer'; @@ -22,7 +22,6 @@ import {BEHAVIOUR_EVENT_ON_PRESET_FAILED} from '../behaviours'; const MAX_BUFFERED_SIZE = 1024 * 1024; // 1MB -let logger = null; let lastServer = null; function selectServer() { @@ -61,7 +60,6 @@ export class Socket extends EventEmitter { constructor({socket}) { super(); - logger = Logger.getInstance(); this.onForward = this.onForward.bind(this); this.onBackward = this.onBackward.bind(this); this.onError = this.onError.bind(this); diff --git a/src/presets/tracker.js b/src/presets/tracker.js index 938159a..83ce2f9 100644 --- a/src/presets/tracker.js +++ b/src/presets/tracker.js @@ -1,7 +1,5 @@ import {IPreset, CONNECTION_CREATED, SOCKET_CONNECT_TO_REMOTE, CONNECTION_CLOSED} from './defs'; -import {Logger} from '../utils'; - -let logger = null; +import {logger} from '../utils'; const TRACK_CHAR_UPLOAD = 'u'; const TRACK_CHAR_DOWNLOAD = 'd'; @@ -15,11 +13,6 @@ export default class TrackerPreset extends IPreset { // ['source', 'target', 'u', '20', 'u', '20', 'd', '10', ...] _tracks = []; - constructor() { - super(); - logger = Logger.getInstance(); - } - onNotified({type, payload}) { switch (type) { case CONNECTION_CREATED: diff --git a/src/utils/logger.js b/src/utils/logger.js index d62c80e..9546262 100644 --- a/src/utils/logger.js +++ b/src/utils/logger.js @@ -1,30 +1,2 @@ import winston from 'winston'; - -const LOG_FILE_MAX_SIZE = 2 * 1024 * 1024; // 2MB - -let instance = null; - -export const Logger = { - - init({file, level}) { - instance = new (winston.Logger)({ - transports: [ - new (winston.transports.Console)({ - colorize: true, - prettyPrint: true - }), - new (winston.transports.File)({ - filename: file, - maxsize: LOG_FILE_MAX_SIZE, - silent: ['test', 'debug'].includes(process.env.NODE_ENV) - }) - ] - }); - instance.level = level; - }, - - getInstance() { - return instance || winston; - } - -}; +export const logger = new (winston.Logger)();