@opengis/fastify-table
Version:
core-plugins
64 lines (63 loc) • 2.56 kB
JavaScript
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),
});
}