aws-sdk-js-v3
aws-sdk-js-v3 copied to clipboard
Add trace function in Logger
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
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.
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.