43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
import pino from "pino";
|
|
|
|
import { config } from "./config.js";
|
|
|
|
const pad = (value: number) => value.toString().padStart(2, "0");
|
|
|
|
const padMilliseconds = (value: number) => value.toString().padStart(3, "0");
|
|
|
|
const formatLocalTimestamp = (date: Date) => {
|
|
const year = date.getFullYear();
|
|
const month = pad(date.getMonth() + 1);
|
|
const day = pad(date.getDate());
|
|
const hours = pad(date.getHours());
|
|
const minutes = pad(date.getMinutes());
|
|
const seconds = pad(date.getSeconds());
|
|
const milliseconds = padMilliseconds(date.getMilliseconds());
|
|
const offsetMinutes = -date.getTimezoneOffset();
|
|
const sign = offsetMinutes >= 0 ? "+" : "-";
|
|
const absoluteOffsetMinutes = Math.abs(offsetMinutes);
|
|
const offsetHours = pad(Math.floor(absoluteOffsetMinutes / 60));
|
|
const offsetRemainderMinutes = pad(absoluteOffsetMinutes % 60);
|
|
|
|
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}${sign}${offsetHours}:${offsetRemainderMinutes}`;
|
|
};
|
|
|
|
export const logger = pino({
|
|
level: config.LOG_LEVEL,
|
|
formatters: {
|
|
level: (label) => ({ level: label }),
|
|
},
|
|
timestamp: () => `,"time":"${formatLocalTimestamp(new Date())}"`,
|
|
transport:
|
|
config.NODE_ENV === "development"
|
|
? {
|
|
target: "pino-pretty",
|
|
options: {
|
|
colorize: true,
|
|
translateTime: "SYS:yyyy-mm-dd HH:MM:ss.l o",
|
|
},
|
|
}
|
|
: undefined,
|
|
});
|