Skip to content

Commit

Permalink
feat: Add a settings option to log to console in json format (#25649)
Browse files Browse the repository at this point in the history
Co-authored-by: Nerivec <[email protected]>
  • Loading branch information
jum and Nerivec authored Jan 8, 2025
1 parent 6f3524b commit 26ef565
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 7 deletions.
1 change: 1 addition & 0 deletions lib/types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ declare global {
device_options: KeyValue;
advanced: {
log_rotation: boolean;
log_console_json: boolean;
log_symlink_current: boolean;
log_output: ('console' | 'file' | 'syslog')[];
log_directory: string;
Expand Down
16 changes: 9 additions & 7 deletions lib/util/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,15 @@ class Logger {
this.logger.add(
new winston.transports.Console({
silent: consoleSilenced,
// winston.config.syslog.levels sets 'warning' as 'red'
format: winston.format.combine(
winston.format.colorize({colors: {debug: 'blue', info: 'green', warning: 'yellow', error: 'red'}}),
winston.format.printf((info) => {
return `[${info.timestamp}] ${info.level}: \t${info.message}`;
}),
),
format: settings.get().advanced.log_console_json
? winston.format.json()
: winston.format.combine(
// winston.config.syslog.levels sets 'warning' as 'red'
winston.format.colorize({colors: {debug: 'blue', info: 'green', warning: 'yellow', error: 'red'}}),
winston.format.printf((info) => {
return `[${info.timestamp}] ${info.level}: \t${info.message}`;
}),
),
}),
);

Expand Down
7 changes: 7 additions & 0 deletions lib/util/settings.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,13 @@
"description": "Log rotation",
"default": true
},
"log_console_json": {
"type": "boolean",
"title": "Console json log",
"requiresRestart": true,
"description": "Console json log",
"default": false
},
"log_symlink_current": {
"type": "boolean",
"title": "Log symlink current",
Expand Down
1 change: 1 addition & 0 deletions lib/util/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ export const defaults: RecursivePartial<Settings> = {
device_options: {},
advanced: {
log_rotation: true,
log_console_json: false,
log_symlink_current: false,
log_output: ['console', 'file'],
log_directory: path.join(data.getPath(), 'log', '%TIMESTAMP%'),
Expand Down
1 change: 1 addition & 0 deletions test/extensions/bridge.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ describe('Extension: Bridge', () => {
log_level: 'info',
log_namespaced_levels: {},
log_output: ['console', 'file'],
log_console_json: false,
log_rotation: true,
log_symlink_current: false,
log_syslog: {},
Expand Down
24 changes: 24 additions & 0 deletions test/logger.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -397,4 +397,28 @@ describe('Logger', () => {
expect(logSpy).toHaveBeenLastCalledWith('debug', `z2m:test: ${splatChars}`);
expect(consoleWriteSpy.mock.calls[1][0]).toMatch(new RegExp(`^.*\tz2m:test: ${splatChars}`));
});

it('Logs to console in JSON when configured', () => {
settings.set(['advanced', 'log_console_json'], true);
logger.init();

consoleWriteSpy.mockClear();
logger.info(`Test JSON message`, 'z2m');

const outputJSON = JSON.parse(consoleWriteSpy.mock.calls[0][0]);
expect(outputJSON).toStrictEqual({
level: 'info',
message: 'z2m: Test JSON message',
timestamp: expect.any(String),
});

settings.set(['advanced', 'log_console_json'], false);
logger.init();

consoleWriteSpy.mockClear();
logger.info(`Test JSON message`, 'z2m');

const outputStr: string = consoleWriteSpy.mock.calls[0][0];
expect(outputStr.trim().endsWith('\u001b[32minfo\u001b[39m: \tz2m: Test JSON message')).toStrictEqual(true);
});
});

0 comments on commit 26ef565

Please sign in to comment.