aws-sdk-js-v3 icon indicating copy to clipboard operation
aws-sdk-js-v3 copied to clipboard

Add trace function in Logger

Open trivikr opened this issue 3 years ago • 2 comments

Is your feature request related to a problem? Please describe. Currently, there's no trace function on Logger interface used in aws-sdk-js-v3 https://github.com/aws/aws-sdk-js-v3/blob/fece4175a38eade70ae7192f1f1a9d17243b9855/packages/types/src/logger.ts#L23-L28

Trace is a verbose form of logging, and it's benefits are discussed in https://softwareengineering.stackexchange.com/questions/279690

The trace level exists on popular JavaScript loggers:

  • loglevel https://github.com/pimterry/loglevel/blob/b69415b54696f9948cb4b1f709a127d543a6477e/test/level-setting-test.js#L3-L9
  • log4js https://github.com/log4js-node/log4js-node/blob/5545f2a932e012177e553bfda90d8b3fba80b332/lib/levels.js#L90-L100
  • bunyan https://github.com/trentm/node-bunyan/blob/13e00c75a5eb4f272d9e9f5494af78fdd4626149/lib/bunyan.js#L254-L259
  • pino https://github.com/pinojs/pino/blob/338e8f9ccb97154ecd64ae011c0147a82c6f85da/lib/levels.js#L14-L21

It doesn't exist on winston, but winston allows passing custom levels as follows:

const winstonLogger = createLogger({
  ...
  levels: { error: 0, warn: 1, info: 2, debug: 3, trace: 4 },
  ...
});

Describe the solution you'd like trace function is added in Logger interface

I've verified that it works in most popular loggers in JavaScript:

Code
import { createLogger, format, transports } from "winston";
import logLevelLogger from "loglevel";
import { getLogger } from "log4js";
import * as getPinoLogger from "pino";
import { createLogger as createBunyanLogger } from "bunyan";

const level = process.env.LOG_LEVEL || "info";

const { combine, prettyPrint } = format;
const winstonLogger = createLogger({
  levels: {
    error: 0,
    warn: 1,
    info: 2,
    debug: 3,
    trace: 4,
  },
  level,
  format: combine(prettyPrint()),
  transports: [new transports.Console()],
});

// @ts-expect-error Arg not assignable to parameter of type 'LogLevelDesc'
logLevelLogger.setLevel(level);

const log4jsLogger = getLogger();
log4jsLogger.level = level;

const pinoLogger = getPinoLogger({ level });

const bunyanLogger = createBunyanLogger({ name: "bunyan", level });

interface Logger {
  trace?(content: object): void;
  debug?(content: object): void;
  info?(content: object): void;
  warn?(content: object): void;
  error?(content: object): void;
}

const printLog = (logger: Logger, name: string) => {
  console.log(`\nLogger: ${name}`);
  const logMsg = (logger: Logger, str: string) => {
    if (logger[str]) {
      logger[str]({
        [str]: `${str} level message`,
      });
    }
  };
  ["trace", "debug", "info", "warn", "error"].forEach((operation) => {
    logMsg(logger, operation);
  });
};

printLog(winstonLogger, "winston");
printLog(logLevelLogger, "loglevel");
printLog(log4jsLogger, "log4js");
printLog(pinoLogger, "pino");
printLog(bunyanLogger, "bunyan");
printLog(console, "console");

Dependencies
  "dependencies": {
    "bunyan": "1.8.14",
    "log4js": "6.3.0",
    "loglevel": "1.7.0",
    "pino": "6.6.1",
    "winston": "3.3.3"
  },
  "devDependencies": {
    "@types/node": "14.10.1",
    "ts-node": "9.0.0",
    "typescript": "4.0.2"
  }
Output
Logger: winston
{ message: { trace: 'trace level message' }, level: 'trace' }
{ message: { debug: 'debug level message' }, level: 'debug' }
{ message: { info: 'info level message' }, level: 'info' }
{ message: { warn: 'warn level message' }, level: 'warn' }
{ message: { error: 'error level message' }, level: 'error' }

