/**
* Simple logger that writes to stderr (stdout is reserved for MCP protocol)
*/
type LogLevel = "debug" | "info" | "warn" | "error";
const LOG_LEVELS: Record<LogLevel, number> = {
debug: 0,
info: 1,
warn: 2,
error: 3,
};
// Default log level from environment variable
const currentLevel: LogLevel = (process.env.BIRST_LOG_LEVEL as LogLevel) || "info";
function shouldLog(level: LogLevel): boolean {
return LOG_LEVELS[level] >= LOG_LEVELS[currentLevel];
}
function formatMessage(level: LogLevel, message: string, data?: unknown): string {
const timestamp = new Date().toISOString();
const prefix = `[${timestamp}] [${level.toUpperCase()}]`;
if (data !== undefined) {
const dataStr = typeof data === "object"
? JSON.stringify(data, null, 2)
: String(data);
return `${prefix} ${message}\n${dataStr}`;
}
return `${prefix} ${message}`;
}
export const logger = {
debug(message: string, data?: unknown): void {
if (shouldLog("debug")) {
console.error(formatMessage("debug", message, data));
}
},
info(message: string, data?: unknown): void {
if (shouldLog("info")) {
console.error(formatMessage("info", message, data));
}
},
warn(message: string, data?: unknown): void {
if (shouldLog("warn")) {
console.error(formatMessage("warn", message, data));
}
},
error(message: string, data?: unknown): void {
if (shouldLog("error")) {
console.error(formatMessage("error", message, data));
}
},
};