Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[electron] Remove winston as a dependency #3536

Merged
merged 5 commits into from
Jul 29, 2021
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions app/main.development.js
Original file line number Diff line number Diff line change
Expand Up @@ -256,14 +256,13 @@ checkAndInitWalletCfg(false);
logger.log("info", "Using config/data from:" + app.getPath("userData"));
logger.log(
"info",
"Versions: Decrediton: %s, Electron: %s, Chrome: %s",
app.getVersion(),
process.versions.electron,
process.versions.chrome
`Versions: Decrediton: ${app.getVersion()}, ` +
`Electron: ${process.versions.electron}, ` +
`Chrome: ${process.versions.chrome}`
);

process.on("uncaughtException", (err) => {
logger.log("error", "UNCAUGHT EXCEPTION", err);
logger.log("error", `UNCAUGHT EXCEPTION: ${err}`);
throw err;
});

Expand Down Expand Up @@ -812,9 +811,14 @@ app.on("ready", async () => {
setMenuLocale(locale);
});

app.on("before-quit", (event) => {
app.on("before-quit", async (event) => {
logger.log("info", "Caught before-quit. Set decrediton as was closed");
event.preventDefault();
cleanShutdown(mainWindow, app, GetDcrdPID(), GetDcrwPID());
try {
await logger.close();
} catch (error) {
console.error("Error closing log file:", error);
}
app.exit(0);
});
11 changes: 5 additions & 6 deletions app/main_dev/launch.js
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,7 @@ export const launchDCRD = (reactIPC, testnet, appdata) =>
if (!lastDcrdErr || lastDcrdErr === "") {
lastDcrdErr = lastPanicLine(GetDcrdLogs());
}
logger.log("error", "dcrd closed due to an error: ", lastDcrdErr);
logger.log("error", "dcrd closed due to an error: " + lastDcrdErr);
reactIPC.send("error-received", true, lastDcrdErr);
reject(lastDcrdErr);
}
Expand Down Expand Up @@ -654,7 +654,7 @@ export const launchDCRWallet = async (

const notifyGrpcPort = (port) => {
dcrwPort = port;
logger.log("info", "wallet grpc running on port %d", port);
logger.log("info", `wallet grpc running on port ${port}`);
portResolve(dcrwPort);
};

Expand Down Expand Up @@ -700,7 +700,7 @@ export const launchDCRWallet = async (
e &&
e.code &&
e.code != "EOF" &&
logger.log("error", "tx stream error", e)
logger.log("error", `tx stream error: ${e}`)
);
dcrwTxStream.on("close", () =>
logger.log("info", "dcrwallet tx stream closed")
Expand Down Expand Up @@ -765,8 +765,7 @@ export const launchDCRWallet = async (
}
logger.log(
"error",
"dcrwallet closed due to an error: ",
lastDcrwalletErr
"dcrwallet closed due to an error: " + lastDcrwalletErr
);
reactIPC.send("error-received", false, lastDcrwalletErr);
} else {
Expand Down Expand Up @@ -873,7 +872,7 @@ export const launchDCRLnd = (
if (!lastDcrdErr || lastDcrdErr === "") {
lastDcrdErr = lastPanicLine(GetDcrdLogs());
}
logger.log("error", "dcrd closed due to an error: ", lastDcrdErr);
logger.log("error", `dcrd closed due to an error: ${lastDcrdErr}`);
return reject(lastDcrdErr);
}
*/
Expand Down
120 changes: 82 additions & 38 deletions app/main_dev/logging.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import winston from "winston";
import path from "path";
import { MAX_LOG_LENGTH } from "constants";
import { getAppDataDirectory } from "./paths";
import os from "os";
import logform from "logform";
import fs from "fs";

let dcrdLogs = Buffer.from("");
let dcrwalletLogs = Buffer.from("");
Expand Down Expand Up @@ -45,47 +44,92 @@ const logLevelsPrintable = {
silly: "TRC"
};

const logFormatter = (opts) => {
const lvl = logLevelsPrintable[opts.level] || "UNK";
const time = opts.timestamp;
const msg = opts.message;
const subsys = "DCTN";
return `${time} [${lvl}] ${subsys}: ${msg}`;
};
class Logger {
constructor(debug) {
this.debug = debug;
this.logLevels = {
error: 0,
warn: 1,
info: 2,
verbose: 3,
debug: 3,
silly: 3
};
this.colorCodes = {
[-1]: "\u001b[39m",
0: "\u001b[91m",
1: "\u001b[35m",
2: "\u001b[32m",
3: "\u001b[34m"
};
this.drained = true;
this.buffer = [];
this.logFile = fs.createWriteStream(
path.join(getAppDataDirectory(), "decrediton.log")
);
this.logFile.on("drain", this.dequeue);
}

dequeue() {
if (this.buffer.length === 0) {
this.drained = true;
return;
}

// Keep writing data to the file until we either write all available data or
// the file becomes busy for writes (in which case this function will be
// called again once the file can be written to again).
let drained = true;
while (this.buffer.length() > 0 && drained) {
const data = this.buffer.shift();
this.drained = this.logFile.write(data);
drained = this.drained;
}
}

queue(data) {
if (this.drained) {
// Fast path: file is not busy, so write directly.
this.drained = this.logFile.write(data);
} else {
// Slow path: file is busy, so enqueue data to be written as possible.
this.buffer.push(data);
}
}

log(level, msg) {
const levelLower = level.toLowerCase();
const logLevel = this.logLevels[levelLower] || 3;

const subsys = "DCTN";
const lvl = logLevelsPrintable[levelLower] || "UNK";
const data = `${logTimestamp()} [${lvl}] ${subsys}: ${msg}`;

// Log to file only if msg is of level INFO or lower.
if (logLevel <= 2) {
this.queue(data + "\n");
}

// Log to console if debug is set and level is DEBUG or lower.
if (this.debug && logLevel <= 3) {
console.log(this.colorCodes[logLevel] + data + this.colorCodes[-1]);
}
}

close() {
return new Promise((ok) => {
this.logFile.once("finish", ok);
this.logFile.end();
});
}
}

// createLogger creates the main app logger. This stores all logs into the
// decrediton app data dir and sends to the console when debug == true.
// This is meant to be called from the ipcMain thread.
export function createLogger(debug) {
if (logger) return logger;

const { combine, timestamp, printf, colorize, splat } = logform.format;

logger = new winston.createLogger({
transports: [
new winston.transports.File({
filename: path.join(getAppDataDirectory(), "decrediton.log"),
format: combine(
timestamp({ format: logTimestamp }),
splat(),
printf(logFormatter)
)
})
]
});

if (debug) {
logger.add(
new winston.transports.Console({
level: "debug",
format: combine(
timestamp({ format: logTimestamp }),
splat(),
printf(logFormatter),
colorize({ all: true })
)
})
);
if (!logger) {
logger = new Logger(debug);
}

return logger;
Expand Down
35 changes: 22 additions & 13 deletions app/wallet/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,16 @@ export const onDaemonStopped = (cb) => {

export const getCLIOptions = () => ipcRenderer.sendSync("get-cli-options");

export const log = (level, ...args) => {
ipcRenderer.send("main-log", ...[level, ...args]);
const escapeLogMsg = (msg) =>
msg.replace(/[^\x20-\x7E]/g, (s) =>
s
.split("")
.map((c) => "\\u{" + c.charCodeAt(0).toString(16) + "}")
.join("")
);

export const log = (level, msg) => {
ipcRenderer.send("main-log", level, escapeLogMsg(msg));
};

export const logOptionNoArgs = (opts) => ({ ...opts, noArguments: true });
Expand All @@ -63,16 +71,17 @@ const formatLogArgs = (msg, args) => {
} else if (isUndefined(arg)) {
return "[undefined]";
} else if (isString(arg) || isNumber(arg) || isNull(arg)) {
return arg;
return String(arg);
} else {
return JSON.stringify(arg);
}
};

const logMsg = args.reduce((a) => a + "%s ", "%s ");
const logArgs = [msg, ...args.map(formatArg)];
const logArgs = args.map(formatArg);
const argsStr = logArgs.join(" ");
const logMsg = `${msg} ${argsStr}`;

return { logMsg, logArgs };
return { logMsg };
};

// Higher Order Function that wraps the promise-generating function f with log
Expand All @@ -81,27 +90,27 @@ export const withLog = (f, msg, opts = {}) => (...args) => {
if (opts.noArguments) {
log("info", msg);
} else {
const { logMsg, logArgs } = formatLogArgs(msg, args);
log("info", logMsg, ...logArgs);
const { logMsg } = formatLogArgs(msg, args);
log("info", logMsg);
}

return new Promise((resolve, reject) => {
f(...args)
.then((...res) => {
if (res.length === 1 && res[0] === undefined) {
log("debug", "%s returned without data", msg);
log("debug", `${msg} returned without data`);
} else if (opts.noResponseData) {
log("debug", `${msg} returned [response data omitted]`);
} else {
const { logMsg, logArgs } = formatLogArgs(`${msg} returned `, res);
log("debug", logMsg, ...logArgs);
const { logMsg } = formatLogArgs(`${msg} returned `, res);
log("debug", logMsg);
}

resolve(...res);
})
.catch((err) => {
const { logMsg, logArgs } = formatLogArgs(`${msg} errored `, [err]);
log("error", logMsg, ...logArgs);
const { logMsg } = formatLogArgs(`${msg} errored `, [err]);
log("error", logMsg);

reject(err);
});
Expand Down
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,6 @@
"stylelint-config-recommended": "^4.0.0",
"timezone-mock": "^1.1.3",
"utf-8-validate": "^5.0.5",
"winston": "^3.3.3",
"worker-loader": "^3.0.8",
"xstate": "^4.17.1"
},
Expand Down
Loading