Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/logger/__tests__/sdkLogger.mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export const loggerMock = {
debug: jest.fn(),
info: jest.fn(),
setLogLevel: jest.fn(),
setLogger: jest.fn(),

mockClear() {
this.warn.mockClear();
Expand Down
7 changes: 6 additions & 1 deletion src/logger/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ const defaultOptions = {
prefix: 'splitio',
logLevel: LogLevels.NONE,
showLevel: true,
logger(formattedMsg: string) { console.log(formattedMsg); }
};

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

setLogger(logger: (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void) {
this.options.logger = logger;
}

setLogLevel(logLevel: SplitIO.LogLevel) {
this.options.logLevel = logLevel;
this.logLevel = LogLevelIndexes[logLevel];
Expand Down Expand Up @@ -86,7 +91,7 @@ export class Logger implements ILogger {

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

console.log(formattedText);
this.options.logger(formattedText, level, msg);
}

private _generateLogMessage(level: SplitIO.LogLevel, text: string) {
Expand Down
9 changes: 6 additions & 3 deletions src/logger/types.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import SplitIO from '../../types/splitio';

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

export interface ILogger extends SplitIO.ILogger {
setLogger(logger: (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void): void;

debug(msg: any): void;
debug(msg: string | number, args?: any[]): void;

Expand Down
5 changes: 3 additions & 2 deletions src/utils/settingsValidation/logger/builtinLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,13 @@ if (/^(enabled?|on)/i.test(initialState)) {
* @param settings - user config object, with an optional `debug` property of type boolean or string log level.
* @returns a logger instance with the log level at `settings.debug`. If `settings.debug` is invalid or not provided, `initialLogLevel` is used.
*/
export function validateLogger(settings: { debug: unknown }): ILogger {
const { debug } = settings;
export function validateLogger(settings: { debug: unknown, logger?: unknown }): ILogger {
const { debug, logger } = settings;

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

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

// @ts-ignore // if logLevel is undefined at this point, it means that settings `debug` value is invalid
if (!logLevel) log._log(LogLevels.ERROR, 'Invalid Log Level - No changes to the logs will be applied.');
Expand Down
18 changes: 7 additions & 11 deletions src/utils/settingsValidation/logger/commons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,11 @@ import SplitIO from '../../../../types/splitio';
* @returns LogLevel of the given debugValue or undefined if the provided value is invalid
*/
export function getLogLevel(debugValue: unknown): SplitIO.LogLevel | undefined {
if (typeof debugValue === 'boolean') {
if (debugValue) {
return LogLevels.DEBUG;
} else {
return LogLevels.NONE;
}
} else if (typeof debugValue === 'string' && isLogLevelString(debugValue)) {
return debugValue;
} else {
return undefined;
}
return typeof debugValue === 'boolean' ?
debugValue ?
LogLevels.DEBUG :
LogLevels.NONE :
typeof debugValue === 'string' && isLogLevelString(debugValue) ?
debugValue :
undefined;
}
10 changes: 7 additions & 3 deletions src/utils/settingsValidation/logger/pluggableLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,20 @@ let initialLogLevel = LogLevels.NONE;
* @returns a logger instance, that might be: the provided logger at `settings.debug`, or one with the given `debug` log level,
* or one with NONE log level if `debug` is not defined or invalid.
*/
export function validateLogger(settings: { debug: unknown }): ILogger {
const { debug } = settings;
export function validateLogger(settings: { debug: unknown, logger?: unknown }): ILogger {
const { debug, logger } = settings;
let logLevel: SplitIO.LogLevel | undefined = initialLogLevel;

if (debug !== undefined) {
if (isLogger(debug)) return debug;
if (isLogger(debug)) {
if (typeof logger === 'function') debug.setLogger(logger as (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void);
return debug;
}
logLevel = getLogLevel(settings.debug);
}

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

// @ts-ignore // `debug` value is invalid if logLevel is undefined at this point
if (!logLevel) log._log(LogLevels.ERROR, 'Invalid `debug` value at config. Logs will be disabled.');
Expand Down
2 changes: 2 additions & 0 deletions types/splitio.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ interface ISharedSettings {
* Do not change these settings unless you're working an advanced use case, like connecting to the Split proxy.
*/
urls?: SplitIO.UrlSettings;
logger?: (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void;
}
/**
* Common settings properties for SDKs with synchronous API (standalone and localhost modes).
Expand Down Expand Up @@ -563,6 +564,7 @@ declare namespace SplitIO {
telemetry: string;
};
readonly integrations?: IntegrationFactory[];
readonly logger?: (formattedMsg: string, level: SplitIO.LogLevel, msg: string) => void;
readonly debug: boolean | LogLevel | ILogger;
readonly version: string;
/**
Expand Down