galactic-bot/middleware/logger/Logger.js

102 lines
2.9 KiB
JavaScript
Raw Normal View History

2020-04-12 14:34:35 +02:00
const { createLogger, format, transports, config } = require('winston');
const { combine, label, printf } = format;
const moment = require('moment');
2020-04-12 14:34:35 +02:00
const chalk = require('chalk');
2020-04-08 16:27:34 +02:00
2020-04-14 05:25:17 +02:00
const { DiscordWebhook, FileExtension } = require('./transports/');
2020-04-13 22:38:10 +02:00
2020-04-09 16:30:52 +02:00
class Logger {
2020-04-08 16:27:34 +02:00
2020-04-09 16:30:52 +02:00
constructor(manager) {
this.manager = manager;
2020-04-13 22:38:10 +02:00
this.shardManager = manager.shardManager;
2020-04-12 14:34:35 +02:00
this.logger = createLogger({
2020-04-14 05:25:17 +02:00
levels: config.npm.levels,
2020-04-13 22:38:10 +02:00
format: (
2020-04-14 05:25:17 +02:00
format.cli({
colors: {
error: 'red',
warn: 'yellow',
info: 'blue',
verbose: 'cyan',
debug: 'magenta',
silly: 'magentaBright'
}
})
2020-04-13 22:38:10 +02:00
),
transports: [
2020-04-14 05:25:17 +02:00
new FileExtension({ filename: `logs/what.log`, level: 'debug'}), //Will NOT log "silly" logs, could change in future.
new FileExtension({ filename: `logs/error.log` , level: 'error' }),
new transports.Console({ level: 'silly' }), //Will log EVERYTHING.
2020-04-13 22:38:10 +02:00
new DiscordWebhook({ level: 'error' }) //Broadcast errors to a discord webhook.
]
});
2020-04-09 16:30:52 +02:00
2020-04-14 05:25:17 +02:00
//TODO: Add proper date-oriented filenames and add a daily rotation file (?).
2020-04-13 22:38:10 +02:00
this.shardManager
.on('shardCreate', (shard) => this.write(shard, "Shard created.", 'debug'))
2020-04-12 14:34:35 +02:00
.on('message', (shard, message) => this._handleMessage(shard, message));
}
//Messages coming from the shards process.send functions.
async _handleMessage(shard, message) {
if(message._ready
|| message._disconnect
|| message._reconnecting
|| message._sFetchProp
|| message._sEval
2020-04-14 05:25:17 +02:00
|| message._sRespawnAll
|| message._storage
|| message._webhook) return undefined; //Properties used for discord.js internal sharding & our own structures. must filter for.
2020-04-12 14:34:35 +02:00
2020-04-13 22:38:10 +02:00
await this.write(shard, message.message, message.type);
2020-04-12 14:34:35 +02:00
}
async write(shard, string = '', type = 'silly') {
2020-04-13 22:38:10 +02:00
const color = Constants.Colors[type];
2020-04-14 05:25:17 +02:00
const header = `${chalk[color](`[${this.date}][${shard ? `shard${this._shardId(shard)}` : 'manager'}]`)}`;
2020-04-12 14:34:35 +02:00
2020-04-14 05:25:17 +02:00
this.logger.log(type, `${header} : ${string}`);
2020-04-12 14:34:35 +02:00
}
_shardId(shard) {
const id = shard.id;
return `${id}`.length === 1 ? `0${id}` : `${id}`;
2020-04-09 16:30:52 +02:00
}
2020-04-08 16:27:34 +02:00
get date() {
2020-04-12 14:34:35 +02:00
return moment().format("MM-DD-YYYY hh:mm:ss");
}
2020-04-08 16:27:34 +02:00
}
2020-04-13 22:38:10 +02:00
module.exports = Logger;
const Constants = {
Colors: {
error: 'red',
warn: 'yellow',
info: 'blue',
verbose: 'cyan',
debug: 'magenta',
silly: 'magentaBright'
}
};
2020-04-14 05:25:17 +02:00
// const levels = {
// error: 0,
// warn: 1,
// info: 2,
// http: 3,
// verbose: 4,
// debug: 5,
// silly: 6
// };