Logger: loglevel
Trace: { trace: 'trace level message' }
    at logMsg (/Users/trivikr/workspace/test-js-loggers/index.ts:45:18)
    at /Users/trivikr/workspace/test-js-loggers/index.ts:51:5
    at Array.forEach (<anonymous>)
    at printLog (/Users/trivikr/workspace/test-js-loggers/index.ts:50:47)
    at Object.<anonymous> (/Users/trivikr/workspace/test-js-loggers/index.ts:56:1)
    at Module._compile (internal/modules/cjs/loader.js:1075:30)
    at Module.m._compile (/Users/trivikr/workspace/test-js-loggers/node_modules/ts-node/src/index.ts:1043:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:1096:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/trivikr/workspace/test-js-loggers/node_modules/ts-node/src/index.ts:1046:12)
    at Module.load (internal/modules/cjs/loader.js:940:32)
{ debug: 'debug level message' }
{ info: 'info level message' }
{ warn: 'warn level message' }
{ error: 'error level message' }

Logger: log4js
[2020-09-14T11:59:01.252] [TRACE] default - { trace: 'trace level message' }
[2020-09-14T11:59:01.254] [DEBUG] default - { debug: 'debug level message' }
[2020-09-14T11:59:01.254] [INFO] default - { info: 'info level message' }
[2020-09-14T11:59:01.254] [WARN] default - { warn: 'warn level message' }
[2020-09-14T11:59:01.254] [ERROR] default - { error: 'error level message' }

Logger: pino
{"level":10,"time":1600109941255,"pid":5242,"hostname":"186590ce2139","trace":"trace level message"}
{"level":20,"time":1600109941255,"pid":5242,"hostname":"186590ce2139","debug":"debug level message"}
{"level":30,"time":1600109941255,"pid":5242,"hostname":"186590ce2139","info":"info level message"}
{"level":40,"time":1600109941255,"pid":5242,"hostname":"186590ce2139","warn":"warn level message"}
{"level":50,"time":1600109941255,"pid":5242,"hostname":"186590ce2139","error":"error level message"}

Logger: bunyan
{"name":"bunyan","hostname":"186590ce2139","pid":5242,"level":10,"trace":"trace level message","msg":"","time":"2020-09-14T18:59:01.256Z","v":0}
{"name":"bunyan","hostname":"186590ce2139","pid":5242,"level":20,"debug":"debug level message","msg":"","time":"2020-09-14T18:59:01.256Z","v":0}
{"name":"bunyan","hostname":"186590ce2139","pid":5242,"level":30,"info":"info level message","msg":"","time":"2020-09-14T18:59:01.256Z","v":0}
{"name":"bunyan","hostname":"186590ce2139","pid":5242,"level":40,"warn":"warn level message","msg":"","time":"2020-09-14T18:59:01.256Z","v":0}
{"name":"bunyan","hostname":"186590ce2139","pid":5242,"level":50,"error":"error level message","msg":"","time":"2020-09-14T18:59:01.256Z","v":0}

Logger: console
Trace: { trace: 'trace level message' }
    at logMsg (/Users/trivikr/workspace/test-js-loggers/index.ts:45:18)
    at /Users/trivikr/workspace/test-js-loggers/index.ts:51:5
    at Array.forEach (<anonymous>)
    at printLog (/Users/trivikr/workspace/test-js-loggers/index.ts:50:47)
    at Object.<anonymous> (/Users/trivikr/workspace/test-js-loggers/index.ts:60:1)
    at Module._compile (internal/modules/cjs/loader.js:1075:30)
    at Module.m._compile (/Users/trivikr/workspace/test-js-loggers/node_modules/ts-node/src/index.ts:1043:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:1096:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/trivikr/workspace/test-js-loggers/node_modules/ts-node/src/index.ts:1046:12)
    at Module.load (internal/modules/cjs/loader.js:940:32)
{ debug: 'debug level message' }
{ info: 'info level message' }
{ warn: 'warn level message' }
{ error: 'error level message' }

Describe alternatives you've considered Use debug function for printing trace level information

trivikr avatar Sep 14 '20 19:09 trivikr

Greetings! We’re closing this issue because it has been open a long time and hasn’t been updated in a while and may not be getting the attention it deserves. We encourage you to check if this is still an issue in the latest release and if you find that this is still a problem, please feel free to comment or open a new issue.

github-actions[bot] avatar Sep 15 '21 00:09 github-actions[bot]

Greetings! We’re closing this issue because it has been open a long time and hasn’t been updated in a while and may not be getting the attention it deserves. We encourage you to check if this is still an issue in the latest release and if you find that this is still a problem, please feel free to comment or open a new issue.

github-actions[bot] avatar Sep 16 '22 00:09 github-actions[bot]