From 5f8bbd68c845d18ce1197500eb4e91dbbae8ef26 Mon Sep 17 00:00:00 2001 From: les Date: Wed, 28 Apr 2021 12:44:26 +0200 Subject: [PATCH] improve logging --- components/admin/Theme.vue | 1 - config/default.json | 1 + server/api/controller/announce.js | 8 ++++---- server/api/controller/event.js | 5 +++-- server/api/controller/settings.js | 7 ++++--- server/api/controller/user.js | 7 +++++-- server/api/mail.js | 5 ++--- server/api/oauth.js | 2 +- server/cli.js | 2 ++ server/federation/ego.js | 8 ++++---- server/federation/follows.js | 7 +++---- server/federation/helpers.js | 8 ++++---- server/index.js | 2 +- server/log.js | 29 ++++++++++++++++++++++++----- server/notifier.js | 2 +- server/taskManager.js | 8 ++++---- 16 files changed, 63 insertions(+), 39 deletions(-) diff --git a/components/admin/Theme.vue b/components/admin/Theme.vue index 85b2199c..aa32891a 100644 --- a/components/admin/Theme.vue +++ b/components/admin/Theme.vue @@ -117,7 +117,6 @@ export default { this.setSetting({ key: 'footerLinks', value: [{ href: '/about', label: 'about' }] }) }, forceLogoReload () { - this.$refs.upload.reset() this.logoKey++ }, resetLogo (e) { diff --git a/config/default.json b/config/default.json index d465c4a0..8ba03d98 100644 --- a/config/default.json +++ b/config/default.json @@ -6,6 +6,7 @@ "host": "localhost", "port": 13120 }, + "loglevel": "debug", "db": { "dialect": "sqlite", "storage": "./db.sqlite", diff --git a/server/api/controller/announce.js b/server/api/controller/announce.js index 7bd69727..f01bedae 100644 --- a/server/api/controller/announce.js +++ b/server/api/controller/announce.js @@ -17,7 +17,7 @@ const announceController = { announcement: req.body.announcement, visible: true } - log.debug('Create announcement ', req.body.title) + log.info('Create announcement: "%s" ', req.body.title) const announce = await Announcement.create(announcementDetail) res.json(announce) }, @@ -34,20 +34,20 @@ const announceController = { announce = await announce.update(announceDetails) res.json(announce) } catch (e) { - log.debug('Toggle announcement failed ', e) + log.error('Toggle announcement failed: %s ', e) res.sendStatus(404) } }, async remove (req, res) { - log.debug('Remove announcement ', req.params.announce_id) + log.info('Remove announcement "%d"', req.params.announce_id) const announce_id = req.params.announce_id try { const announce = await Announcement.findByPk(announce_id) await announce.destroy() res.sendStatus(200) } catch (e) { - log.debug('Remove announcement failed ', e) + log.error('Remove announcement failed: "%s" ', e) res.sendStatus(404) } } diff --git a/server/api/controller/event.js b/server/api/controller/event.js index 6272df08..0854bbc1 100644 --- a/server/api/controller/event.js +++ b/server/api/controller/event.js @@ -118,12 +118,12 @@ const eventController = { order: [[Resource, 'id', 'DESC']] }) } catch (e) { - console.error(e) + log.error(e) return res.sendStatus(400) } if (!event) { - return res.sendStatus(400) + return res.sendStatus(404) } // get prev and next event @@ -147,6 +147,7 @@ const eventController = { order: [['start_datetime', 'DESC']] }) + // TODO: also check if event is mine if (event && (event.is_visible || is_admin)) { event = event.get() event.next = next && (next.slug || next.id) diff --git a/server/api/controller/settings.js b/server/api/controller/settings.js index eeb31ebe..01c64ad1 100644 --- a/server/api/controller/settings.js +++ b/server/api/controller/settings.js @@ -61,7 +61,7 @@ const settingsController = { // add pub/priv instance key if needed if (!settingsController.settings.publicKey) { - log.debug('Instance priv/pub key not found') + log.info('Instance priv/pub key not found, generating....') const { publicKey, privateKey } = await generateKeyPair('rsa', { modulusLength: 4096, publicKeyEncoding: { @@ -92,7 +92,7 @@ const settingsController = { }, async set (key, value, is_secret = false) { - log.debug(`SET ${key} ${value}`) + log.info(`SET ${key} ${value}`) try { const [setting, created] = await Setting.findOrCreate({ where: { key }, @@ -115,7 +115,8 @@ const settingsController = { setLogo (req, res) { if (!req.file) { - return res.status(400).send('Mmmmm sould not be here!') + settingsController.set('logo', false) + return res.status(200) } const uploadedPath = path.join(req.file.destination, req.file.filename) diff --git a/server/api/controller/user.js b/server/api/controller/user.js index 18cb3a43..d322735e 100644 --- a/server/api/controller/user.js +++ b/server/api/controller/user.js @@ -96,13 +96,14 @@ const userController = { return res.status(404).json('Invalid email') } - log.debug('Register user ', req.body.email) + log.info('Register user ', req.body.email) const user = await User.create(req.body) - log.debug(`Sending registration email to ${user.email}`) + log.info(`Sending registration email to ${user.email}`) mail.send(user.email, 'register', { user, config }, req.settings.locale) mail.send(config.admin_email, 'admin_register', { user, config }) res.sendStatus(200) } catch (e) { + log.error('Registration error: "%s"', e) res.status(404).json(e) } }, @@ -115,6 +116,7 @@ const userController = { mail.send(user.email, 'user_confirm', { user, config }, req.settings.locale) res.json(user) } catch (e) { + log.error('User creation error: %s', e) res.status(404).json(e) } }, @@ -125,6 +127,7 @@ const userController = { user.destroy() res.sendStatus(200) } catch (e) { + log.error('User removal error: "%s"', e) res.status(404).json(e) } } diff --git a/server/api/mail.js b/server/api/mail.js index 84c854cb..5e1302aa 100644 --- a/server/api/mail.js +++ b/server/api/mail.js @@ -19,7 +19,7 @@ const mail = { }, _send (addresses, template, locals, locale) { - log.debug(`Send ${template} email to ${addresses} with locale ${locale}`) + log.info(`Send ${template} email to ${addresses} with locale ${locale}`) const email = new Email({ views: { root: path.join(__dirname, '..', 'emails') }, htmlToText: true, @@ -61,8 +61,7 @@ const mail = { } return email.send(msg) .catch(e => { - log.error('Error sending email =>') - log.error(e) + log.error('Error sending email => %s', e) }) } } diff --git a/server/api/oauth.js b/server/api/oauth.js index 1f2ccd8f..9a4dbc28 100644 --- a/server/api/oauth.js +++ b/server/api/oauth.js @@ -34,7 +34,7 @@ oauth.use((req, res) => res.sendStatus(404)) oauth.use((err, req, res, next) => { const error_msg = err.toString() - log.debug(error_msg) + log.error(error_msg) res.status(500).send(error_msg) }) diff --git a/server/cli.js b/server/cli.js index 41005ca2..be067330 100755 --- a/server/cli.js +++ b/server/cli.js @@ -282,6 +282,8 @@ If this is your first run use 'gancio setup --config ' `) } const config = require('config') await run_migrations(config.db) + consola.info(`Logging to ${path.resolve('./logs/gancio.log')} [level: ${config.loglevel}]`) + require('./index') } diff --git a/server/federation/ego.js b/server/federation/ego.js index f1be8dac..2e87252c 100644 --- a/server/federation/ego.js +++ b/server/federation/ego.js @@ -6,7 +6,7 @@ module.exports = { async boost (req, res) { const match = req.body.object.match(`${config.baseurl}/federation/m/(.*)`) if (!match || match.length < 2) { return res.status(404).send('Event not found!') } - log.debug(`boost ${match[1]}`) + log.info(`boost ${match[1]}`) const event = await Event.findByPk(Number(match[1])) if (!event) { return res.status(404).send('Event not found!') } // TODO, has to be unique... @@ -17,7 +17,7 @@ module.exports = { async unboost (req, res) { const match = req.body.object.match(`${config.baseurl}/federation/m/(.*)`) if (!match || match.length < 2) { return res.status(404).send('Event not found!') } - log.debug(`unboost ${match[1]}`) + log.info(`unboost ${match[1]}`) const event = await Event.findByPk(Number(match[1])) if (!event) { return res.status(404).send('Event not found!') } await event.update({ boost: event.boost.filter(actor => actor !== req.body.actor) }) @@ -27,7 +27,7 @@ module.exports = { const match = req.body.object.match(`${config.baseurl}/federation/m/(.*)`) if (!match || match.length < 2) { return res.status(404).send('Event not found!') } const event = await Event.findByPk(Number(match[1])) - log.debug(`${req.body.actor} bookmark ${event.title} (${event.likes.length})`) + log.info(`${req.body.actor} bookmark ${event.title} (${event.likes.length})`) if (!event) { return res.status(404).send('Event not found!') } // TODO: has to be unique await event.update({ likes: [...event.likes, req.body.actor] }) @@ -40,7 +40,7 @@ module.exports = { const match = object.object.match(`${config.baseurl}/federation/m/(.*)`) if (!match || match.length < 2) { return res.status(404).send('Event not found!') } const event = await Event.findByPk(Number(match[1])) - log.debug(`${body.actor} unbookmark ${event.title} (${event.likes.length})`) + log.info(`${body.actor} unbookmark ${event.title} (${event.likes.length})`) if (!event) { return res.status(404).send('Event not found!') } await event.update({ likes: event.likes.filter(actor => actor !== body.actor) }) res.sendStatus(201) diff --git a/server/federation/follows.js b/server/federation/follows.js index 1efdc0ee..68ef4e46 100644 --- a/server/federation/follows.js +++ b/server/federation/follows.js @@ -7,7 +7,6 @@ module.exports = { // follow request from fediverse async follow (req, res) { const body = req.body - log.debug('follow') if (typeof body.object !== 'string') { return } const username = body.object.replace(`${config.baseurl}/federation/u/`, '') if (username !== req.settings.instance_name) { @@ -20,7 +19,7 @@ module.exports = { // await user.addFollowers([req.fedi_user.id]) // await user.update({ followers: [...user.followers, body.actor] }) await req.fedi_user.update({ follower: true }) - log.debug(`Followed by ${body.actor}`) + log.info(`Followed by ${body.actor}`) const guid = crypto.randomBytes(16).toString('hex') const message = { '@context': 'https://www.w3.org/ns/activitystreams', @@ -43,11 +42,11 @@ module.exports = { } if (body.actor !== body.object.actor || body.actor !== req.fedi_user.ap_id) { - log.debug('Unfollow an user created by a different actor !?!?') + log.info('Unfollow an user created by a different actor !?!?') return res.status(400).send('Bad things') } await req.fedi_user.update({ follower: false }) - log.debug(`Unfollowed by ${body.actor}`) + log.info(`Unfollowed by ${body.actor}`) res.sendStatus(200) } } diff --git a/server/federation/helpers.js b/server/federation/helpers.js index 5fae81ea..bc025444 100644 --- a/server/federation/helpers.js +++ b/server/federation/helpers.js @@ -69,7 +69,7 @@ const Helpers = { async sendEvent (event, type = 'Create') { if (!settingsController.settings.enable_federation) { - log.debug('event not send, federation disabled') + log.info('event not send, federation disabled') return } @@ -131,7 +131,7 @@ const Helpers = { }) if (fedi_user) { - log.debug(`Create a new AP User => ${URL}`) + log.info(`Create a new AP User => ${URL}`) fedi_user = await APUser.create({ ap_id: URL, object: fedi_user }) } return fedi_user @@ -208,13 +208,13 @@ const Helpers = { // signature not valid, try without cache user = await Helpers.getActor(req.body.actor, instance, true) if (!user) { - log.debug(`Actor ${req.body.actor} not found`) + log.info(`Actor ${req.body.actor} not found`) return res.status(401).send('Actor not found') } if (httpSignature.verifySignature(parsed, user.object.publicKey.publicKeyPem)) { return next() } // still not valid - log.debug(`Invalid signature from user ${req.body.actor}`) + log.info(`Invalid signature from user ${req.body.actor}`) res.send('Request signature could not be verified', 401) } } diff --git a/server/index.js b/server/index.js index e8f03eed..673465a8 100644 --- a/server/index.js +++ b/server/index.js @@ -21,7 +21,7 @@ async function main () { try { await nuxt.listen() } catch (e) { - log.err(e) + log.error(e) return } diff --git a/server/log.js b/server/log.js index 0c72fcf9..26e47a38 100644 --- a/server/log.js +++ b/server/log.js @@ -1,16 +1,35 @@ const { createLogger, transports, format } = require('winston') +const DailyRotateFile = require('winston-daily-rotate-file') +const dayjs = require('dayjs') +const config = require('config') + +const gancioFormat = format.printf(({ timestamp, level, message }) => { + return `${dayjs(timestamp).format('DD MMM YYYY HH:mm:ss')} ${level}: ${message}` +}) const logger = createLogger({ + exitOnError: false, transports: process.env.NODE_ENV !== 'production' ? [new transports.Console( - { level: 'debug', format: format.combine(format.colorize(), format.simple(), format.errors({ stack: true })) } - )] - : [new transports.File( { - filename: 'gancio.log', - format: format.combine(format.simple(), format.errors({ stack: true })) + handleExceptions: true, + handleRejections: true, + level: 'debug', + format: format.combine(format.timestamp(), format.splat(), format.colorize(), gancioFormat) } )] + : [new DailyRotateFile({ + handleExceptions: true, + handleRejections: true, + level: config.loglevel || 'info', + filename: './logs/gancio.%DATE%.log', + symlinkName: 'gancio.log', + createSymlink: true, + zippedArchive: true, + maxSize: '10m', + maxFiles: '14d', + format: format.combine(format.timestamp(), format.splat(), gancioFormat) + })] }) module.exports = logger diff --git a/server/notifier.js b/server/notifier.js index 3fc77c3c..ac105aab 100644 --- a/server/notifier.js +++ b/server/notifier.js @@ -16,7 +16,7 @@ const notifier = { sendNotification (notification, event) { const promises = [] - log.debug(`Send ${notification.type} notification ${notification.action}`) + log.info(`Send ${notification.type} notification ${notification.action}`) let p switch (notification.type) { // case 'mail': TODO: locale? diff --git a/server/taskManager.js b/server/taskManager.js index c35fd627..624ab01a 100644 --- a/server/taskManager.js +++ b/server/taskManager.js @@ -28,11 +28,11 @@ class Task { try { const ret = this.method.apply(this, this.args) if (ret && typeof ret.then === 'function') { - ret.catch(e => log.error('TASK ERROR ', this.name, e)) + ret.catch(e => log.error('TASK ERROR [%s]: %s', this.name, e)) return ret } } catch (e) { - log.error('TASK ERROR ', this.name, e) + log.error('TASK ERROR [%s]: %s ', this.name, e) return Promise.resolve(false) } } @@ -62,14 +62,14 @@ class TaskManager { stop () { if (this.timeout) { - log.debug('STOP TASKMANAGER') + log.info('STOP TASKMANAGER') clearTimeout(this.timeout) this.timeout = false } } add (task) { - log.debug(`[TASK] Add ${task.name} (${task.repeatDelay * this.interval} seconds)`) + log.info(`[TASK] Add ${task.name} (${task.repeatDelay * this.interval} seconds)`) this.tasks.push(task) }