# Genie logger Library for Node.js services
Reusable Node.js logger for platform Lambda services.


## Installing

To install this library into your project

```bash
$ npm i @genie-solutions/genie-logger
```

### Dependencies

This library is built using uuid, winston and winston-transport

## Basic Examples

```ts
    import { createLoggerFromContext } from "./services/logging";
  
    const createLogger = createLoggerFromContext(APP_NAME, STAGE, LOG_LEVEL);

    const logger = createLogger(context.awsRequestId);

    logger.info({
      type: EventType.CreditAssessed,
      payload: {
        threadId,
        tenantId,
        creditBalance,
        calculatedCost: cost
      }
    });

    logger.error({
      type: EventType.CreditServiceError,
      error: { message: error.message }
    });

    logger.warn({
      type: EventType.CreditServiceWarning,
      error: { message: error.message }
    });
    logger.debug({
      type: EventType.CreditServiceDebug,
      error: { message: error.message }
    });
```

## Profiling Examples

```ts
    //
    // Start profile of 'test'
    //
    logger.profile('test');
    
    setTimeout(function () {
      //
      // Stop profile of 'test'. Logging will now take place:
      //   '17 Jan 21:00:00 - info: test duration=1000ms'
      //
      logger.profile('test');
    }, 1000);
```
This will output ```{"level":"info","durationMs":2311,"message":"test"}``` in the log

## Profiling Timer example

```ts
     // Returns an object corresponding to a specific timing. When done
     // is called the timer will finish and log the duration. e.g.:
     //
     const profiler = logger.startTimer();
     setTimeout(function () {
       profiler.done({ message: 'Logging message' });
     },
```

This will output ```{"message":"Logging message","level":"info","durationMs":14990}``` in the log

## Extra metadata inthe log

The default logger will include the three parameter metadata(APP_NAME, STAGE, LOG_LEVEL) in the log,
to extend this with extra metadata, use the extend function

```ts
  const logger = createLogger(context.awsRequestId).extend(
    pick({ requestId: "451" })
  );

  logger.info("Child logging");
```

This will output following log:
```
{"requestId":"451","message":"Child logging","level":"info"}
```
