From 7ddfaa483b961f93e02e19bcc8fa35cdc24a9ace Mon Sep 17 00:00:00 2001 From: Xevion Date: Tue, 5 Sep 2023 10:32:23 -0500 Subject: [PATCH] Setup winston logger + loki transport --- src/env/schema.mjs | 6 +++++- src/env/server.mjs | 6 +++++- src/logger.ts | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/logger.ts diff --git a/src/env/schema.mjs b/src/env/schema.mjs index 316fe1b..bfcac36 100644 --- a/src/env/schema.mjs +++ b/src/env/schema.mjs @@ -9,6 +9,7 @@ const TimezoneSchema = z.enum(Intl.supportedValuesOf("timeZone")); * This way you can ensure the app isn't built with invalid env vars. */ export const serverSchema = z.object({ + NODE_ENV: z.string(), API_KEY: z.string(), CRONITOR_ACCOUNT_ID: z.string(), CRONITOR_JOB_ID: z.string(), @@ -21,5 +22,8 @@ export const serverSchema = z.object({ REDIS_URL: z.string().url(), DISCORD_TOKEN: z.string(), DISCORD_TARGET_USER_ID: z.string(), - TIMEZONE: TimezoneSchema + TIMEZONE: TimezoneSchema, + LOKI_HOST: z.string().url(), + LOKI_USERNAME: z.string(), + LOKI_PASSWORD: z.string(), }); diff --git a/src/env/server.mjs b/src/env/server.mjs index 2dfac97..9d59b95 100644 --- a/src/env/server.mjs +++ b/src/env/server.mjs @@ -7,6 +7,7 @@ import { serverSchema } from './schema.mjs'; import { formatErrors } from './util.mjs'; const _serverEnv = serverSchema.safeParse({ + NODE_ENV: process.env.NODE_ENV, API_KEY: process.env.API_KEY, CRONITOR_ACCOUNT_ID: process.env.CRONITOR_ACCOUNT_ID, CRONITOR_JOB_ID: process.env.CRONITOR_JOB_ID, @@ -19,7 +20,10 @@ const _serverEnv = serverSchema.safeParse({ REDIS_URL: process.env.REDIS_URL, DISCORD_TOKEN: process.env.DISCORD_TOKEN, DISCORD_TARGET_USER_ID: process.env.DISCORD_TARGET_USER_ID, - TIMEZONE: process.env.TIMEZONE + TIMEZONE: process.env.TIMEZONE, + LOKI_HOST: process.env.LOKI_HOST, + LOKI_USERNAME: process.env.LOKI_USERNAME, + LOKI_PASSWORD: process.env.LOKI_PASSWORD, }); if (_serverEnv.success === false) { diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..923087f --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,47 @@ +import { createLogger, format, type Logger, transports } from 'winston'; +import LokiTransport from 'winston-loki'; +import { env } from '@/env/server.mjs'; + +const logger: Logger = createLogger({ + level: 'debug', + format: format.combine( + format.timestamp({ + format: 'YYYY-MM-DD HH:mm:ss' + }), + format.errors({ stack: true }), + format.splat(), + format.json() + ), + defaultMeta: { service: 'api' }, + transports: [ + new LokiTransport({ + level: 'debug', + json: true, + host: env.LOKI_HOST, + basicAuth: `${env.LOKI_USERNAME}:${env.LOKI_PASSWORD}`, + labels: { service: 'bus-reminder', environment: env.NODE_ENV } + }), + new transports.Console({ + format: format.combine( + format.colorize(), + format.printf( + ({ level, message, timestamp, stack }) => + `${timestamp} ${level}: ${stack || message}` + ) + ) + }) + ], + exceptionHandlers: [ + new transports.Console({ + format: format.combine( + format.colorize(), + format.printf( + ({ level, message, timestamp, stack }) => + `${timestamp} ${level}: ${stack || message}` + ) + ) + }) + ] +}); + +export default logger;