'use strict'; exports = module.exports = { start, stop }; const LOG_FILENAME = 'app.log'; const assert = require('assert'), debug = require('debug')('syslog:server'), fs = require('fs'), net = require('net'), path = require('path'), parser = require('nsyslog-parser'), util = require('util'); let server = null; async function start(options) { assert.strictEqual(typeof options, 'object'); assert.strictEqual(typeof options.logFolder, 'string'); debug('=========================================='); debug(' Cloudron Syslog Daemon '); debug('=========================================='); server = net.createServer(); server.on('error', function (error) { console.error(`server error: ${error}`); }); server.on('connection', function (socket) { socket.on('data', function (msg) { const info = parser(msg.toString()); if (!info || !info.appName) return debug('Ignore unknown app log:', msg.toString()); // remove line breaks to avoid holes in the log file // we do not ignore empty log lines, to allow gaps for potential ease of readability const message = info.message.replace(/\n/g, ''); const filePath = path.join(options.logFolder, info.appName); const fileName = path.join(filePath, LOG_FILENAME); try { fs.mkdirSync(filePath, { recursive: true }); fs.appendFileSync(fileName, info.ts.toISOString() + ' ' + message + '\n'); } catch (error) { console.error(error); } }); socket.on('error', function (error) { console.error(`socket error: ${error}`); }); }); await fs.promises.rm('/home/yellowtent/platformdata/logs/syslog.sock', { force: true }); await util.promisify(server.listen.bind(server))('/home/yellowtent/platformdata/logs/syslog.sock'); debug('Listening on syslog.sock'); } async function stop() { if (!server) return; await util.promisify(server.close.bind(server))(); server = null; }