Skip to content

Commit 03e43ab

Browse files
authored
Log color and simplify startup log for production (#3889)
1 parent 7212d88 commit 03e43ab

File tree

8 files changed

+191
-41
lines changed

8 files changed

+191
-41
lines changed

.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ module.exports = {
178178
"jsdoc/require-returns-type": "off",
179179
"jsdoc/require-param-type": "off",
180180
"@typescript-eslint/no-explicit-any": "off",
181+
"prefer-const": "off",
181182
}
182183
}
183184
]

server/database.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class Database {
131131
fs.mkdirSync(Database.dockerTLSDir, { recursive: true });
132132
}
133133

134-
log.info("db", `Data Dir: ${Database.dataDir}`);
134+
log.info("server", `Data Dir: ${Database.dataDir}`);
135135
}
136136

137137
/**
@@ -318,10 +318,10 @@ class Database {
318318
await R.exec("PRAGMA synchronous = NORMAL");
319319

320320
if (!noLog) {
321-
log.info("db", "SQLite config:");
322-
log.info("db", await R.getAll("PRAGMA journal_mode"));
323-
log.info("db", await R.getAll("PRAGMA cache_size"));
324-
log.info("db", "SQLite Version: " + await R.getCell("SELECT sqlite_version()"));
321+
log.debug("db", "SQLite config:");
322+
log.debug("db", await R.getAll("PRAGMA journal_mode"));
323+
log.debug("db", await R.getAll("PRAGMA cache_size"));
324+
log.debug("db", "SQLite Version: " + await R.getCell("SELECT sqlite_version()"));
325325
}
326326
}
327327

@@ -390,13 +390,15 @@ class Database {
390390
version = 0;
391391
}
392392

393-
log.info("db", "Your database version: " + version);
394-
log.info("db", "Latest database version: " + this.latestVersion);
393+
if (version !== this.latestVersion) {
394+
log.info("db", "Your database version: " + version);
395+
log.info("db", "Latest database version: " + this.latestVersion);
396+
}
395397

396398
if (version === this.latestVersion) {
397-
log.info("db", "Database patch not needed");
399+
log.debug("db", "Database patch not needed");
398400
} else if (version > this.latestVersion) {
399-
log.info("db", "Warning: Database version is newer than expected");
401+
log.warn("db", "Warning: Database version is newer than expected");
400402
} else {
401403
log.info("db", "Database patch is needed");
402404

@@ -432,7 +434,7 @@ class Database {
432434
* @returns {Promise<void>}
433435
*/
434436
static async patchSqlite2() {
435-
log.info("db", "Database Patch 2.0 Process");
437+
log.debug("db", "Database Patch 2.0 Process");
436438
let databasePatchedFiles = await setting("databasePatchedFiles");
437439

438440
if (! databasePatchedFiles) {

server/notification.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class Notification {
6565
* @throws Duplicate notification providers in list
6666
*/
6767
static init() {
68-
log.info("notification", "Prepare Notification Providers");
68+
log.debug("notification", "Prepare Notification Providers");
6969

7070
this.providerList = {};
7171

server/server.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,20 @@ if (!semver.satisfies(nodeVersion, requiredNodeVersions)) {
3939
const args = require("args-parser")(process.argv);
4040
const { sleep, log, getRandomInt, genSecret, isDev } = require("../src/util");
4141

42-
log.info("server", "Welcome to Uptime Kuma");
4342
log.debug("server", "Arguments");
4443
log.debug("server", args);
4544

4645
if (! process.env.NODE_ENV) {
4746
process.env.NODE_ENV = "production";
4847
}
4948

50-
log.info("server", "Node Env: " + process.env.NODE_ENV);
51-
log.info("server", "Inside Container: " + (process.env.UPTIME_KUMA_IS_CONTAINER === "1"));
49+
log.info("server", "Env: " + process.env.NODE_ENV);
50+
log.debug("server", "Inside Container: " + (process.env.UPTIME_KUMA_IS_CONTAINER === "1"));
51+
52+
const checkVersion = require("./check-version");
53+
log.info("server", "Uptime Kuma Version: " + checkVersion.version);
54+
55+
log.info("server", "Loading modules");
5256

5357
log.debug("server", "Importing express");
5458
const express = require("express");
@@ -75,7 +79,6 @@ const server = UptimeKumaServer.getInstance(args);
7579
const io = module.exports.io = server.io;
7680
const app = server.app;
7781

78-
log.info("server", "Importing this project modules");
7982
log.debug("server", "Importing Monitor");
8083
const Monitor = require("./model/monitor");
8184
const User = require("./model/user");
@@ -102,9 +105,6 @@ const { apiAuth } = require("./auth");
102105
const { login } = require("./auth");
103106
const passwordHash = require("./password-hash");
104107

105-
const checkVersion = require("./check-version");
106-
log.info("server", "Version: " + checkVersion.version);
107-
108108
// If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise.
109109
// Dual-stack support for (::)
110110
// Also read HOST if not FreeBSD, as HOST is a system environment variable in FreeBSD
@@ -195,7 +195,7 @@ let needSetup = false;
195195
server.entryPage = await Settings.get("entryPage");
196196
await StatusPage.loadDomainMappingList();
197197

198-
log.info("server", "Adding route");
198+
log.debug("server", "Adding route");
199199

200200
// ***************************
201201
// Normal Router here
@@ -295,7 +295,7 @@ let needSetup = false;
295295
}
296296
});
297297

298-
log.info("server", "Adding socket handler");
298+
log.debug("server", "Adding socket handler");
299299
io.on("connection", async (socket) => {
300300

301301
sendInfo(socket, true);
@@ -1735,11 +1735,12 @@ let needSetup = false;
17351735

17361736
});
17371737

1738-
log.info("server", "Init the server");
1738+
log.debug("server", "Init the server");
17391739

17401740
server.httpServer.once("error", async (err) => {
1741-
console.error("Cannot listen: " + err.message);
1741+
log.error("server", "Cannot listen: " + err.message);
17421742
await shutdownFunction();
1743+
process.exit(1);
17431744
});
17441745

17451746
server.start();
@@ -1851,9 +1852,9 @@ async function afterLogin(socket, user) {
18511852
* @returns {Promise<void>}
18521853
*/
18531854
async function initDatabase(testMode = false) {
1854-
log.info("server", "Connecting to the Database");
1855+
log.debug("server", "Connecting to the database");
18551856
await Database.connect(testMode);
1856-
log.info("server", "Connected");
1857+
log.info("server", "Connected to the database");
18571858

18581859
// Patch the database
18591860
await Database.patch();
@@ -1867,7 +1868,7 @@ async function initDatabase(testMode = false) {
18671868
jwtSecretBean = await initJWTSecret();
18681869
log.info("server", "Stored JWT secret into database");
18691870
} else {
1870-
log.info("server", "Load JWT secret from database.");
1871+
log.debug("server", "Load JWT secret from database.");
18711872
}
18721873

18731874
// If there is no record in user table, it is a new Uptime Kuma instance, need to setup

server/setup-database.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class SetupDatabase {
4848

4949
try {
5050
dbConfig = Database.readDBConfig();
51-
log.info("setup-database", "db-config.json is found and is valid");
51+
log.debug("setup-database", "db-config.json is found and is valid");
5252
this.needSetup = false;
5353

5454
} catch (e) {

server/uptime-kuma-server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class UptimeKumaServer {
8383
const sslCert = args["ssl-cert"] || process.env.UPTIME_KUMA_SSL_CERT || process.env.SSL_CERT || undefined;
8484
const sslKeyPassphrase = args["ssl-key-passphrase"] || process.env.UPTIME_KUMA_SSL_KEY_PASSPHRASE || process.env.SSL_KEY_PASSPHRASE || undefined;
8585

86-
log.info("server", "Creating express and socket.io instance");
86+
log.debug("server", "Creating express and socket.io instance");
8787
this.app = express();
8888
if (sslKey && sslCert) {
8989
log.info("server", "Server Type: HTTPS");

src/util.js

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
// Frontend uses util.ts
1010
*/
1111
Object.defineProperty(exports, "__esModule", { value: true });
12-
exports.localToUTC = exports.utcToLocal = exports.utcToISODateTime = exports.isoToUTCDateTime = exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.MIN_INTERVAL_SECOND = exports.MAX_INTERVAL_SECOND = exports.SQL_DATETIME_FORMAT_WITHOUT_SECOND = exports.SQL_DATETIME_FORMAT = exports.SQL_DATE_FORMAT = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
12+
exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.CONSOLE_STYLE_BgGray = exports.CONSOLE_STYLE_BgWhite = exports.CONSOLE_STYLE_BgCyan = exports.CONSOLE_STYLE_BgMagenta = exports.CONSOLE_STYLE_BgBlue = exports.CONSOLE_STYLE_BgYellow = exports.CONSOLE_STYLE_BgGreen = exports.CONSOLE_STYLE_BgRed = exports.CONSOLE_STYLE_BgBlack = exports.CONSOLE_STYLE_FgPink = exports.CONSOLE_STYLE_FgBrown = exports.CONSOLE_STYLE_FgViolet = exports.CONSOLE_STYLE_FgLightBlue = exports.CONSOLE_STYLE_FgLightGreen = exports.CONSOLE_STYLE_FgOrange = exports.CONSOLE_STYLE_FgGray = exports.CONSOLE_STYLE_FgWhite = exports.CONSOLE_STYLE_FgCyan = exports.CONSOLE_STYLE_FgMagenta = exports.CONSOLE_STYLE_FgBlue = exports.CONSOLE_STYLE_FgYellow = exports.CONSOLE_STYLE_FgGreen = exports.CONSOLE_STYLE_FgRed = exports.CONSOLE_STYLE_FgBlack = exports.CONSOLE_STYLE_Hidden = exports.CONSOLE_STYLE_Reverse = exports.CONSOLE_STYLE_Blink = exports.CONSOLE_STYLE_Underscore = exports.CONSOLE_STYLE_Dim = exports.CONSOLE_STYLE_Bright = exports.CONSOLE_STYLE_Reset = exports.MIN_INTERVAL_SECOND = exports.MAX_INTERVAL_SECOND = exports.SQL_DATETIME_FORMAT_WITHOUT_SECOND = exports.SQL_DATETIME_FORMAT = exports.SQL_DATE_FORMAT = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
13+
exports.intHash = exports.localToUTC = exports.utcToLocal = exports.utcToISODateTime = exports.isoToUTCDateTime = exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = void 0;
1314
const dayjs = require("dayjs");
1415
exports.isDev = process.env.NODE_ENV === "development";
1516
exports.appName = "Uptime Kuma";
@@ -26,6 +27,55 @@ exports.SQL_DATETIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
2627
exports.SQL_DATETIME_FORMAT_WITHOUT_SECOND = "YYYY-MM-DD HH:mm";
2728
exports.MAX_INTERVAL_SECOND = 2073600;
2829
exports.MIN_INTERVAL_SECOND = 20;
30+
exports.CONSOLE_STYLE_Reset = "\x1b[0m";
31+
exports.CONSOLE_STYLE_Bright = "\x1b[1m";
32+
exports.CONSOLE_STYLE_Dim = "\x1b[2m";
33+
exports.CONSOLE_STYLE_Underscore = "\x1b[4m";
34+
exports.CONSOLE_STYLE_Blink = "\x1b[5m";
35+
exports.CONSOLE_STYLE_Reverse = "\x1b[7m";
36+
exports.CONSOLE_STYLE_Hidden = "\x1b[8m";
37+
exports.CONSOLE_STYLE_FgBlack = "\x1b[30m";
38+
exports.CONSOLE_STYLE_FgRed = "\x1b[31m";
39+
exports.CONSOLE_STYLE_FgGreen = "\x1b[32m";
40+
exports.CONSOLE_STYLE_FgYellow = "\x1b[33m";
41+
exports.CONSOLE_STYLE_FgBlue = "\x1b[34m";
42+
exports.CONSOLE_STYLE_FgMagenta = "\x1b[35m";
43+
exports.CONSOLE_STYLE_FgCyan = "\x1b[36m";
44+
exports.CONSOLE_STYLE_FgWhite = "\x1b[37m";
45+
exports.CONSOLE_STYLE_FgGray = "\x1b[90m";
46+
exports.CONSOLE_STYLE_FgOrange = "\x1b[38;5;208m";
47+
exports.CONSOLE_STYLE_FgLightGreen = "\x1b[38;5;119m";
48+
exports.CONSOLE_STYLE_FgLightBlue = "\x1b[38;5;117m";
49+
exports.CONSOLE_STYLE_FgViolet = "\x1b[38;5;141m";
50+
exports.CONSOLE_STYLE_FgBrown = "\x1b[38;5;130m";
51+
exports.CONSOLE_STYLE_FgPink = "\x1b[38;5;219m";
52+
exports.CONSOLE_STYLE_BgBlack = "\x1b[40m";
53+
exports.CONSOLE_STYLE_BgRed = "\x1b[41m";
54+
exports.CONSOLE_STYLE_BgGreen = "\x1b[42m";
55+
exports.CONSOLE_STYLE_BgYellow = "\x1b[43m";
56+
exports.CONSOLE_STYLE_BgBlue = "\x1b[44m";
57+
exports.CONSOLE_STYLE_BgMagenta = "\x1b[45m";
58+
exports.CONSOLE_STYLE_BgCyan = "\x1b[46m";
59+
exports.CONSOLE_STYLE_BgWhite = "\x1b[47m";
60+
exports.CONSOLE_STYLE_BgGray = "\x1b[100m";
61+
const consoleModuleColors = [
62+
exports.CONSOLE_STYLE_FgCyan,
63+
exports.CONSOLE_STYLE_FgGreen,
64+
exports.CONSOLE_STYLE_FgLightGreen,
65+
exports.CONSOLE_STYLE_FgBlue,
66+
exports.CONSOLE_STYLE_FgLightBlue,
67+
exports.CONSOLE_STYLE_FgMagenta,
68+
exports.CONSOLE_STYLE_FgOrange,
69+
exports.CONSOLE_STYLE_FgViolet,
70+
exports.CONSOLE_STYLE_FgBrown,
71+
exports.CONSOLE_STYLE_FgPink,
72+
];
73+
const consoleLevelColors = {
74+
"INFO": exports.CONSOLE_STYLE_FgCyan,
75+
"WARN": exports.CONSOLE_STYLE_FgYellow,
76+
"ERROR": exports.CONSOLE_STYLE_FgRed,
77+
"DEBUG": exports.CONSOLE_STYLE_FgGray,
78+
};
2979
function flipStatus(s) {
3080
if (s === exports.UP) {
3181
return exports.DOWN;
@@ -85,23 +135,30 @@ class Logger {
85135
else {
86136
now = dayjs().format();
87137
}
88-
const formattedMessage = (typeof msg === "string") ? `${now} [${module}] ${level}: ${msg}` : msg;
138+
const levelColor = consoleLevelColors[level];
139+
const moduleColor = consoleModuleColors[intHash(module, consoleModuleColors.length)];
140+
let timePart = exports.CONSOLE_STYLE_FgCyan + now + exports.CONSOLE_STYLE_Reset;
141+
let modulePart = "[" + moduleColor + module + exports.CONSOLE_STYLE_Reset + "]";
142+
let levelPart = levelColor + `${level}:` + exports.CONSOLE_STYLE_Reset;
89143
if (level === "INFO") {
90-
console.info(formattedMessage);
144+
console.info(timePart, modulePart, levelPart, msg);
91145
}
92146
else if (level === "WARN") {
93-
console.warn(formattedMessage);
147+
console.warn(timePart, modulePart, levelPart, msg);
94148
}
95149
else if (level === "ERROR") {
96-
console.error(formattedMessage);
150+
let msgPart = exports.CONSOLE_STYLE_FgRed + msg + exports.CONSOLE_STYLE_Reset;
151+
console.error(timePart, modulePart, levelPart, msgPart);
97152
}
98153
else if (level === "DEBUG") {
99154
if (exports.isDev) {
100-
console.log(formattedMessage);
155+
timePart = exports.CONSOLE_STYLE_FgGray + now + exports.CONSOLE_STYLE_Reset;
156+
let msgPart = exports.CONSOLE_STYLE_FgGray + msg + exports.CONSOLE_STYLE_Reset;
157+
console.debug(timePart, modulePart, levelPart, msgPart);
101158
}
102159
}
103160
else {
104-
console.log(formattedMessage);
161+
console.log(timePart, modulePart, msg);
105162
}
106163
}
107164
info(module, msg) {
@@ -269,3 +326,11 @@ function localToUTC(input, format = exports.SQL_DATETIME_FORMAT) {
269326
return dayjs(input).utc().format(format);
270327
}
271328
exports.localToUTC = localToUTC;
329+
function intHash(str, length = 10) {
330+
let hash = 0;
331+
for (let i = 0; i < str.length; i++) {
332+
hash += str.charCodeAt(i);
333+
}
334+
return (hash % length + length) % length;
335+
}
336+
exports.intHash = intHash;

0 commit comments

Comments
 (0)