From b8edbb0a4f08ba64d546b678091acde4368d0b1e Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Mon, 28 Aug 2023 15:40:29 -0300 Subject: [PATCH] feat: Write debug-level log to local file in Sandbox --- yarn-project/archiver/src/index.ts | 2 +- yarn-project/aztec-sandbox/.gitignore | 1 + yarn-project/aztec-sandbox/docker-compose.yml | 5 +- yarn-project/aztec-sandbox/package.json | 4 +- yarn-project/aztec-sandbox/src/index.ts | 9 +- yarn-project/aztec-sandbox/src/logging.ts | 45 ++++ yarn-project/foundation/src/log/logger.ts | 23 +- yarn-project/yarn.lock | 230 +++++++++++++++++- 8 files changed, 308 insertions(+), 11 deletions(-) create mode 100644 yarn-project/aztec-sandbox/.gitignore create mode 100644 yarn-project/aztec-sandbox/src/logging.ts diff --git a/yarn-project/archiver/src/index.ts b/yarn-project/archiver/src/index.ts index 41aec9f4b57..65cb31dc34d 100644 --- a/yarn-project/archiver/src/index.ts +++ b/yarn-project/archiver/src/index.ts @@ -47,7 +47,7 @@ async function main() { if (process.argv[1] === fileURLToPath(import.meta.url).replace(/\/index\.js$/, '')) { // eslint-disable-next-line @typescript-eslint/no-floating-promises main().catch(err => { - log.fatal(err); + log.error(err); process.exit(1); }); } diff --git a/yarn-project/aztec-sandbox/.gitignore b/yarn-project/aztec-sandbox/.gitignore new file mode 100644 index 00000000000..31dbbff57c2 --- /dev/null +++ b/yarn-project/aztec-sandbox/.gitignore @@ -0,0 +1 @@ +/log diff --git a/yarn-project/aztec-sandbox/docker-compose.yml b/yarn-project/aztec-sandbox/docker-compose.yml index f368c80adae..abd49fab09d 100644 --- a/yarn-project/aztec-sandbox/docker-compose.yml +++ b/yarn-project/aztec-sandbox/docker-compose.yml @@ -11,7 +11,8 @@ services: ports: - '8080:8080' environment: - DEBUG: # DEBUG is loaded from the user shell running compose + DEBUG: # Loaded from the user shell if explicitly set + HOST_WORKDIR: '${PWD}' # Loaded from the user shell to show log files absolute path in host ETHEREUM_HOST: http://ethereum:8545 CHAIN_ID: 31337 ARCHIVER_POLLING_INTERVAL_MS: 50 @@ -20,3 +21,5 @@ services: WS_BLOCK_CHECK_INTERVAL_MS: 50 RPC_SERVER_BLOCK_POLLING_INTERVAL_MS: 50 ARCHIVER_VIEM_POLLING_INTERVAL_MS: 500 + volumes: + - ./log:/usr/src/yarn-project/aztec-sandbox/log:rw diff --git a/yarn-project/aztec-sandbox/package.json b/yarn-project/aztec-sandbox/package.json index 059da6ad785..e90eb9c5530 100644 --- a/yarn-project/aztec-sandbox/package.json +++ b/yarn-project/aztec-sandbox/package.json @@ -43,7 +43,9 @@ "abitype": "^0.8.11", "koa": "^2.14.2", "koa-router": "^12.0.0", - "viem": "^1.2.5" + "viem": "^1.2.5", + "winston": "^3.10.0", + "winston-daily-rotate-file": "^4.7.1" }, "files": [ "dest", diff --git a/yarn-project/aztec-sandbox/src/index.ts b/yarn-project/aztec-sandbox/src/index.ts index 6b90b3bcd63..239925808fa 100644 --- a/yarn-project/aztec-sandbox/src/index.ts +++ b/yarn-project/aztec-sandbox/src/index.ts @@ -11,6 +11,7 @@ import { HDAccount, createPublicClient, http as httpViemTransport } from 'viem'; import { mnemonicToAccount } from 'viem/accounts'; import { foundry } from 'viem/chains'; +import { setupFileDebugLog } from './logging.js'; import { startHttpRpcServer } from './server.js'; import { github, splash } from './splash.js'; @@ -57,6 +58,7 @@ async function waitThenDeploy(rpcUrl: string, hdAccount: HDAccount) { * Create and start a new Aztec RCP HTTP Server */ async function main() { + const logPath = setupFileDebugLog(); const aztecNodeConfig: AztecNodeConfig = getConfigEnvVars(); const rpcConfig = getRpcConfigEnvVars(); const hdAccount = mnemonicToAccount(MNEMONIC); @@ -87,7 +89,8 @@ async function main() { process.once('SIGTERM', shutdown); startHttpRpcServer(aztecRpcServer, deployedL1Contracts, SERVER_PORT); - logger.info(`Aztec JSON RPC listening on port ${SERVER_PORT}`); + logger.info(`Aztec Sandbox JSON-RPC Server listening on port ${SERVER_PORT}`); + logger.info(`Debug logs will be written to ${logPath}`); const accountStrings = [`Initial Accounts:\n\n`]; const registeredAccounts = await aztecRpcServer.getAccounts(); @@ -100,10 +103,10 @@ async function main() { accountStrings.push(` Public Key: ${completeAddress.publicKey.toString()}\n\n`); } } - logger.info(`${splash}\n${github}\n\n`.concat(...accountStrings).concat(`\nAztec Sandbox now ready for use!`)); + logger.info(`${splash}\n${github}\n\n`.concat(...accountStrings).concat(`Aztec Sandbox is now ready for use!`)); } main().catch(err => { - logger.fatal(err); + logger.error(err); process.exit(1); }); diff --git a/yarn-project/aztec-sandbox/src/logging.ts b/yarn-project/aztec-sandbox/src/logging.ts new file mode 100644 index 00000000000..3c270417e61 --- /dev/null +++ b/yarn-project/aztec-sandbox/src/logging.ts @@ -0,0 +1,45 @@ +import { onLog } from '@aztec/foundation/log'; + +import * as path from 'path'; +import * as process from 'process'; +import * as util from 'util'; +import * as winston from 'winston'; +import DailyRotateFile from 'winston-daily-rotate-file'; + +const { format } = winston; +const CURRENT_LOG_FILE_NAME = 'aztec-sandbox.debug.log'; +const LOG_DIR = 'log'; + +/** Creates a winston logger that logs everyting to a local rotating file */ +function createWinstonLogger() { + // See https://www.npmjs.com/package/winston-daily-rotate-file#user-content-options + const transport: DailyRotateFile = new DailyRotateFile({ + filename: 'aztec-sandbox-%DATE%.debug.log', + dirname: LOG_DIR, + datePattern: 'YYYY-MM-DD', + zippedArchive: true, + maxSize: '30m', + maxFiles: '5', + createSymlink: true, + symlinkName: CURRENT_LOG_FILE_NAME, + }); + + return winston.createLogger({ + level: 'debug', + transports: [transport], + format: format.combine(format.timestamp(), format.json()), + }); +} + +/** + * Hooks to all log statements and outputs them to a local rotating file. + * @returns Output log name. + */ +export function setupFileDebugLog() { + const logger = createWinstonLogger(); + onLog((level, namespace, args) => { + logger.log({ level, namespace, message: util.format(...args) }); + }); + const workdir = process.env.HOST_WORKDIR ?? process.cwd(); + return path.join(workdir, LOG_DIR, CURRENT_LOG_FILE_NAME); +} diff --git a/yarn-project/foundation/src/log/logger.ts b/yarn-project/foundation/src/log/logger.ts index 6df216eac16..4e1d0c0f06d 100644 --- a/yarn-project/foundation/src/log/logger.ts +++ b/yarn-project/foundation/src/log/logger.ts @@ -4,7 +4,8 @@ import { isatty } from 'tty'; import { LogFn } from './index.js'; -const LogLevels = ['silent', 'fatal', 'error', 'warn', 'info', 'debug'] as const; +// Matches a subset of Winston log levels +const LogLevels = ['silent', 'error', 'warn', 'info', 'verbose', 'debug'] as const; const DefaultLogLevel = 'info' as const; /** @@ -39,13 +40,26 @@ export function createDebugLogger(name: string): DebugLogger { const logger = { silent: () => {}, - fatal: (...args: any[]) => logWithDebug(debugLogger, 'fatal', args), error: (...args: any[]) => logWithDebug(debugLogger, 'error', args), warn: (...args: any[]) => logWithDebug(debugLogger, 'warn', args), info: (...args: any[]) => logWithDebug(debugLogger, 'info', args), + verbose: (...args: any[]) => logWithDebug(debugLogger, 'verbose', args), debug: (...args: any[]) => logWithDebug(debugLogger, 'debug', args), }; - return Object.assign(debugLogger, logger); + return Object.assign((...args: any[]) => logWithDebug(debugLogger, 'debug', args), logger); +} + +/** A callback to capture all logs. */ +export type LogHandler = (level: LogLevel, namespace: string, args: any[]) => void; + +const logHandlers: LogHandler[] = []; + +/** + * Registers a callback for all logs, whether they are emitted in the current log level or not. + * @param handler - Callback to be called on every log. + */ +export function onLog(handler: LogHandler) { + logHandlers.push(handler); } /** @@ -55,6 +69,9 @@ export function createDebugLogger(name: string): DebugLogger { * @param args - Args to log. */ function logWithDebug(debug: debug.Debugger, level: LogLevel, args: any[]) { + for (const handler of logHandlers) { + handler(level, debug.namespace, args); + } if (debug.enabled) { debug(args[0], ...args.slice(1)); } else if (LogLevels.indexOf(level) <= LogLevels.indexOf(currentLevel) && process.env.NODE_ENV !== 'test') { diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 01ffd54c2dd..dc693eb48dc 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -195,6 +195,8 @@ __metadata: ts-node: ^10.9.1 typescript: ^5.0.4 viem: ^1.2.5 + winston: ^3.10.0 + winston-daily-rotate-file: ^4.7.1 bin: aztec-sandbox: ./dest/index.js languageName: unknown @@ -1278,6 +1280,13 @@ __metadata: languageName: node linkType: hard +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -1287,6 +1296,17 @@ __metadata: languageName: node linkType: hard +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: 1.1.x + enabled: 2.0.x + kuler: ^2.0.0 + checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.5.0": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -3454,6 +3474,13 @@ __metadata: languageName: node linkType: hard +"@types/triple-beam@npm:^1.3.2": + version: 1.3.2 + resolution: "@types/triple-beam@npm:1.3.2" + checksum: dd7b4a563fb710abc992e5d59eac481bed9e303fada2e276e37b00be31c392e03300ee468e57761e616512872e77935f92472877d0704a19688d15a726cee17b + languageName: node + linkType: hard + "@types/ws@npm:^8.5.4": version: 8.5.5 resolution: "@types/ws@npm:8.5.5" @@ -4226,6 +4253,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.3": + version: 3.2.4 + resolution: "async@npm:3.2.4" + checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -4819,7 +4853,7 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": +"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -4844,13 +4878,23 @@ __metadata: languageName: node linkType: hard -"color-name@npm:~1.1.4": +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: ^1.0.0 + simple-swizzle: ^0.2.2 + checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 + languageName: node + linkType: hard + "color-support@npm:^1.1.3": version: 1.1.3 resolution: "color-support@npm:1.1.3" @@ -4860,6 +4904,16 @@ __metadata: languageName: node linkType: hard +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: ^1.9.3 + color-string: ^1.6.0 + checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 + languageName: node + linkType: hard + "colorette@npm:^2.0.14": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -4867,6 +4921,16 @@ __metadata: languageName: node linkType: hard +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: ^3.1.3 + text-hex: 1.0.x + checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 + languageName: node + linkType: hard + "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -5581,6 +5645,13 @@ __metadata: languageName: node linkType: hard +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 + languageName: node + linkType: hard + "encodeurl@npm:^1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -6320,6 +6391,13 @@ __metadata: languageName: node linkType: hard +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -6329,6 +6407,15 @@ __metadata: languageName: node linkType: hard +"file-stream-rotator@npm:^0.6.1": + version: 0.6.1 + resolution: "file-stream-rotator@npm:0.6.1" + dependencies: + moment: ^2.29.1 + checksum: ebdf6a9e7ca886a50f4dafb2284d4569cefd5bdf4e4451ead25f4d68b7f9776b2620a3d110d534edd40935d1e17f37d818e2129303201870ff89c71b19b49ac1 + languageName: node + linkType: hard + "fill-range@npm:^7.0.1": version: 7.0.1 resolution: "fill-range@npm:7.0.1" @@ -6375,6 +6462,13 @@ __metadata: languageName: node linkType: hard +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -7229,6 +7323,13 @@ __metadata: languageName: node linkType: hard +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -8555,6 +8656,13 @@ __metadata: languageName: node linkType: hard +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 + languageName: node + linkType: hard + "level-concat-iterator@npm:^3.0.0": version: 3.1.0 resolution: "level-concat-iterator@npm:3.1.0" @@ -8869,6 +8977,20 @@ __metadata: languageName: node linkType: hard +"logform@npm:^2.3.2, logform@npm:^2.4.0": + version: 2.5.1 + resolution: "logform@npm:2.5.1" + dependencies: + "@colors/colors": 1.5.0 + "@types/triple-beam": ^1.3.2 + fecha: ^4.2.0 + ms: ^2.1.1 + safe-stable-stringify: ^2.3.1 + triple-beam: ^1.3.0 + checksum: 08fdf03be5bb69af33bac214eb4f6a0c83ad3821a30de498925fccb61e993e5a4a87470aab356ca2110c11e4643685bed5597ca5f46dd1cd11437c44a0e0e3c2 + languageName: node + linkType: hard + "long@npm:^5.0.0": version: 5.2.3 resolution: "long@npm:5.2.3" @@ -9322,6 +9444,13 @@ __metadata: languageName: node linkType: hard +"moment@npm:^2.29.1": + version: 2.29.4 + resolution: "moment@npm:2.29.4" + checksum: 0ec3f9c2bcba38dc2451b1daed5daded747f17610b92427bebe1d08d48d8b7bdd8d9197500b072d14e326dd0ccf3e326b9e3d07c5895d3d49e39b6803b76e80e + languageName: node + linkType: hard + "mortice@npm:^3.0.1": version: 3.0.1 resolution: "mortice@npm:3.0.1" @@ -9565,6 +9694,13 @@ __metadata: languageName: node linkType: hard +"object-hash@npm:^2.0.1": + version: 2.2.0 + resolution: "object-hash@npm:2.2.0" + checksum: 55ba841e3adce9c4f1b9b46b41983eda40f854e0d01af2802d3ae18a7085a17168d6b81731d43fdf1d6bcbb3c9f9c56d22c8fea992203ad90a38d7d919bc28f1 + languageName: node + linkType: hard + "object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": version: 1.12.3 resolution: "object-inspect@npm:1.12.3" @@ -9650,6 +9786,15 @@ __metadata: languageName: node linkType: hard +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: 1.x.x + checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d + languageName: node + linkType: hard + "onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" @@ -10648,6 +10793,13 @@ __metadata: languageName: node linkType: hard +"safe-stable-stringify@npm:^2.3.1": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -10850,6 +11002,15 @@ __metadata: languageName: node linkType: hard +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: ^0.3.1 + checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 + languageName: node + linkType: hard + "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -11017,6 +11178,13 @@ __metadata: languageName: node linkType: hard +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 + languageName: node + linkType: hard + "stack-utils@npm:^2.0.3": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -11390,6 +11558,13 @@ __metadata: languageName: node linkType: hard +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -11471,6 +11646,13 @@ __metadata: languageName: node linkType: hard +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 + languageName: node + linkType: hard + "truncate-utf8-bytes@npm:^1.0.0": version: 1.0.2 resolution: "truncate-utf8-bytes@npm:1.0.2" @@ -12298,6 +12480,50 @@ __metadata: languageName: node linkType: hard +"winston-daily-rotate-file@npm:^4.7.1": + version: 4.7.1 + resolution: "winston-daily-rotate-file@npm:4.7.1" + dependencies: + file-stream-rotator: ^0.6.1 + object-hash: ^2.0.1 + triple-beam: ^1.3.0 + winston-transport: ^4.4.0 + peerDependencies: + winston: ^3 + checksum: 227daea41f722caa017fc7d6f1f80d0e6c428491e57693e6bebc8312b85bcf3aace53cb3a925bda72fab59a6898fa127411d29348ec4b295e2263a7544cda611 + languageName: node + linkType: hard + +"winston-transport@npm:^4.4.0, winston-transport@npm:^4.5.0": + version: 4.5.0 + resolution: "winston-transport@npm:4.5.0" + dependencies: + logform: ^2.3.2 + readable-stream: ^3.6.0 + triple-beam: ^1.3.0 + checksum: a56e5678a80b88a73e77ed998fc6e19d0db19c989a356b137ec236782f2bf58ae4511b11c29163f99391fa4dc12102c7bc5738dcb6543f28877fa2819adc3ee9 + languageName: node + linkType: hard + +"winston@npm:^3.10.0": + version: 3.10.0 + resolution: "winston@npm:3.10.0" + dependencies: + "@colors/colors": 1.5.0 + "@dabh/diagnostics": ^2.0.2 + async: ^3.2.3 + is-stream: ^2.0.0 + logform: ^2.4.0 + one-time: ^1.0.0 + readable-stream: ^3.4.0 + safe-stable-stringify: ^2.3.1 + stack-trace: 0.0.x + triple-beam: ^1.3.0 + winston-transport: ^4.5.0 + checksum: 47df0361220d12b46d1b3c98a1c380a3718321739d527a182ce7984fc20715e5b0b55db0bcd3fd076d1b1d3261903b890b053851cfd4bc028bda7951fa8ca2e0 + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0"