mirror of
https://github.com/Xevion/bus-reminder.git
synced 2025-12-07 03:14:35 -06:00
Setup winston logger + loki transport
This commit is contained in:
6
src/env/schema.mjs
vendored
6
src/env/schema.mjs
vendored
@@ -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.
|
* This way you can ensure the app isn't built with invalid env vars.
|
||||||
*/
|
*/
|
||||||
export const serverSchema = z.object({
|
export const serverSchema = z.object({
|
||||||
|
NODE_ENV: z.string(),
|
||||||
API_KEY: z.string(),
|
API_KEY: z.string(),
|
||||||
CRONITOR_ACCOUNT_ID: z.string(),
|
CRONITOR_ACCOUNT_ID: z.string(),
|
||||||
CRONITOR_JOB_ID: z.string(),
|
CRONITOR_JOB_ID: z.string(),
|
||||||
@@ -21,5 +22,8 @@ export const serverSchema = z.object({
|
|||||||
REDIS_URL: z.string().url(),
|
REDIS_URL: z.string().url(),
|
||||||
DISCORD_TOKEN: z.string(),
|
DISCORD_TOKEN: z.string(),
|
||||||
DISCORD_TARGET_USER_ID: 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
6
src/env/server.mjs
vendored
@@ -7,6 +7,7 @@ import { serverSchema } from './schema.mjs';
|
|||||||
import { formatErrors } from './util.mjs';
|
import { formatErrors } from './util.mjs';
|
||||||
|
|
||||||
const _serverEnv = serverSchema.safeParse({
|
const _serverEnv = serverSchema.safeParse({
|
||||||
|
NODE_ENV: process.env.NODE_ENV,
|
||||||
API_KEY: process.env.API_KEY,
|
API_KEY: process.env.API_KEY,
|
||||||
CRONITOR_ACCOUNT_ID: process.env.CRONITOR_ACCOUNT_ID,
|
CRONITOR_ACCOUNT_ID: process.env.CRONITOR_ACCOUNT_ID,
|
||||||
CRONITOR_JOB_ID: process.env.CRONITOR_JOB_ID,
|
CRONITOR_JOB_ID: process.env.CRONITOR_JOB_ID,
|
||||||
@@ -19,7 +20,10 @@ const _serverEnv = serverSchema.safeParse({
|
|||||||
REDIS_URL: process.env.REDIS_URL,
|
REDIS_URL: process.env.REDIS_URL,
|
||||||
DISCORD_TOKEN: process.env.DISCORD_TOKEN,
|
DISCORD_TOKEN: process.env.DISCORD_TOKEN,
|
||||||
DISCORD_TARGET_USER_ID: process.env.DISCORD_TARGET_USER_ID,
|
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) {
|
if (_serverEnv.success === false) {
|
||||||
|
|||||||
47
src/logger.ts
Normal file
47
src/logger.ts
Normal 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;
|
||||||
Reference in New Issue
Block a user