Skip to content

Commit f638974

Browse files
committed
feat: reorganize the logger formatters, code optimizations
1 parent 322bb5e commit f638974

11 files changed

+231
-250
lines changed

electron/common/logger/format/__tests__/format-log-data.test.ts

-95
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { describe, expect, it } from 'vitest';
2+
import { formatLogData } from '../format.utils.js';
3+
4+
class ErrorWithCode extends Error {
5+
public readonly code: number;
6+
7+
constructor(message: string, code: number) {
8+
super(message);
9+
this.name = this.constructor.name;
10+
this.code = code;
11+
Error.captureStackTrace(this, ErrorWithCode);
12+
}
13+
}
14+
15+
describe('format-utils', () => {
16+
describe('#formatLogData', () => {
17+
it('formats empty object as empty object', () => {
18+
const data = {};
19+
20+
const result = formatLogData(data);
21+
22+
expect(result).toEqual({});
23+
});
24+
25+
it('formats error as name and stack properties', () => {
26+
const data = {
27+
error: new Error('test'),
28+
};
29+
30+
const result = formatLogData(data);
31+
32+
expect(result).toEqual({
33+
error: 'test',
34+
errorCode: undefined,
35+
errorName: 'Error',
36+
errorStack: expect.any(String),
37+
});
38+
});
39+
40+
it('formats error as name, code, and stack properties', () => {
41+
const data = {
42+
error: new ErrorWithCode('test', 42),
43+
};
44+
45+
const result = formatLogData(data);
46+
47+
expect(result).toEqual({
48+
error: 'test',
49+
errorCode: 42,
50+
errorName: 'ErrorWithCode',
51+
errorStack: expect.any(String),
52+
});
53+
});
54+
55+
it('formats Set as an array', () => {
56+
const data = {
57+
set: new Set(['A', 'B', 'C']),
58+
};
59+
60+
// Note that the Set is not serialized as JSON.
61+
expect(JSON.stringify(data)).toEqual('{"set":{}}');
62+
63+
const result = formatLogData(data);
64+
65+
// The Set is now serialized.
66+
expect(result).toEqual({
67+
set: ['A', 'B', 'C'],
68+
});
69+
});
70+
71+
it('formats Map as an object', () => {
72+
const date = new Date();
73+
74+
const data = {
75+
map: new Map<string, any>([
76+
['A', 1],
77+
['B', date],
78+
['C', { foo: 'bar' }],
79+
]),
80+
};
81+
82+
// Note that the Map is not serialized as JSON.
83+
expect(JSON.stringify(data)).toEqual('{"map":{}}');
84+
85+
const result = formatLogData(data);
86+
87+
// The Map is now serialized.
88+
expect(result).toEqual({
89+
map: {
90+
A: 1,
91+
B: date.toJSON(),
92+
C: { foo: 'bar' },
93+
},
94+
});
95+
});
96+
});
97+
});

electron/common/logger/format/__tests__/json-log-formatter.test.ts electron/common/logger/format/__tests__/json-formatter.test.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { beforeEach, describe, expect, it } from 'vitest';
22
import type { LogFormatter, LogMessage } from '../../types.js';
33
import { LogLevel } from '../../types.js';
4-
import { jsonLogFormatter } from '../json-log-formatter.js';
4+
import { jsonLogFormatterFactory } from '../json.formatter.js';
55

