feat(SW-3560): send parameters to sentry logs * feat(SW-3560): send parameters to sentry logs * Use flatten instead of sanitize when logging Approved-by: Joakim Jäderberg
86 lines
2.2 KiB
TypeScript
86 lines
2.2 KiB
TypeScript
import * as Sentry from "@sentry/nextjs"
|
|
import { flatten } from "flat"
|
|
|
|
const logLevels = ["debug", "info", "warn", "error"] as const
|
|
const minimumLogLevel = (() => {
|
|
const configuredMinimumLogLevel = (
|
|
(process.env.MINIMUM_LOG_LEVEL ||
|
|
process.env.NEXT_PUBLIC_MINIMUM_LOG_LEVEL) ??
|
|
"info"
|
|
).toLowerCase() as (typeof logLevels)[number]
|
|
|
|
if (!logLevels.includes(configuredMinimumLogLevel)) {
|
|
console.warn(
|
|
`Invalid log level configured: ${configuredMinimumLogLevel}, defaulting to 'info'`
|
|
)
|
|
|
|
return "info"
|
|
}
|
|
|
|
return configuredMinimumLogLevel
|
|
})()
|
|
|
|
function shouldLog(level: (typeof logLevels)[number]) {
|
|
return logLevels.indexOf(level) >= logLevels.indexOf(minimumLogLevel)
|
|
}
|
|
|
|
function getLogValue(args: unknown[]): Record<string, unknown> | undefined {
|
|
if (!args || args.length === 0) {
|
|
return undefined
|
|
}
|
|
if (args.length === 1 && typeof args[0] === "object") {
|
|
return (args[0] as Record<string, unknown>) ?? undefined
|
|
}
|
|
if (args.length === 1) {
|
|
return { value: args[0] }
|
|
}
|
|
return flatten(args)
|
|
}
|
|
|
|
export function createLogger(loggerPrefix: string | (() => Promise<string>)) {
|
|
const asyncWrapper: () => Promise<string> =
|
|
typeof loggerPrefix === "string" ? async () => loggerPrefix : loggerPrefix
|
|
|
|
const getLoggerPrefix = async () => {
|
|
const prefix = await asyncWrapper()
|
|
if (!prefix) {
|
|
return ""
|
|
}
|
|
|
|
return `[${prefix}]`
|
|
}
|
|
|
|
async function log(
|
|
level: (typeof logLevels)[number],
|
|
message: string,
|
|
...args: unknown[]
|
|
) {
|
|
if (!shouldLog(level)) {
|
|
return
|
|
}
|
|
|
|
const logValue = getLogValue(args)
|
|
|
|
Sentry.logger[level](
|
|
`${await getLoggerPrefix()} ${message}`.trim(),
|
|
logValue
|
|
)
|
|
console[level](`${await getLoggerPrefix()} ${message}`.trim(), ...args)
|
|
}
|
|
|
|
return {
|
|
async debug(message: string, ...args: unknown[]): Promise<void> {
|
|
await log("debug", message, ...args)
|
|
},
|
|
async info(message: string, ...args: unknown[]): Promise<void> {
|
|
await log("info", message, ...args)
|
|
},
|
|
async warn(message: string, ...args: unknown[]): Promise<void> {
|
|
await log("warn", message, ...args)
|
|
},
|
|
async error(message: string, ...args: unknown[]): Promise<void> {
|
|
await log("error", message, ...args)
|
|
},
|
|
}
|
|
}
|