/debug-composer

Easy and clean wrapper for great debug utility

Primary LanguageJavaScriptMIT LicenseMIT

# Debug composer
> Easy and clean wrapper for great debug utility

Wrapper for [debug](https://github.com/visionmedia/debug) utility that provides clean and dead simple API

## FAQ
#### Why this exists?
Just to be able to call debug logger methods in a cleaner way and make debug configuration (that in localStorage in browser) much simpler.

#### I found a bug! What should I do?
Feel free to make a pull request. All contributions are appreciated! 

## Usage

#### Creating logger
```javascript
import createLogger from 'debug-composer';

const logger = createLogger('yourNamespace');
```

#### Using logger
```javascript

// this will be same as calling debug(yourNamespace:info)('Not so important message')
logger.info('Not so important message'); // yourNamespace:info Not so important message
```

You can use one of predefined methods:
 * log
 * info
 * warn
 * error
 * debug

Or add you own:
```javascript
logger.add('someCustomMethod');
logger.someCustomMethod('My message'); // yourNamespace:someCustomMethod My message

// add returns added method
logger.add('someOtherMethod')('Another message'); // yourNamespace:someOtherMethod Another message

// you can add more methods at once (but in this case add will not return any of added methods)
logger.add(['firstMethod', 'secondMethod']);
logger.secondMethod('Second message'); // yourNamespace:secondMethod Second message
```

#### Good practices with logger
* Use namespace that is exactly the same as name of your library
* Try to use methods names wisely:
  * if your lib/application has distinctive parts/features (e.g. AuthService or name of the react component) use their names as methods
  * if not you can also use methods like warn, info, debug, error, critical etc. to distinguish importance of a message
  
  
#### Using configureDebugger method
> NOTE: configureDebugger method works only in browser (where localStorage is available). You can set these options in node by using [DEBUG environment variable](https://github.com/visionmedia/debug#environment-variables).
```javascript
import { configureDebugger, resetDebugger } from 'debug-composer';

const settings = {
  development: {
    '*': true,
    'socket.io-client': false,
    'socket.io-client:*': false,
  },
  production: {
    'veryImportantLib:veryImportantLogs': true,
  },
};

resetDebugger(); // we can remove all previous configuration from localStorage
configureDebugger(settings, environment); // if you're using webpack and webpack.DefinePlugin you can make process.env.NODE_ENV available to the browser

/* ==================================== */

const settings = {
  default: {
    '*': true,
    'socket.io-client': false,
    'socket.io-client:*': false,
  },
  production: {
    'veryImportantLib:veryImportantLogs': true,
  },
};

configureDebugger(settings, undefined); // default settings will be applied

/* ====================================== */

const settings = {
  '*': true,
  'socket.io-client': false,
  'socket.io-client:*': false,
};

configureDebugger(settings); // just settings object will be applied when environment is not provided
```

This will create configuration string and save it in localStorage. You will need to reload the page for changes to take effect.

#### Additional logger functionality
```javascript
import createLogger from 'debug-composer';
const logger = createLogger('yourNamespace');

// measure time - method 1 - measuring code executed once, or large part of the code
logger.time('someName', true); // second param indicates if current time should be logged to console (as yourNamespace:performance). Optional, defaults to false.
myRenderFunction();
let timeInMiliseconds = logger.timeEnd('someName', true); // second param indicates if measured time should be logged to console (as yourNamespace:performance). Optional, defaults to true.

// measure time - method 2 - measuring code executed 10000 times
timeInMiliseconds = logger.testPerformance(() => {
  // here goes code to test
}, 10000, false); // third param indicates if time should be logged to console (as yourNamespace:performance)

// get stacktrace
logger.debug(logger.stacktrace()); // array of strings
logger.debug(logger.stacktrace(true)); // array of objects
```