6-
describe('json-log-formatter', () => {
6+
describe('json-formatter', () => {
77
const logDate = new Date('2022-01-02T00:00:00Z');
88

99
let formatter: LogFormatter;
1010

1111
beforeEach(() => {
12-
formatter = jsonLogFormatter({ colors: false });
12+
formatter = jsonLogFormatterFactory({ colors: false });
1313
});
1414

1515
it('formats log message', () => {
@@ -90,7 +90,7 @@ describe('json-log-formatter', () => {
9090
});
9191

9292
it('formats log messages with colors', () => {
93-
formatter = jsonLogFormatter({ colors: true });
93+
formatter = jsonLogFormatterFactory({ colors: true });
9494

9595
const messages: Array<LogMessage> = [
9696
{

electron/common/logger/format/__tests__/pretty-log-formatter.test.ts electron/common/logger/format/__tests__/pretty-formatter.test.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ import moment from 'moment';
22
import { beforeEach, describe, expect, it } from 'vitest';
33
import type { LogFormatter, LogMessage } from '../../types.js';
44
import { LogLevel } from '../../types.js';
5-
import { prettyLogFormatter } from '../pretty-log-formatter.js';
5+
import { prettyLogFormatterFactory } from '../pretty.formatter.js';
66

7-
describe('pretty-log-formatter', () => {
7+
describe('pretty-formatter', () => {
88
const logDate = new Date('2022-01-02T00:00:00Z');
99
const logDateStr = moment(logDate).format('YYYY-MM-DD HH:mm:ss.SSSZ');
1010

1111
let formatter: LogFormatter;
1212

1313
beforeEach(() => {
14-
formatter = prettyLogFormatter({ colors: false });
14+
formatter = prettyLogFormatterFactory({ colors: false });
1515
});
1616

1717
it('formats log message', () => {
@@ -92,7 +92,7 @@ describe('pretty-log-formatter', () => {
9292
});
9393

9494
it('formats log messages with colors', () => {
95-
formatter = prettyLogFormatter({ colors: true });
95+
formatter = prettyLogFormatterFactory({ colors: true });
9696

9797
const messages: Array<LogMessage> = [
9898
{

electron/common/logger/format/format-log-data.ts electron/common/logger/format/format.utils.ts

+16-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
import camelCase from 'lodash-es/camelCase.js';
22
import get from 'lodash-es/get.js';
3+
import { maskSensitiveValues } from '../../sanitize/sanitize.utils.js';
34
import type { LogData } from '../types.js';
45

6+
/**
7+
* Although we make an effort to not log sensitive data, it's possible
8+
* we may accidentally log something we shouldn't. This method attempts
9+
* to mask any sensitive data that may have been logged.
10+
*/
11+
export const maskLogData = (data: LogData): LogData => {
12+
return maskSensitiveValues({ object: data });
13+
};
14+
515
/**
616
* Formats the log data such that values of non-serializable objects
717
* are represented instead of being logged as "{}", as is the case
@@ -40,20 +50,15 @@ const formatError = (data: LogData, key: string, error: Error): void => {
4050
};
4151

4252
const formatSet = (data: LogData, key: string, set: Set<any>): void => {
43-
// data[key] = Array.from(set.keys());
44-
data[key] = Array.from(set.values()).map((value) => {
45-
return formatSingleValue(value);
46-
});
53+
data[key] = Array.from(set, formatSingleValue);
4754
};
4855

4956
const formatMap = (data: LogData, key: string, map: Map<any, any>): void => {
50-
data[key] = Array.from(map.entries()).reduce(
51-
(map, [key, value]) => {
52-
map[key] = formatSingleValue(value);
53-
return map;
54-
},
55-
{} as Record<string, unknown>
56-
);
57+
const formattedData: Record<string, any> = {};
58+
map.forEach((mapValue, mapKey) => {
59+
formattedData[mapKey] = formatSingleValue(mapValue);
60+
});
61+
data[key] = formattedData;
5762
};
5863

5964
const formatSingleValue = (value: any): any => {

electron/common/logger/format/json-log-formatter.ts

-26
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { inspect } from 'node:util';
2+
import type { LogFormatter, LogMessage } from '../types.js';
3+
import { formatLogData, maskLogData } from './format.utils.js';
4+
5+
export const jsonLogFormatterFactory = (options: {
6+
colors: boolean;
7+
}): LogFormatter => {
8+
const { colors } = options;
9+
10+
const formatter: LogFormatter = (logMessages: Array<LogMessage>): string => {
11+
const logLines = formatLogMessages({ colors, logMessages });
12+
return logLines.join('\n') + '\n';
13+
};
14+
15+
return formatter;
16+
};
17+
18+
const formatLogMessages = (options: {
19+
colors: boolean;
20+
logMessages: Array<LogMessage>;
21+
}): Array<string> => {
22+
const { colors, logMessages } = options;
23+
24+
return logMessages.map((logMessage) => {
25+
return formatLogMessage({ colors, logMessage });
26+
});
27+
};
28+
29+
const formatLogMessage = (options: {
30+
colors: boolean;
31+
logMessage: LogMessage;
32+
}): string => {
33+
const { colors, logMessage } = options;
34+
35+
const formattedData = maskLogData(formatLogData(logMessage));
36+
37+
return inspect(formattedData, {
38+
colors,
39+
depth: 5,
40+
compact: true,
41+
breakLength: Infinity,
42+
});
43+
};

0 commit comments

Comments
 (0)