Spaces:
Paused
Paused
| import * as winston from "winston"; | |
| import { configDotenv } from "dotenv"; | |
| configDotenv(); | |
| const logFormat = winston.format.printf( | |
| (info) => | |
| `${info.timestamp} ${info.level} [${info.metadata.module ?? ""}:${info.metadata.method ?? ""}]: ${info.message} ${ | |
| info.level.includes("error") || info.level.includes("warn") | |
| ? JSON.stringify(info.metadata, (_, value) => { | |
| if (value instanceof Error) { | |
| return { | |
| ...value, | |
| name: value.name, | |
| message: value.message, | |
| stack: value.stack, | |
| cause: value.cause, | |
| }; | |
| } else { | |
| return value; | |
| } | |
| }) | |
| : "" | |
| }`, | |
| ); | |
| export const logger = winston.createLogger({ | |
| level: process.env.LOGGING_LEVEL?.toLowerCase() ?? "debug", | |
| format: winston.format.json({ | |
| replacer(key, value) { | |
| if (value instanceof Error) { | |
| return { | |
| ...value, | |
| name: value.name, | |
| message: value.message, | |
| stack: value.stack, | |
| cause: value.cause, | |
| }; | |
| } else { | |
| return value; | |
| } | |
| }, | |
| }), | |
| transports: [ | |
| ...(process.env.FIRECRAWL_LOG_TO_FILE | |
| ? [ | |
| new winston.transports.File({ | |
| filename: | |
| "firecrawl-" + | |
| (process.argv[1].includes("worker") ? "worker" : "app") + | |
| "-" + | |
| crypto.randomUUID() + | |
| ".log", | |
| }), | |
| ] | |
| : []), | |
| new winston.transports.Console({ | |
| format: winston.format.combine( | |
| winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), | |
| winston.format.metadata({ | |
| fillExcept: ["message", "level", "timestamp"], | |
| }), | |
| ...((process.env.ENV === "production" && | |
| process.env.SENTRY_ENVIRONMENT === "dev") || | |
| process.env.ENV !== "production" | |
| ? [winston.format.colorize(), logFormat] | |
| : []), | |
| ), | |
| }), | |
| ], | |
| }); | |