2025-08-30 18:22:31 +09:00
|
|
|
import pino from "pino";
|
|
|
|
|
|
|
|
|
|
// Single, simple Pino logger configuration
|
|
|
|
|
const isDev = process.env.NODE_ENV === "development";
|
|
|
|
|
const isBrowser = typeof window !== "undefined";
|
|
|
|
|
|
|
|
|
|
// Create one logger instance that works everywhere
|
|
|
|
|
export const logger = pino({
|
|
|
|
|
level: process.env.LOG_LEVEL || "info",
|
|
|
|
|
name: process.env.APP_NAME || "customer-portal",
|
2025-09-01 15:11:42 +09:00
|
|
|
|
2025-08-30 18:22:31 +09:00
|
|
|
// Browser vs Node configuration
|
|
|
|
|
...(isBrowser
|
|
|
|
|
? {
|
|
|
|
|
browser: {
|
|
|
|
|
asObject: true,
|
|
|
|
|
serialize: true,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
: {
|
|
|
|
|
transport: isDev
|
|
|
|
|
? {
|
|
|
|
|
target: "pino-pretty",
|
|
|
|
|
options: {
|
|
|
|
|
colorize: true,
|
|
|
|
|
translateTime: "yyyy-mm-dd HH:MM:ss",
|
|
|
|
|
ignore: "pid,hostname",
|
2025-09-01 18:47:30 +09:00
|
|
|
messageFormat: "{msg}", // Cleaner message format
|
|
|
|
|
hideObject: false, // Show structured data but cleaner
|
2025-08-30 18:22:31 +09:00
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
: undefined,
|
|
|
|
|
}),
|
|
|
|
|
|
2025-09-01 18:47:30 +09:00
|
|
|
// Security: redact sensitive fields and reduce noise
|
2025-08-30 18:22:31 +09:00
|
|
|
redact: {
|
|
|
|
|
paths: [
|
|
|
|
|
"req.headers.authorization",
|
2025-09-01 15:11:42 +09:00
|
|
|
"req.headers.cookie",
|
2025-09-01 18:47:30 +09:00
|
|
|
"req.body", // Hide request bodies
|
2025-09-02 16:09:17 +09:00
|
|
|
"res.body", // Hide response bodies
|
2025-08-30 18:22:31 +09:00
|
|
|
"password",
|
|
|
|
|
"token",
|
|
|
|
|
"secret",
|
|
|
|
|
"jwt",
|
|
|
|
|
"apiKey",
|
2025-09-01 18:47:30 +09:00
|
|
|
"data", // Hide large data objects
|
2025-08-30 18:22:31 +09:00
|
|
|
],
|
|
|
|
|
remove: true,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// Clean output format
|
|
|
|
|
formatters: {
|
|
|
|
|
level: (label: string) => ({ level: label }),
|
|
|
|
|
bindings: () => ({}),
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Export the same logger instance everywhere
|
|
|
|
|
export default logger;
|
|
|
|
|
|
|
|
|
|
// Helper functions for common logging patterns
|
|
|
|
|
export const log = {
|
2025-09-01 15:11:42 +09:00
|
|
|
info: (message: string, data?: unknown) => logger.info(data, message),
|
|
|
|
|
error: (message: string, error?: unknown) => logger.error(error, message),
|
|
|
|
|
warn: (message: string, data?: unknown) => logger.warn(data, message),
|
|
|
|
|
debug: (message: string, data?: unknown) => logger.debug(data, message),
|
2025-08-30 18:22:31 +09:00
|
|
|
};
|