Skip to content

Commit 7566a17

Browse files
feat: add custom logger support via logger callback option
1 parent 8cc3531 commit 7566a17

File tree

7 files changed

+32
-20
lines changed

7 files changed

+32
-20
lines changed

src/logger/__tests__/sdkLogger.mock.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export const loggerMock = {
66
debug: jest.fn(),
77
info: jest.fn(),
88
setLogLevel: jest.fn(),
9+
setLogger: jest.fn(),
910

1011
mockClear() {
1112
this.warn.mockClear();

src/logger/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const defaultOptions = {
4141
prefix: 'splitio',
4242
logLevel: LogLevels.NONE,
4343
showLevel: true,
44+
logger(formattedMsg: string) { console.log(formattedMsg); }
4445
};
4546

4647
export class Logger implements ILogger {
@@ -55,6 +56,10 @@ export class Logger implements ILogger {
5556
this.logLevel = LogLevelIndexes[this.options.logLevel];
5657
}
5758

59+
setLogger(logger: (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void) {
60+
this.options.logger = logger;
61+
}
62+
5863
setLogLevel(logLevel: SplitIO.LogLevel) {
5964
this.options.logLevel = logLevel;
6065
this.logLevel = LogLevelIndexes[logLevel];
@@ -86,7 +91,7 @@ export class Logger implements ILogger {
8691

8792
const formattedText = this._generateLogMessage(level, msg);
8893

89-
console.log(formattedText);
94+
this.options.logger(formattedText, level, msg);
9095
}
9196

9297
private _generateLogMessage(level: SplitIO.LogLevel, text: string) {

src/logger/types.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import SplitIO from '../../types/splitio';
22

33
export interface ILoggerOptions {
4-
prefix?: string,
5-
logLevel?: SplitIO.LogLevel,
6-
showLevel?: boolean, // @TODO remove this param eventually since it is not being set `false` anymore
4+
prefix?: string;
5+
logLevel?: SplitIO.LogLevel;
6+
showLevel?: boolean; // @TODO remove this param eventually since it is not being set `false` anymore
7+
logger?: (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void;
78
}
89

910
export interface ILogger extends SplitIO.ILogger {
11+
setLogger(logger: (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void): void;
12+
1013
debug(msg: any): void;
1114
debug(msg: string | number, args?: any[]): void;
1215

src/utils/settingsValidation/logger/builtinLogger.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,13 @@ if (/^(enabled?|on)/i.test(initialState)) {
4040
* @param settings - user config object, with an optional `debug` property of type boolean or string log level.
4141
* @returns a logger instance with the log level at `settings.debug`. If `settings.debug` is invalid or not provided, `initialLogLevel` is used.
4242
*/
43-
export function validateLogger(settings: { debug: unknown }): ILogger {
44-
const { debug } = settings;
43+
export function validateLogger(settings: { debug: unknown, logger?: unknown }): ILogger {
44+
const { debug, logger } = settings;
4545

4646
const logLevel: SplitIO.LogLevel | undefined = debug !== undefined ? getLogLevel(debug) : initialLogLevel;
4747

4848
const log = new Logger({ logLevel: logLevel || initialLogLevel }, allCodes);
49+
if (typeof logger === 'function') log.setLogger(logger as (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void);
4950

5051
// @ts-ignore // if logLevel is undefined at this point, it means that settings `debug` value is invalid
5152
if (!logLevel) log._log(LogLevels.ERROR, 'Invalid Log Level - No changes to the logs will be applied.');

src/utils/settingsValidation/logger/commons.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,11 @@ import SplitIO from '../../../../types/splitio';
1010
* @returns LogLevel of the given debugValue or undefined if the provided value is invalid
1111
*/
1212
export function getLogLevel(debugValue: unknown): SplitIO.LogLevel | undefined {
13-
if (typeof debugValue === 'boolean') {
14-
if (debugValue) {
15-
return LogLevels.DEBUG;
16-
} else {
17-
return LogLevels.NONE;
18-
}
19-
} else if (typeof debugValue === 'string' && isLogLevelString(debugValue)) {
20-
return debugValue;
21-
} else {
22-
return undefined;
23-
}
13+
return typeof debugValue === 'boolean' ?
14+
debugValue ?
15+
LogLevels.DEBUG :
16+
LogLevels.NONE :
17+
typeof debugValue === 'string' && isLogLevelString(debugValue) ?
18+
debugValue :
19+
undefined;
2420
}

src/utils/settingsValidation/logger/pluggableLogger.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,20 @@ let initialLogLevel = LogLevels.NONE;
1717
* @returns a logger instance, that might be: the provided logger at `settings.debug`, or one with the given `debug` log level,
1818
* or one with NONE log level if `debug` is not defined or invalid.
1919
*/
20-
export function validateLogger(settings: { debug: unknown }): ILogger {
21-
const { debug } = settings;
20+
export function validateLogger(settings: { debug: unknown, logger?: unknown }): ILogger {
21+
const { debug, logger } = settings;
2222
let logLevel: SplitIO.LogLevel | undefined = initialLogLevel;
2323

2424
if (debug !== undefined) {
25-
if (isLogger(debug)) return debug;
25+
if (isLogger(debug)) {
26+
if (typeof logger === 'function') debug.setLogger(logger as (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void);
27+
return debug;
28+
}
2629
logLevel = getLogLevel(settings.debug);
2730
}
2831

2932
const log = new Logger({ logLevel: logLevel || initialLogLevel });
33+
if (typeof logger === 'function') log.setLogger(logger as (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void);
3034

3135
// @ts-ignore // `debug` value is invalid if logLevel is undefined at this point
3236
if (!logLevel) log._log(LogLevels.ERROR, 'Invalid `debug` value at config. Logs will be disabled.');

types/splitio.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ interface ISharedSettings {
8787
* Do not change these settings unless you're working an advanced use case, like connecting to the Split proxy.
8888
*/
8989
urls?: SplitIO.UrlSettings;
90+
logger?: (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void;
9091
}
9192
/**
9293
* Common settings properties for SDKs with synchronous API (standalone and localhost modes).
@@ -559,6 +560,7 @@ declare namespace SplitIO {
559560
telemetry: string;
560561
};
561562
readonly integrations?: IntegrationFactory[];
563+
readonly logger?: (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void;
562564
readonly debug: boolean | LogLevel | ILogger;
563565
readonly version: string;
564566
/**

0 commit comments

Comments
 (0)