Write logs to a file

This commit is contained in:
Samuel Elliott 2018-03-21 15:57:10 +00:00
parent 2fb5d8fe11
commit a4a130bfc6
No known key found for this signature in database
GPG Key ID: 8420C7CDE43DC4D6
7 changed files with 75 additions and 39 deletions

2
.gitignore vendored
View File

@ -4,6 +4,8 @@ dist
etc etc
release release
tests/log.txt
# User data # User data
tests/data tests/data
user.config.json user.config.json

View File

@ -14,13 +14,17 @@ import { Events, CssEditor, Globals, Settings, Database, Updater, ModuleManager,
import { ClientLogger as Logger, ClientIPC, Utils } from 'common'; import { ClientLogger as Logger, ClientIPC, Utils } from 'common';
import { EmoteModule } from 'builtin'; import { EmoteModule } from 'builtin';
import electron from 'electron'; import electron from 'electron';
import path from 'path';
const tests = true;
const ignoreExternal = false; const ignoreExternal = false;
const DEV = true;
class BetterDiscord { class BetterDiscord {
constructor() { constructor() {
Logger.file = tests ? path.join(__dirname, '..', '..', 'tests', 'log.txt') : path.join(__dirname, 'log.txt');
Logger.log('main', 'BetterDiscord starting');
this._bd = { this._bd = {
DOM, BdUI, Modals, Reflection, DOM, BdUI, Modals, Reflection,

View File

@ -27,7 +27,7 @@ export default class {
new SocketProxy(), new SocketProxy(),
new EventHook(), new EventHook(),
CssEditor, CssEditor,
new Updater() Updater
]); ]);
} }

View File

@ -13,7 +13,7 @@ import Globals from './globals';
import { $ } from 'vendor'; import { $ } from 'vendor';
import { ClientLogger as Logger } from 'common'; import { ClientLogger as Logger } from 'common';
export default class { export default new class {
constructor() { constructor() {
window.updater = this; window.updater = this;

View File

@ -1,6 +1,5 @@
const const path = require('path');
path = require('path'), const webpack = require('webpack');
webpack = require('webpack');
const jsLoader = { const jsLoader = {
test: /\.(js|jsx)$/, test: /\.(js|jsx)$/,
@ -9,18 +8,18 @@ const jsLoader = {
query: { query: {
presets: ['react'] presets: ['react']
} }
} };
const vueLoader = { const vueLoader = {
test: /\.(vue)$/, test: /\.(vue)$/,
loader: 'vue-loader' loader: 'vue-loader'
} };
const scssLoader = { const scssLoader = {
test: /\.scss$/, test: /\.scss$/,
exclude: /node_modules/, exclude: /node_modules/,
loader: ['css-loader', 'sass-loader'] loader: ['css-loader', 'sass-loader']
} };
module.exports = { module.exports = {
entry: './src/index.js', entry: './src/index.js',
@ -50,8 +49,13 @@ module.exports = {
path.resolve('src', 'structs'), path.resolve('src', 'structs'),
path.resolve('src', 'builtin') path.resolve('src', 'builtin')
] ]
},
node: {
process: false,
__filename: false,
__dirname: false
} }
/* resolve: { /* resolve: {
alias: { alias: {
'momentjs': 'vendor/moment.min.js' 'momentjs': 'vendor/moment.min.js'
}, },
@ -60,5 +64,5 @@ module.exports = {
path.resolve(__dirname, '..'), path.resolve(__dirname, '..'),
path.resolve(__dirname, '..', 'node_modules') path.resolve(__dirname, '..', 'node_modules')
] ]
}*/ } */
}; };

View File

@ -9,34 +9,55 @@
*/ */
import { Vendor } from 'modules'; import { Vendor } from 'modules';
import { FileUtils } from './utils';
const logs = []; export const logLevels = {
'log': 'log',
'warn': 'warn',
'err': 'error',
'error': 'error',
'debug': 'debug',
'dbg': 'debug',
'info': 'info'
};
export class ClientLogger { export class Logger {
static err(module, message) { this.log(module, message, 'err'); } constructor(file) {
static warn(module, message) { this.log(module, message, 'warn'); } this.logs = [];
static info(module, message) { this.log(module, message, 'info'); } this.file = file;
static dbg(module, message) { this.log(module, message, 'dbg'); } }
static log(module, message, level = 'log') { err(module, message) { this.log(module, message, 'err'); }
level = this.parseLevel(level); warn(module, message) { this.log(module, message, 'warn'); }
info(module, message) { this.log(module, message, 'info'); }
dbg(module, message) { this.log(module, message, 'dbg'); }
log(module, message, level = 'log') {
level = Logger.parseLevel(level);
if (typeof message === 'object' && !(message instanceof Array)) { if (typeof message === 'object' && !(message instanceof Array)) {
console[level]('[%cBetter%cDiscord:%s]', 'color: #3E82E5', '', `${module}${level === 'debug' ? '|DBG' : ''}`, message); console[level]('[%cBetter%cDiscord:%s]', 'color: #3E82E5', '', `${module}${level === 'debug' ? '|DBG' : ''}`, message);
let message_string = message.toString(); let message_string = message.toString();
if (message_string === '[object Object]') if (message_string === '[object Object]')
message_string += ' ' + JSON.stringify(message, null, 4); message_string += ' ' + JSON.stringify(message, null, 4);
logs.push(`${level.toUpperCase()} : [${Vendor.moment().format('DD/MM/YY hh:mm:ss')}|${module}] ${message_string}${message_string === '[object Object]' ? ' ' + JSON.stringify(message, null, 4) : ''}`); this.logs.push(`${level.toUpperCase()} : [${Logger.timestamp}|${module}] ${message_string}${message_string === '[object Object]' ? ' ' + JSON.stringify(message, null, 4) : ''}`);
if (this.file)
FileUtils.appendToFile(this.file, `${level.toUpperCase()} : [${Logger.timestamp}|${module}] ${message_string}${message_string === '[object Object]' ? ' ' + JSON.stringify(message, null, 4) : ''}\n`);
return; return;
} }
message = typeof message === 'object' && message instanceof Array ? message : [message]; message = typeof message === 'object' && message instanceof Array ? message : [message];
console[level]('[%cBetter%cDiscord:%s]', 'color: #3E82E5', '', `${module}${level === 'debug' ? '|DBG' : ''}`, ...message); console[level]('[%cBetter%cDiscord:%s]', 'color: #3E82E5', '', `${module}${level === 'debug' ? '|DBG' : ''}`, ...message);
logs.push(`${level.toUpperCase()} : [${Vendor.moment().format('DD/MM/YY hh:mm:ss')}|${module}] ${message.join(' ')}`); this.logs.push(`${level.toUpperCase()} : [${Logger.timestamp}|${module}] ${message.join(' ')}`);
if (this.file)
FileUtils.appendToFile(this.file, `${level.toUpperCase()} : [${Logger.timestamp}|${module}] ${message.join(' ')}\n`);
} }
static logError(err) { logError(err) {
if (!err.module && !err.message) { if (!err.module && !err.message) {
console.log(err); console.log(err);
return; return;
@ -44,24 +65,14 @@ export class ClientLogger {
this.err(err.module, err.message); this.err(err.module, err.message);
} }
static get logs() {
return logs;
}
static get levels() {
return {
'log': 'log',
'warn': 'warn',
'err': 'error',
'error': 'error',
'debug': 'debug',
'dbg': 'debug',
'info': 'info'
};
}
static parseLevel(level) { static parseLevel(level) {
return this.levels.hasOwnProperty(level) ? this.levels[level] : 'log'; return logLevels.hasOwnProperty(level) ? logLevels[level] : 'log';
}
static get timestamp() {
return Vendor.moment().format('DD/MM/YY hh:mm:ss');
} }
} }
export const ClientLogger = new Logger();

View File

@ -386,6 +386,21 @@ export class FileUtils {
}); });
} }
/**
* Writes to the end of a file.
* @param {String} path The file's path
* @param {String} data The data to append to the file
* @return {Promise}
*/
static async appendToFile(path, data) {
return new Promise((resolve, reject) => {
fs.appendFile(path, data, err => {
if (err) reject(err);
else resolve();
});
});
}
/** /**
* Returns the contents of a file parsed as JSON. * Returns the contents of a file parsed as JSON.
* @param {String} path The file's path * @param {String} path The file's path