diff --git a/src/api/diag.ts b/src/api/diag.ts index 2cd59c2e..d548c7e8 100644 --- a/src/api/diag.ts +++ b/src/api/diag.ts @@ -53,7 +53,7 @@ export class DiagAPI implements DiagLogger { function _logProxy(funcName: keyof DiagLogger): DiagLogFunction { return function () { const orgArguments = arguments as unknown; - const theLogger = getGlobal('filteredDiagLogger') || _noopLogger; + const theLogger = self.getLogger(); const theFunc = theLogger[funcName]; if (typeof theFunc === 'function') { return theFunc.apply( @@ -64,44 +64,28 @@ export class DiagAPI implements DiagLogger { }; } - function getLevel(): DiagLogLevel { - return getGlobal('diagLogLevel') ?? DiagLogLevel.INFO; - } - // Using self local variable for minification purposes as 'this' cannot be minified const self = this; // DiagAPI specific functions self.getLogger = (): DiagLogger => { - return getGlobal('diagLogger') || _noopLogger; + return getGlobal('diag') || _noopLogger; }; - self.setLogger = (logger?: DiagLogger): DiagLogger => { - const previous = getGlobal('diagLogger') || _noopLogger; - - unregisterGlobal('diagLogger'); - unregisterGlobal('filteredDiagLogger'); - - const newLogger = logger || _noopLogger; - registerGlobal('diagLogger', newLogger); - registerGlobal( - 'filteredDiagLogger', - createLogLevelDiagLogger(getLevel(), newLogger) - ); + self.getLoggingDestination = () => { + return getGlobal('diag')?.getLoggingDestination() ?? _noopLogger; + }; - return previous; + self.setLogger = ( + logger: DiagLogger = _noopLogger, + logLevel: DiagLogLevel = DiagLogLevel.INFO + ) => { + registerGlobal('diag', createLogLevelDiagLogger(logLevel, logger)); }; - self.setLogLevel = (maxLogLevel: DiagLogLevel) => { - const logger = self.getLogger(); - unregisterGlobal('diagLogLevel'); - unregisterGlobal('filteredDiagLogger'); - registerGlobal('diagLogLevel', maxLogLevel); - registerGlobal( - 'filteredDiagLogger', - createLogLevelDiagLogger(maxLogLevel, logger) - ); + self.disable = () => { + unregisterGlobal('diag'); }; for (let i = 0; i < diagLoggerFunctions.length; i++) { @@ -119,12 +103,10 @@ export class DiagAPI implements DiagLogger { /** * Set the DiagLogger instance * @param logger - [Optional] The DiagLogger instance to set as the default logger, if not provided it will set it back as a noop + * @param logLevel - [Optional] The DiagLogLevel used to filter logs sent to the logger, if not provided it will default to INFO * @returns The previously registered DiagLogger */ - public setLogger!: (logger?: DiagLogger) => DiagLogger; - - /** Set the default maximum diagnostic logging level */ - public setLogLevel!: (maxLogLevel: DiagLogLevel) => void; + public setLogger!: (logger?: DiagLogger, logLevel?: DiagLogLevel) => void; // DiagLogger implementation public verbose!: DiagLogFunction; @@ -132,4 +114,11 @@ export class DiagAPI implements DiagLogger { public info!: DiagLogFunction; public warn!: DiagLogFunction; public error!: DiagLogFunction; + + /** + * Unregister the global logger and return to Noop + */ + public disable!: () => void; + + public getLoggingDestination!: () => DiagLogger; } diff --git a/src/diag/logLevel.ts b/src/diag/logLevel.ts index 362bb135..1c62db8e 100644 --- a/src/diag/logLevel.ts +++ b/src/diag/logLevel.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { DiagAPI } from '../api/diag'; -import { DiagLogger, DiagLogFunction, createNoopDiagLogger } from './logger'; +import { diag } from '..'; +import { DiagLogger, DiagLogFunction, FilteredDiagLogger } from './logger'; /** * Defines the available internal logging levels for the diagnostic logger, the numeric values @@ -81,19 +81,15 @@ const levelMap: { n: keyof DiagLogger; l: DiagLogLevel }[] = [ export function createLogLevelDiagLogger( maxLevel: DiagLogLevel, logger?: DiagLogger | null -): DiagLogger { +): FilteredDiagLogger { if (maxLevel < DiagLogLevel.NONE) { maxLevel = DiagLogLevel.NONE; } else if (maxLevel > DiagLogLevel.ALL) { maxLevel = DiagLogLevel.ALL; } - if (maxLevel === DiagLogLevel.NONE) { - return createNoopDiagLogger(); - } - if (!logger) { - logger = DiagAPI.instance(); + logger = diag.getLoggingDestination(); } function _filterFunc( @@ -116,11 +112,13 @@ export function createLogLevelDiagLogger( return function () {}; } - const newLogger = {} as DiagLogger; + const newLogger = {} as FilteredDiagLogger; for (let i = 0; i < levelMap.length; i++) { const name = levelMap[i].n; newLogger[name] = _filterFunc(logger, name, levelMap[i].l); } + newLogger.getLoggingDestination = () => logger!; + return newLogger; } diff --git a/src/diag/logger.ts b/src/diag/logger.ts index f718076b..7a868273 100644 --- a/src/diag/logger.ts +++ b/src/diag/logger.ts @@ -59,6 +59,10 @@ export interface DiagLogger { verbose: DiagLogFunction; } +export interface FilteredDiagLogger extends DiagLogger { + getLoggingDestination(): DiagLogger; +} + // DiagLogger implementation export const diagLoggerFunctions: Array = [ 'verbose', @@ -75,12 +79,14 @@ function noopLogFunction() {} * @implements {@link DiagLogger} * @returns {DiagLogger} */ -export function createNoopDiagLogger(): DiagLogger { - const diagLogger = {} as DiagLogger; +export function createNoopDiagLogger(): FilteredDiagLogger { + const diagLogger = {} as FilteredDiagLogger; for (let i = 0; i < diagLoggerFunctions.length; i++) { diagLogger[diagLoggerFunctions[i]] = noopLogFunction; } + diagLogger.getLoggingDestination = () => diagLogger; + return diagLogger; } diff --git a/src/internal/global-utils.ts b/src/internal/global-utils.ts index 12890495..950547e3 100644 --- a/src/internal/global-utils.ts +++ b/src/internal/global-utils.ts @@ -16,8 +16,7 @@ import { diag } from '..'; import { ContextManager } from '../context/types'; -import { DiagLogger } from '../diag/logger'; -import { DiagLogLevel } from '../diag/logLevel'; +import { FilteredDiagLogger } from '../diag/logger'; import { _globalThis } from '../platform'; import { TextMapPropagator } from '../propagation/TextMapPropagator'; import type { TracerProvider } from '../trace/tracer_provider'; @@ -91,10 +90,7 @@ type OTelGlobal = { type OTelGlobalAPI = { version: string; - diagLogger?: DiagLogger; - filteredDiagLogger?: DiagLogger; - diagLogLevel?: DiagLogLevel; - + diag?: FilteredDiagLogger; trace?: TracerProvider; context?: ContextManager; propagation?: TextMapPropagator; diff --git a/test/diag/logLevel.test.ts b/test/diag/logLevel.test.ts index 3b7fa548..714a643e 100644 --- a/test/diag/logLevel.test.ts +++ b/test/diag/logLevel.test.ts @@ -50,8 +50,7 @@ describe('LogLevelFilter DiagLogger', () => { beforeEach(() => { // Set no logger so that sinon doesn't complain about TypeError: Attempted to wrap xxxx which is already wrapped - diag.setLogger(); - diag.setLogLevel(DiagLogLevel.INFO); + diag.disable(); // mock dummyLogger = {} as DiagLogger; @@ -164,8 +163,7 @@ describe('LogLevelFilter DiagLogger', () => { }); it('should use default logger for undefined and log', () => { - diag.setLogger(dummyLogger); - diag.setLogLevel(DiagLogLevel.ALL); + diag.setLogger(dummyLogger, DiagLogLevel.ALL); const testLogger = createLogLevelDiagLogger(map.level, undefined); testLogger[fName](`${fName} called %s`, 'param1'); diagLoggerFunctions.forEach(lName => { @@ -181,8 +179,7 @@ describe('LogLevelFilter DiagLogger', () => { }); it('should use default logger for null and log', () => { - diag.setLogger(dummyLogger); - diag.setLogLevel(DiagLogLevel.ALL); + diag.setLogger(dummyLogger, DiagLogLevel.ALL); const testLogger = createLogLevelDiagLogger(map.level, null); testLogger[fName](`${fName} called %s`, 'param1'); diagLoggerFunctions.forEach(lName => { @@ -200,16 +197,14 @@ describe('LogLevelFilter DiagLogger', () => { levelMap.forEach(masterLevelMap => { describe(`when diag logger is set to ${masterLevelMap.message}`, () => { it('diag setLogLevel is not ignored and using default logger', () => { - diag.setLogger(dummyLogger); - diag.setLogLevel(masterLevelMap.level); + diag.setLogger(dummyLogger, masterLevelMap.level); const testLogger = createLogLevelDiagLogger(map.level); testLogger[fName](`${fName} called %s`, 'param1'); diagLoggerFunctions.forEach(lName => { if ( fName === lName && - map.ignoreFuncs.indexOf(lName) === -1 && - masterLevelMap.ignoreFuncs.indexOf(lName) === -1 + map.ignoreFuncs.indexOf(lName) === -1 ) { assert.deepStrictEqual(calledArgs[lName], [ `${fName} called %s`, @@ -222,12 +217,11 @@ describe('LogLevelFilter DiagLogger', () => { }); it('diag setLogLevel is ignored when using a specific logger', () => { - diag.setLogger(dummyLogger); - diag.setLogLevel(masterLevelMap.level); + diag.setLogger(dummyLogger, masterLevelMap.level); const testLogger = createLogLevelDiagLogger( map.level, - diag.getLogger() + diag.getLoggingDestination() ); testLogger[fName](`${fName} called %s`, 'param1'); diagLoggerFunctions.forEach(lName => { @@ -248,8 +242,7 @@ describe('LogLevelFilter DiagLogger', () => { }); it('diag setLogLevel and logger should log', () => { - diag.setLogger(dummyLogger); - diag.setLogLevel(map.level); + diag.setLogger(dummyLogger, map.level); diag[fName](`${fName} called %s`, 'param1'); diagLoggerFunctions.forEach(lName => { if (fName === lName && map.ignoreFuncs.indexOf(lName) === -1) { diff --git a/test/diag/logger.test.ts b/test/diag/logger.test.ts index a957445b..70258bbc 100644 --- a/test/diag/logger.test.ts +++ b/test/diag/logger.test.ts @@ -48,6 +48,7 @@ describe('DiagLogger functions', () => { diagLoggerFunctions.forEach(fName => { calledArgs[fName] = null; }); + diag.disable(); }); describe('constructor', () => { @@ -68,8 +69,7 @@ describe('DiagLogger functions', () => { }); it(`diag should log with ${fName} message`, () => { - diag.setLogger(dummyLogger); - diag.setLogLevel(DiagLogLevel.ALL); + diag.setLogger(dummyLogger, DiagLogLevel.ALL); diag[fName](`${fName} called %s`, 'param1'); diagLoggerFunctions.forEach(lName => { if (fName === lName) {