From 8c493bd1ac91f33aab914b98eb1d081aa5ed0b76 Mon Sep 17 00:00:00 2001 From: Abdurrehman Subhani Date: Mon, 11 Nov 2024 15:10:28 +0500 Subject: [PATCH 1/5] display log file path to console in case of execption --- packages/usdk/cli.js | 4 +++- packages/usdk/util/logger/logger-winston.mjs | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/usdk/cli.js b/packages/usdk/cli.js index 425b3bc03..cb74b1e04 100644 --- a/packages/usdk/cli.js +++ b/packages/usdk/cli.js @@ -1373,7 +1373,8 @@ const handleError = async (fn) => { return await fn(); } catch (err) { console.warn(err.stack); - process.exit(1); + console.log("A complete log of this run can be found in: \n", logger.getLogFilePath()); + // process.exit(1); } }; export const main = async () => { @@ -1399,6 +1400,7 @@ export const main = async () => { await handleError(async () => { commandExecuted = true; console.log(pc.cyan(ver)); + throw new Error('done'); }); }); /* program diff --git a/packages/usdk/util/logger/logger-winston.mjs b/packages/usdk/util/logger/logger-winston.mjs index be1f2356f..2b49df5e1 100644 --- a/packages/usdk/util/logger/logger-winston.mjs +++ b/packages/usdk/util/logger/logger-winston.mjs @@ -8,7 +8,7 @@ class WinstonLogger extends Logger { super(); const currentDateTime = new Date().toISOString().replace(/[:.]/g, '-'); const currentModuleDir = getLogDirectory(); - const logFilePath = path.join(currentModuleDir, `log-${currentDateTime}.log`); + this.logFilePath = path.join(currentModuleDir, `log-${currentDateTime}.log`); this.logger = winston.createLogger({ level: 'error', @@ -19,7 +19,7 @@ class WinstonLogger extends Logger { }) ), transports: [ - new winston.transports.File({ filename: logFilePath, name: 'error-file', level: 'info'}), + new winston.transports.File({ filename: this.logFilePath, name: 'error-file', level: 'info'}), new winston.transports.Console() ] }); @@ -38,6 +38,10 @@ class WinstonLogger extends Logger { error(...args) { this.logger.error(...args); } + + getLogFilePath() { + return this.logFilePath; + } } export default WinstonLogger; \ No newline at end of file From 45230bbdb73fe9fe51f12f4aad3885c43f7fb044 Mon Sep 17 00:00:00 2001 From: Abdurrehman Subhani Date: Mon, 11 Nov 2024 15:30:07 +0500 Subject: [PATCH 2/5] remove debugging exception throw --- packages/usdk/cli.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/usdk/cli.js b/packages/usdk/cli.js index cb74b1e04..a904cd7e8 100644 --- a/packages/usdk/cli.js +++ b/packages/usdk/cli.js @@ -1400,7 +1400,6 @@ export const main = async () => { await handleError(async () => { commandExecuted = true; console.log(pc.cyan(ver)); - throw new Error('done'); }); }); /* program From 4a9dec4818a486c9a0c0fcc76d24c834828a3f1c Mon Sep 17 00:00:00 2001 From: Abdurrehman Subhani Date: Mon, 11 Nov 2024 16:35:14 +0500 Subject: [PATCH 3/5] add pino logger for reliable file transport logging --- packages/usdk/cli.js | 9 +++ packages/usdk/package.json | 2 + packages/usdk/usdk.js | 8 --- packages/usdk/util/logger/logger-factory.mjs | 3 +- packages/usdk/util/logger/logger-pino.mjs | 73 ++++++++++++++++++++ 5 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 packages/usdk/util/logger/logger-pino.mjs diff --git a/packages/usdk/cli.js b/packages/usdk/cli.js index a904cd7e8..564766943 100644 --- a/packages/usdk/cli.js +++ b/packages/usdk/cli.js @@ -116,6 +116,15 @@ const logger = LoggerFactory.getLogger(); }; }); +// Set up global error handling +['uncaughtException', 'unhandledRejection'].forEach(event => + process.on(event, (err, err2) => { + console.error('cli uncaught exception', err, err2); + process.exit(1); + }) +); + + // const makeSupabase = (jwt) => makeAnonymousClient(env, jwt); diff --git a/packages/usdk/package.json b/packages/usdk/package.json index 168256bdd..af9af3a30 100644 --- a/packages/usdk/package.json +++ b/packages/usdk/package.json @@ -72,6 +72,8 @@ "openai": "^4.56.0", "ora": "^8.1.1", "picocolors": "^1.0.1", + "pino": "^9.5.0", + "pino-pretty": "^13.0.0", "pretty-bytes": "^6.1.1", "queue-manager": "file:./packages/upstreet-agent/packages/queue-manager", "react-agents-wrangler": "file:./packages/upstreet-agent/packages/react-agents-wrangler", diff --git a/packages/usdk/usdk.js b/packages/usdk/usdk.js index c76214c27..f652e4451 100755 --- a/packages/usdk/usdk.js +++ b/packages/usdk/usdk.js @@ -1,14 +1,6 @@ #!/usr/bin/env -S node --no-warnings --experimental-wasm-modules import { main } from './cli.js'; -// Set up global error handling -['uncaughtException', 'unhandledRejection'].forEach(event => - process.on(event, (err, err2) => { - console.log('cli uncaught exception', err, err2); - process.exit(1); - }) -); - // Execute CLI (async () => { try { diff --git a/packages/usdk/util/logger/logger-factory.mjs b/packages/usdk/util/logger/logger-factory.mjs index 455037e31..55064cc58 100644 --- a/packages/usdk/util/logger/logger-factory.mjs +++ b/packages/usdk/util/logger/logger-factory.mjs @@ -1,9 +1,10 @@ +import PinoLogger from "./logger-pino.mjs"; import WinstonLogger from "./logger-winston.mjs"; class LoggerFactory { static getLogger() { - return new WinstonLogger(); + return new PinoLogger(); } } diff --git a/packages/usdk/util/logger/logger-pino.mjs b/packages/usdk/util/logger/logger-pino.mjs new file mode 100644 index 000000000..54aed9321 --- /dev/null +++ b/packages/usdk/util/logger/logger-pino.mjs @@ -0,0 +1,73 @@ +// pino-logger.mjs +import pino from 'pino'; +import { getLogDirectory } from '../path/index.mjs'; +import path from 'path'; +import { Logger } from './logger-interface.mjs'; + + +class PinoLogger extends Logger{ + static instance = null; + + constructor() { + super(); + if (PinoLogger.instance) { + return PinoLogger.instance; + } + const currentDateTime = new Date().toISOString().replace(/[:.]/g, '-'); + const currentModuleDir = getLogDirectory(); + this.logFilePath = path.join(currentModuleDir, `log-${currentDateTime}.log`); + + const transport = pino.transport({ + targets: [ + { + target: 'pino/file', + options: { + destination: this.logFilePath, + } + }, + ] + }); + + this.logger = pino({ + level: process.env.LOG_LEVEL || 'info', + timestamp: pino.stdTimeFunctions.isoTime, + formatters: { + level: (label) => { + return { level: label.toUpperCase() }; + } + } + }, transport); + + PinoLogger.instance = this; + } + + info(message, ...args) { + this.logger.info(message, ...args); + } + + error(message, error = null) { + if (error) { + this.logger.error({ err: error }, message); + } else { + this.logger.error(message); + } + } + + warn(message, ...args) { + this.logger.warn(message, ...args); + } + + debug(message, ...args) { + this.logger.debug(message, ...args); + } + + getChildLogger(bindings) { + return this.logger.child(bindings); + } + + getLogFilePath() { + return this.logFilePath; + } +} + +export default PinoLogger; \ No newline at end of file From 80d49d3ecd85cb0202b6b211f49cfaaedfea6def Mon Sep 17 00:00:00 2001 From: Abdurrehman Subhani Date: Mon, 11 Nov 2024 16:57:21 +0500 Subject: [PATCH 4/5] add log file path to uncaughtExceptions and unhandledRejections --- packages/usdk/cli.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/usdk/cli.js b/packages/usdk/cli.js index 564766943..f3cd8e0c8 100644 --- a/packages/usdk/cli.js +++ b/packages/usdk/cli.js @@ -120,6 +120,7 @@ const logger = LoggerFactory.getLogger(); ['uncaughtException', 'unhandledRejection'].forEach(event => process.on(event, (err, err2) => { console.error('cli uncaught exception', err, err2); + console.log("A complete log of this run can be found in: \n", logger.getLogFilePath()); process.exit(1); }) ); From 2b716a263b28d588b11d70da585686a275b98b3b Mon Sep 17 00:00:00 2001 From: Abdurrehman Subhani Date: Mon, 11 Nov 2024 17:16:33 +0500 Subject: [PATCH 5/5] improve error file log readability --- packages/usdk/util/logger/logger-pino.mjs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/usdk/util/logger/logger-pino.mjs b/packages/usdk/util/logger/logger-pino.mjs index 54aed9321..2506f8887 100644 --- a/packages/usdk/util/logger/logger-pino.mjs +++ b/packages/usdk/util/logger/logger-pino.mjs @@ -20,12 +20,16 @@ class PinoLogger extends Logger{ const transport = pino.transport({ targets: [ { - target: 'pino/file', + target: 'pino-pretty', options: { destination: this.logFilePath, + colorize: false, + translateTime: 'SYS:standard', + ignore: 'pid,hostname', + singleLine: false, } - }, - ] + } + ], }); this.logger = pino({ @@ -35,9 +39,8 @@ class PinoLogger extends Logger{ level: (label) => { return { level: label.toUpperCase() }; } - } + }, }, transport); - PinoLogger.instance = this; }