UNPKG

@opengis/fastify-table

Version:

core-plugins

64 lines (63 loc) 2.56 kB
import fs from "node:fs"; import build from "pino-abstract-transport"; import labels from "./labels.js"; import getRootDir from "./getRootDir.js"; const dir = getRootDir(); const streams = {}; function createFileStream({ level, status }) { const dt = new Date().toISOString().split("T")[0]; const fileName = `${dir}/${level}/${dt}${status ? `_${status}` : ""}.log`; fs.mkdirSync(`${dir}/${level}`, { recursive: true }); console.log("creating log stream: " + fileName); const stream = fs.createWriteStream(fileName, { encoding: "utf8", flags: "a+", }); stream.on("finish", () => stream.destroy()); stream.on("close", () => stream.destroy()); stream.on("error", () => stream.destroy()); return stream; } setInterval(() => { const dt = new Date().toISOString().split("T")[0]; Object.keys(streams) .filter((el) => !el.includes(dt)) .forEach((el) => streams[el].destroy()); }, 1000 * 3600 * 2); export default function transportTarget() { return build((source) => { const dt = new Date().toISOString().split("T")[0]; source.on("data", (obj) => { if (["incoming request", "request completed"].includes(obj.msg)) return; // if (config.trace) console.log(obj, streams); const file = obj.msg?.logfolder || obj.logfolder; const level = file || labels[obj.level]; const lvl = level + dt; // write error status if (obj.err?.status) { const status = obj.err?.status; streams[status] = streams[status] || createFileStream({ level, status }); streams[status].write(`${JSON.stringify({ ...obj, level: labels[obj.level] })}\n`); } // write error type if (obj.err?.type) { const status = obj.err?.type; streams[status] = streams[status] || createFileStream({ level, status }); streams[status].write(`${JSON.stringify({ ...obj, level: labels[obj.level] })}\n`); } if (streams[lvl]?.closed) { streams[lvl].destroy(); } if (streams[lvl]?.destroyed) { delete streams[lvl]; } streams[lvl] = streams[lvl] || createFileStream({ level }); streams[lvl].write(`${JSON.stringify({ ...obj, level: labels[obj.level] })}\n`); }); }, { parseLine: (line) => JSON.parse(line), }); }