Setup winston logger + loki transport

This commit is contained in:
2023-09-05 10:32:23 -05:00
parent 28735c7d5c
commit 7ddfaa483b
3 changed files with 57 additions and 2 deletions

6
src/env/schema.mjs vendored
View File

@@ -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(),
});

6
src/env/server.mjs vendored
View File

@@ -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) {

47
src/logger.ts Normal file
View File

@@ -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;