UNPKG

@opengis/fastify-table

Version:

core-plugins

87 lines (69 loc) 3.12 kB
const streams = {}; import build from 'pino-abstract-transport'; import fs from 'fs'; import labels from './labels.js'; import timestampWithTimeZone from './timestampWithTimeZone.js'; import config from '../../../config.js'; const generator = () => () => `${timestampWithTimeZone().split('T')[0].replace(/:/g, '_')}.log`; const { dir = 'log', interval = '1d', compress = 'gzip', // maxFiles = 90, local: teeToStdout, } = config?.log || {}; function createFileStream({ level, status }) { console.log(dir, level, generator({ interval })(), interval, compress); /* const params = { maxFiles, // logs to save limit history: 'history', // history file name interval, // rotate daily compress, // compress rotated files teeToStdout, // debug / logs to stdout path: `${dir}/${level}`, // absolute path (root directory) intervalBoundary: true, // true - log name with lower boundary of rotation interval initialRotation: true, // true - log rotation check on init // intervalUTC: true, // local tz -> utc }; return createStream(generator({ interval }), params); */ const dt = new Date().toISOString().split('T')[0]; const fileName = `${dir}/${level}/${dt}${status ? `_${status}` : ''}.log`; fs.mkdirSync(`${dir}/${level}`, { recursive: true }); 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; // console.log(obj) 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), }); }