diff --git a/package.js b/package.js index ae990c6..306daf6 100644 --- a/package.js +++ b/package.js @@ -21,5 +21,7 @@ Package.onUse(function(api) { ]); api.addFiles([ + 'source/server/module.js', + 'source/server/winston-adapter.js' ], 'server'); }); diff --git a/source/server/module.js b/source/server/module.js new file mode 100644 index 0000000..41d5e9e --- /dev/null +++ b/source/server/module.js @@ -0,0 +1,27 @@ + Space.Module.define('Space.logging.Winston', { + + dependencies: { + configuration: 'configuration', + log: 'Space.Logger', + }, + + onInitialize() { + let log = this.injector.get('log'); + + let transports = lodash.get(this.configuration, 'log.winston.transports', [ + this._setupWinstonConsoleTransport() + ]) + let adapter = new Space.Logger.WinstonAdapter(transports); + this.injector.map('Space.Logger.WinstonAdapter').toStaticValue(adapter); + log.addAdapter('winston', adapter); + }, + + _setupWinstonConsoleTransport() { + options = { + colorize: true, + prettyPrint: true, + level: 'info', + } + return Space.Logger.WinstonAdapter.console(options); + } +}); \ No newline at end of file diff --git a/source/server/winston-adapter.js b/source/server/winston-adapter.js new file mode 100644 index 0000000..a94ca16 --- /dev/null +++ b/source/server/winston-adapter.js @@ -0,0 +1,48 @@ +const winston = Npm.require('winston'); + +const WinstonAdapter = Space.Logger.Adapter.extend('Space.Logger.WinstonAdapter', { + + Constructor: function(transports) { + let lib = new winston.Logger({ + transports: transports || [] + }); + lib.setLevels(winston.config.syslog.levels); + this.setLib(lib); + }, + + addTransport: function() { + return this._lib.add.apply(this._lib, arguments); + }, + + removeTransport: function() { + return this._lib.remove.apply(this._lib, arguments); + }, + + hasTransport: function(name) { + return this._lib.transports[transportName] != null; + }, + + setMinLevel: function(transportName, levelName) { + if (!this.hasTransport(transportName)) { + throw new Error(this.ERRORS.transportNotAdded(transportName)); + } + return this._lib.transports[transportName].level = levelName; + }, + + ERRORS: { + transportNotAdded: function(transportName) { + return `Winston transport with ${transportName} is not added`; + } + } +}); + +WinstonAdapter.console = function(options) { + if (options == null) { + let options = { + colorize: true, + prettyPrint: true, + level: 'info' + }; + } + return new winston.transports.Console(options); +};