diff --git a/packages/api/src/config/index.ts b/packages/api/src/config/index.ts index 2bf39a092ad312bec5f2955d6e16d92988a871d4..b07b608ecf07b484ae640ff353900dc028496e68 100644 --- a/packages/api/src/config/index.ts +++ b/packages/api/src/config/index.ts @@ -14,6 +14,8 @@ const JWT_ALGORITHMS = ['HS256', 'HS384', 'HS512', 'RS256', 'RS384', 'RS512', 'E const httpsProxyValidator = z.string().url().optional().transform(urlToSplit) +const logLevelValidator = z.enum(['DEBUG', 'INFO', 'WARNING', 'ERROR']) +export type LogLevel = z.infer<typeof logLevelValidator> const configValidator = caminoConfigValidator.extend({ API_HOST: z.string(), KEYCLOAK_API_CLIENT_ID: z.string(), @@ -47,6 +49,7 @@ const configValidator = caminoConfigValidator.extend({ API_MAILJET_SECRET: z.string(), API_MAILJET_CONTACTS_LIST_ID: z.coerce.number(), API_MAILJET_EXPLOITANTS_GUYANE_LIST_ID: z.coerce.number(), + LOG_LEVEL: logLevelValidator.default('INFO'), HTTPS_PROXY: httpsProxyValidator, }) diff --git a/packages/api/src/config/logger.test.ts b/packages/api/src/config/logger.test.ts deleted file mode 100644 index 5a8535676eb15d3797dd64bdb18afc21d60a2b5d..0000000000000000000000000000000000000000 --- a/packages/api/src/config/logger.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { newDateFormated } from './logger' -import { test, expect } from 'vitest' -test('newDateFormated', () => { - expect(newDateFormated(new Date('2020-06-02T13:35:11.366Z'))).toMatchInlineSnapshot(`"2020-06-02 13:35:11"`) - expect(newDateFormated(new Date('2020-06-02T01:02:03.123Z'))).toMatchInlineSnapshot(`"2020-06-02 01:02:03"`) -}) diff --git a/packages/api/src/config/logger.ts b/packages/api/src/config/logger.ts index 54eb4bf390c7256a75a8c9bfa70979cea06a268f..2ceea8ffed9bbf1bee622f89a98e43abd3424b34 100644 --- a/packages/api/src/config/logger.ts +++ b/packages/api/src/config/logger.ts @@ -1,8 +1,10 @@ /* eslint no-console: 0 */ +import { exhaustiveCheck } from 'camino-common/src/typescript-tools' +import { LogLevel } from '.' + const numberToDoubleCharString = (param: number): string => param.toString(10).padStart(2, '0') -// TODO 2022-07-13: move to common? -export const newDateFormated = (date = new Date()): string => { +const newDateFormated = (date = new Date()): string => { const year = date.getFullYear() const month = numberToDoubleCharString(date.getMonth() + 1) const day = numberToDoubleCharString(date.getDate()) @@ -13,10 +15,27 @@ export const newDateFormated = (date = new Date()): string => { return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds } -export const consoleOverride = (color = true) => { - console.info = (...args) => console.log(newDateFormated(), color ? ' [\x1b[32minfo\x1b[0m]' : ' [info]', ...args) - console.warn = (...args) => console.log(newDateFormated(), color ? ' [\x1b[33mwarn\x1b[0m]' : ' [warn]', ...args) - console.error = (...args) => console.log(newDateFormated(), color ? '[\x1b[31merror\x1b[0m]' : '[error]', ...args) - // TODO 2022-07-13 Not used in the application... - console.debug = (...args) => console.log(newDateFormated(), color ? '[\x1b[36mdebug\x1b[0m]' : '[debug]', ...args) +export const consoleOverride = (logLevel: LogLevel, color = true): void => { + console.info = () => {} + console.warn = () => {} + console.error = () => {} + console.debug = () => {} + + switch (logLevel) { + // @ts-ignore fallthrough + case 'DEBUG': + console.debug = (...args) => console.log(newDateFormated(), color ? '[\x1b[36mdebug\x1b[0m]' : '[debug]', ...args) + // @ts-ignore fallthrough + case 'INFO': + console.info = (...args) => console.log(newDateFormated(), color ? ' [\x1b[32minfo\x1b[0m]' : ' [info]', ...args) + // @ts-ignore fallthrough + case 'WARNING': + console.warn = (...args) => console.log(newDateFormated(), color ? ' [\x1b[33mwarn\x1b[0m]' : ' [warn]', ...args) + // @ts-ignore fallthrough + case 'ERROR': + console.error = (...args) => console.log(newDateFormated(), color ? '[\x1b[31merror\x1b[0m]' : '[error]', ...args) + break + default: + exhaustiveCheck(logLevel) + } } diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 70a1db7987e567c896ac935d1bb79a6c14553e09..e35f8915eae12dd74c8bbabe7070d38babcca647 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -45,7 +45,7 @@ const pool = new pg.Pool({ idleTimeoutMillis: 60000, }) -consoleOverride() +consoleOverride(config().LOG_LEVEL) filesInit() databaseInit(pool) .then(() => { diff --git a/packages/api/src/scripts/daily.ts b/packages/api/src/scripts/daily.ts index 7205d8dd04e060ece0b61ead719f58639d01d9c8..de39d4b1298b375456b04fa7fe98b81b5871634f 100644 --- a/packages/api/src/scripts/daily.ts +++ b/packages/api/src/scripts/daily.ts @@ -19,7 +19,7 @@ if (isNotNullNorUndefined(config().CAMINO_STAGE)) { const logger = new Console.Console({ stdout: output, stderr: output }) // eslint-disable-next-line no-console console.log = logger.log - consoleOverride(false) + consoleOverride(config().LOG_LEVEL, false) } // Le pool ne doit ĂȘtre qu'aux entrypoints : le daily, le monthly, et l'application. diff --git a/packages/api/src/scripts/monthly.ts b/packages/api/src/scripts/monthly.ts index 7c4a148594f55a74f670276c485479f1a16166fc..8e8fba9cbe07d15e5df7757dcb73f37c68a14997 100644 --- a/packages/api/src/scripts/monthly.ts +++ b/packages/api/src/scripts/monthly.ts @@ -27,7 +27,7 @@ if (isNotNullNorUndefined(config().CAMINO_STAGE)) { const logger = new Console.Console({ stdout: output, stderr: output }) // eslint-disable-next-line no-console console.log = logger.log - consoleOverride(false) + consoleOverride(config().LOG_LEVEL, false) } const tasks = async () => {