Skip to content

Commit 8cb12fe

Browse files
committed
Add subLogger feature
1 parent b3bed93 commit 8cb12fe

File tree

5 files changed

+90
-27
lines changed

5 files changed

+90
-27
lines changed

packages/core/src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export type ToInjectItem = { type: 'file' | 'code'; value: string; fallback?: To
7676

7777
export type GetLogger = (name: string) => Logger;
7878
export type Logger = {
79+
getLogger: GetLogger;
7980
error: (text: any) => void;
8081
warn: (text: any) => void;
8182
info: (text: any) => void;

packages/factory/README.md

+18
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,24 @@ logger.info('This is an info');
7474
logger.debug('This is a debug message');
7575
```
7676

77+
You can also create "sub-logger" when you want to individually identify logs from a specific part of your plugin.<br/>
78+
Simply use `log.getLogger('my-plugin')` for this:
79+
80+
```typescript
81+
export const getMyPlugins = (context: GlobalContext, log: Logger) => {
82+
log.debug('Welcome to the root of my plugin');
83+
return [
84+
{
85+
name: 'my-plugin',
86+
setup: (context: PluginContext) => {
87+
const subLog = log.getLogger('my-plugin');
88+
subLog.info('This is a debug message from one of my plugins.');
89+
},
90+
},
91+
];
92+
};
93+
```
94+
7795
## Global Context
7896

7997
A global, shared context within the build plugins ecosystem.<br/>

packages/factory/src/helpers.ts

+4
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ export const getLoggerFactory =
6363
};
6464

6565
return {
66+
getLogger: (subName: string) => {
67+
const logger = getLoggerFactory(build, logLevel);
68+
return logger(`${name}:${subName}`);
69+
},
6670
error: (text: any) => log(text, 'error'),
6771
warn: (text: any) => log(text, 'warn'),
6872
info: (text: any) => log(text, 'info'),

packages/tests/src/_jest/helpers/mocks.ts

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export const defaultPluginOptions: GetPluginsOptions = {
4848

4949
export const mockLogFn = jest.fn((text: any, level: LogLevel) => {});
5050
const logFn: Logger = {
51+
getLogger: jest.fn(),
5152
error: (text: any) => {
5253
mockLogFn(text, 'error');
5354
},

packages/tests/src/factory/helpers.test.ts

+66-27
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ const logMock = jest.mocked(console.log);
2323
const errorMock = jest.mocked(console.error);
2424
const warnMock = jest.mocked(console.warn);
2525

26+
// Access logs and strip colors.
27+
const getOutput = (mock: jest.Mock, index: number) => stripAnsi(mock.mock.calls[index][0]);
28+
2629
describe('Factory Helpers', () => {
2730
// Intercept contexts to verify it at the moment they're used.
2831
const initialContexts: Record<string, GlobalContext> = {};
@@ -83,10 +86,10 @@ describe('Factory Helpers', () => {
8386
});
8487

8588
describe('getLoggerFactory', () => {
86-
const setupLogger = (): [Logger, BuildReport] => {
89+
const setupLogger = (name: string): [Logger, BuildReport] => {
8790
const mockBuild = { errors: [], warnings: [], logs: [] };
8891
const loggerFactory = getLoggerFactory(mockBuild, 'debug');
89-
const logger = loggerFactory('testLogger');
92+
const logger = loggerFactory(name);
9093

9194
return [logger, mockBuild];
9295
};
@@ -98,66 +101,102 @@ describe('Factory Helpers', () => {
98101
logger.debug('A debug message.');
99102
};
100103

101-
test('Should return a logger factory.', () => {
102-
const [logger] = setupLogger();
103-
104+
const assessLogger = (logger: Logger) => {
105+
expect(logger.getLogger).toEqual(expect.any(Function));
104106
expect(logger.error).toEqual(expect.any(Function));
105107
expect(logger.warn).toEqual(expect.any(Function));
106108
expect(logger.info).toEqual(expect.any(Function));
107109
expect(logger.debug).toEqual(expect.any(Function));
108-
});
109-
110-
test('Should log as expected', () => {
111-
const [logger] = setupLogger();
112-
useLogger(logger);
113-
114-
// Access logs and strip colors.
115-
const getOutput = (mock: jest.Mock, index: number) =>
116-
stripAnsi(mock.mock.calls[index][0]);
110+
};
117111

112+
const assessLogs = (name: string) => {
118113
expect(logMock).toHaveBeenCalledTimes(2);
119-
expect(getOutput(logMock, 0)).toBe('[info|testLogger] An info message.');
120-
expect(getOutput(logMock, 1)).toBe('[debug|testLogger] A debug message.');
114+
expect(getOutput(logMock, 0)).toBe(`[info|${name}] An info message.`);
115+
expect(getOutput(logMock, 1)).toBe(`[debug|${name}] A debug message.`);
121116

122117
expect(errorMock).toHaveBeenCalledTimes(1);
123-
expect(getOutput(errorMock, 0)).toBe('[error|testLogger] An error occurred.');
118+
expect(getOutput(errorMock, 0)).toBe(`[error|${name}] An error occurred.`);
124119

125120
expect(warnMock).toHaveBeenCalledTimes(1);
126-
expect(getOutput(warnMock, 0)).toBe('[warn|testLogger] A warning message.');
127-
});
128-
129-
test('Should store logs as expected.', () => {
130-
const [logger, buildReport] = setupLogger();
131-
useLogger(logger);
121+
expect(getOutput(warnMock, 0)).toBe(`[warn|${name}] A warning message.`);
122+
};
132123

124+
const assessReport = (name: string, buildReport: BuildReport) => {
133125
expect(buildReport.logs).toHaveLength(4);
134126
expect(buildReport.logs[0]).toEqual({
135-
pluginName: 'testLogger',
127+
pluginName: name,
136128
type: 'error',
137129
message: 'An error occurred.',
138130
time: expect.any(Number),
139131
});
140132
expect(buildReport.logs[1]).toEqual({
141-
pluginName: 'testLogger',
133+
pluginName: name,
142134
type: 'warn',
143135
message: 'A warning message.',
144136
time: expect.any(Number),
145137
});
146138
expect(buildReport.logs[2]).toEqual({
147-
pluginName: 'testLogger',
139+
pluginName: name,
148140
type: 'info',
149141
message: 'An info message.',
150142
time: expect.any(Number),
151143
});
152144
expect(buildReport.logs[3]).toEqual({
153-
pluginName: 'testLogger',
145+
pluginName: name,
154146
type: 'debug',
155147
message: 'A debug message.',
156148
time: expect.any(Number),
157149
});
158150

159151
expect(buildReport.errors).toEqual(['An error occurred.']);
160152
expect(buildReport.warnings).toEqual(['A warning message.']);
153+
};
154+
155+
describe('Logger', () => {
156+
test('Should return a logger factory.', () => {
157+
const [logger] = setupLogger('testLogger');
158+
159+
assessLogger(logger);
160+
});
161+
162+
test('Should log as expected', () => {
163+
const [logger] = setupLogger('testLogger');
164+
useLogger(logger);
165+
166+
assessLogs('testLogger');
167+
});
168+
169+
test('Should store logs as expected.', () => {
170+
const [logger, buildReport] = setupLogger('testLogger');
171+
useLogger(logger);
172+
173+
assessReport('testLogger', buildReport);
174+
});
175+
});
176+
177+
describe('Sub logger', () => {
178+
test('Should return a logger factory.', () => {
179+
const [logger] = setupLogger('testLogger');
180+
const subLogger = logger.getLogger('subLogger');
181+
182+
assessLogger(subLogger);
183+
});
184+
185+
test('Should log as expected', () => {
186+
const [logger] = setupLogger('testLogger');
187+
const subLogger = logger.getLogger('subLogger');
188+
useLogger(subLogger);
189+
190+
assessLogs('testLogger:subLogger');
191+
});
192+
193+
test('Should store logs as expected.', () => {
194+
const [logger, buildReport] = setupLogger('testLogger');
195+
const subLogger = logger.getLogger('subLogger');
196+
useLogger(subLogger);
197+
198+
assessReport('testLogger:subLogger', buildReport);
199+
});
161200
});
162201
});
163202
});

0 commit comments

Comments
 (0)