change: use regular getters and setters in LazyLoggerFactory

This commit is contained in:
Ruben Taelman 2020-09-23 09:43:48 +02:00 committed by Ruben Taelman
parent b62f4eb016
commit f186bece9f
6 changed files with 40 additions and 28 deletions

View File

@ -22,8 +22,7 @@ export class LazyLogger extends Logger {
public log(level: LogLevel, message: string, meta: any): Logger { public log(level: LogLevel, message: string, meta: any): Logger {
if (!this.logger) { if (!this.logger) {
this.logger = this.lazyLoggerFactory.getLoggerFactoryOrThrow() this.logger = this.lazyLoggerFactory.loggerFactory.createLogger(this.label);
.createLogger(this.label);
} }
return this.logger.log(level, message, meta); return this.logger.log(level, message, meta);
} }

View File

@ -14,7 +14,7 @@ import type { LoggerFactory } from './LoggerFactory';
export class LazyLoggerFactory implements LoggerFactory { export class LazyLoggerFactory implements LoggerFactory {
private static readonly instance = new LazyLoggerFactory(); private static readonly instance = new LazyLoggerFactory();
private loggerFactory: LoggerFactory | undefined; private ploggerFactory: LoggerFactory | undefined;
private constructor() { private constructor() {
// Singleton instance // Singleton instance
@ -28,14 +28,18 @@ export class LazyLoggerFactory implements LoggerFactory {
return new LazyLogger(this, label); return new LazyLogger(this, label);
} }
public setLoggerFactory(loggerFactory: LoggerFactory | undefined): void { public resetLoggerFactory(): void {
this.loggerFactory = loggerFactory; this.ploggerFactory = undefined;
} }
public getLoggerFactoryOrThrow(): LoggerFactory { public get loggerFactory(): LoggerFactory {
if (!this.loggerFactory) { if (!this.ploggerFactory) {
throw new Error('No logger factory has been set yet. Can be caused logger invocation during initialization.'); throw new Error('No logger factory has been set yet. Can be caused logger invocation during initialization.');
} }
return this.loggerFactory; return this.ploggerFactory;
}
public set loggerFactory(loggerFactory: LoggerFactory) {
this.ploggerFactory = loggerFactory;
} }
} }

View File

@ -20,16 +20,25 @@ import type { LoggerFactory } from './LoggerFactory';
* *
* @param loggable - A class instance or a class string name. * @param loggable - A class instance or a class string name.
*/ */
export const getLoggerFor = (loggable: string | Instance): Logger => LazyLoggerFactory export const getLoggerFor = (loggable: string | Instance): Logger => LazyLoggerFactory.getInstance()
.getInstance().createLogger(typeof loggable === 'string' ? loggable : loggable.constructor.name); .createLogger(typeof loggable === 'string' ? loggable : loggable.constructor.name);
/** /**
* Sets the global logger factory. * Sets the global logger factory.
* This will cause all loggers created by {@link getLoggerFor} to be delegated to a logger from the given factory. * This will cause all loggers created by {@link getLoggerFor} to be delegated to a logger from the given factory.
* @param loggerFactory - A logger factory, of undefined for unsetting it. * @param loggerFactory - A logger factory.
*/ */
export const setGlobalLoggerFactory = (loggerFactory: LoggerFactory | undefined): void => LazyLoggerFactory export const setGlobalLoggerFactory = (loggerFactory: LoggerFactory): void => {
.getInstance().setLoggerFactory(loggerFactory); LazyLoggerFactory.getInstance().loggerFactory = loggerFactory;
};
/**
* Resets the global logger factory to undefined.
*
* This typically only needs to be called during testing.
* Call this at your own risk.
*/
export const resetGlobalLoggerFactory = (): void => LazyLoggerFactory.getInstance().resetLoggerFactory();
/** /**
* Helper interface to identify class instances. * Helper interface to identify class instances.

View File

@ -6,7 +6,7 @@ describe('LazyLogger', (): void => {
let logger: LazyLogger; let logger: LazyLogger;
beforeEach(async(): Promise<void> => { beforeEach(async(): Promise<void> => {
lazyLoggerFactory = LazyLoggerFactory.getInstance(); lazyLoggerFactory = LazyLoggerFactory.getInstance();
lazyLoggerFactory.setLoggerFactory(undefined); lazyLoggerFactory.resetLoggerFactory();
logger = new LazyLogger(lazyLoggerFactory, 'MyLabel'); logger = new LazyLogger(lazyLoggerFactory, 'MyLabel');
}); });
@ -22,7 +22,7 @@ describe('LazyLogger', (): void => {
const dummyLoggerFactory: any = { const dummyLoggerFactory: any = {
createLogger: jest.fn((): any => dummyLogger), createLogger: jest.fn((): any => dummyLogger),
}; };
lazyLoggerFactory.setLoggerFactory(dummyLoggerFactory); lazyLoggerFactory.loggerFactory = dummyLoggerFactory;
expect(logger.log('debug', 'my message', { abc: true })).toBe(dummyLogger); expect(logger.log('debug', 'my message', { abc: true })).toBe(dummyLogger);
expect(dummyLoggerFactory.createLogger).toHaveBeenCalledTimes(1); expect(dummyLoggerFactory.createLogger).toHaveBeenCalledTimes(1);
@ -38,7 +38,7 @@ describe('LazyLogger', (): void => {
const dummyLoggerFactory: any = { const dummyLoggerFactory: any = {
createLogger: jest.fn((): any => dummyLogger), createLogger: jest.fn((): any => dummyLogger),
}; };
lazyLoggerFactory.setLoggerFactory(dummyLoggerFactory); lazyLoggerFactory.loggerFactory = dummyLoggerFactory;
expect(logger.log('debug', 'my message 1', { abc: true })).toBe(dummyLogger); expect(logger.log('debug', 'my message 1', { abc: true })).toBe(dummyLogger);
expect(logger.log('debug', 'my message 2', { abc: true })).toBe(dummyLogger); expect(logger.log('debug', 'my message 2', { abc: true })).toBe(dummyLogger);

View File

@ -5,7 +5,7 @@ describe('LazyLoggerFactory', (): void => {
let dummyLogger: any; let dummyLogger: any;
let dummyLoggerFactory: any; let dummyLoggerFactory: any;
beforeEach(async(): Promise<void> => { beforeEach(async(): Promise<void> => {
LazyLoggerFactory.getInstance().setLoggerFactory(undefined); LazyLoggerFactory.getInstance().resetLoggerFactory();
dummyLogger = { dummyLogger = {
log: jest.fn((): any => dummyLogger), log: jest.fn((): any => dummyLogger),
}; };
@ -24,23 +24,23 @@ describe('LazyLoggerFactory', (): void => {
}); });
it('allows LazyLoggers to be created after an inner factory was set.', async(): Promise<void> => { it('allows LazyLoggers to be created after an inner factory was set.', async(): Promise<void> => {
LazyLoggerFactory.getInstance().setLoggerFactory(dummyLoggerFactory); LazyLoggerFactory.getInstance().loggerFactory = dummyLoggerFactory;
const logger = LazyLoggerFactory.getInstance().createLogger('MyLabel'); const logger = LazyLoggerFactory.getInstance().createLogger('MyLabel');
expect(logger).toBeInstanceOf(LazyLogger); expect(logger).toBeInstanceOf(LazyLogger);
}); });
it('throws when retrieving the inner factory if none has been set.', async(): Promise<void> => { it('throws when retrieving the inner factory if none has been set.', async(): Promise<void> => {
expect((): any => LazyLoggerFactory.getInstance().getLoggerFactoryOrThrow()) expect((): any => LazyLoggerFactory.getInstance().loggerFactory)
.toThrow(new Error('No logger factory has been set yet. Can be caused logger invocation during initialization.')); .toThrow(new Error('No logger factory has been set yet. Can be caused logger invocation during initialization.'));
}); });
it('Returns the inner factory if one has been set.', async(): Promise<void> => { it('Returns the inner factory if one has been set.', async(): Promise<void> => {
LazyLoggerFactory.getInstance().setLoggerFactory(dummyLoggerFactory); LazyLoggerFactory.getInstance().loggerFactory = dummyLoggerFactory;
expect(LazyLoggerFactory.getInstance().getLoggerFactoryOrThrow()).toBe(dummyLoggerFactory); expect(LazyLoggerFactory.getInstance().loggerFactory).toBe(dummyLoggerFactory);
}); });
it('allows LazyLoggers to be invoked if a factory has been set beforehand.', async(): Promise<void> => { it('allows LazyLoggers to be invoked if a factory has been set beforehand.', async(): Promise<void> => {
LazyLoggerFactory.getInstance().setLoggerFactory(dummyLoggerFactory); LazyLoggerFactory.getInstance().loggerFactory = dummyLoggerFactory;
const logger = LazyLoggerFactory.getInstance().createLogger('MyLabel'); const logger = LazyLoggerFactory.getInstance().createLogger('MyLabel');
logger.log('debug', 'my message', { abc: true }); logger.log('debug', 'my message', { abc: true });
@ -50,7 +50,7 @@ describe('LazyLoggerFactory', (): void => {
it('allows LazyLoggers to be invoked if a factory has been after lazy logger creation.', async(): Promise<void> => { it('allows LazyLoggers to be invoked if a factory has been after lazy logger creation.', async(): Promise<void> => {
const logger = LazyLoggerFactory.getInstance().createLogger('MyLabel'); const logger = LazyLoggerFactory.getInstance().createLogger('MyLabel');
LazyLoggerFactory.getInstance().setLoggerFactory(dummyLoggerFactory); LazyLoggerFactory.getInstance().loggerFactory = dummyLoggerFactory;
logger.log('debug', 'my message', { abc: true }); logger.log('debug', 'my message', { abc: true });
expect(dummyLogger.log).toHaveBeenCalledTimes(1); expect(dummyLogger.log).toHaveBeenCalledTimes(1);

View File

@ -1,12 +1,12 @@
import { LazyLogger } from '../../../src/logging/LazyLogger'; import { LazyLogger } from '../../../src/logging/LazyLogger';
import { LazyLoggerFactory } from '../../../src/logging/LazyLoggerFactory'; import { LazyLoggerFactory } from '../../../src/logging/LazyLoggerFactory';
import { getLoggerFor, setGlobalLoggerFactory } from '../../../src/logging/LogUtil'; import { getLoggerFor, resetGlobalLoggerFactory, setGlobalLoggerFactory } from '../../../src/logging/LogUtil';
import { VoidLogger } from '../../../src/logging/VoidLogger'; import { VoidLogger } from '../../../src/logging/VoidLogger';
import { VoidLoggerFactory } from '../../../src/logging/VoidLoggerFactory'; import { VoidLoggerFactory } from '../../../src/logging/VoidLoggerFactory';
describe('LogUtil', (): void => { describe('LogUtil', (): void => {
beforeEach(async(): Promise<void> => { beforeEach(async(): Promise<void> => {
setGlobalLoggerFactory(undefined); resetGlobalLoggerFactory();
}); });
it('allows creating a lazy logger for a string label.', async(): Promise<void> => { it('allows creating a lazy logger for a string label.', async(): Promise<void> => {
@ -21,13 +21,13 @@ describe('LogUtil', (): void => {
it('allows setting the global logger factory.', async(): Promise<void> => { it('allows setting the global logger factory.', async(): Promise<void> => {
expect(setGlobalLoggerFactory(new VoidLoggerFactory())); expect(setGlobalLoggerFactory(new VoidLoggerFactory()));
expect(LazyLoggerFactory.getInstance().getLoggerFactoryOrThrow()).toBeInstanceOf(VoidLoggerFactory); expect(LazyLoggerFactory.getInstance().loggerFactory).toBeInstanceOf(VoidLoggerFactory);
}); });
it('allows unsetting the global logger factory.', async(): Promise<void> => { it('allows unsetting the global logger factory.', async(): Promise<void> => {
expect(setGlobalLoggerFactory(new VoidLoggerFactory())); expect(setGlobalLoggerFactory(new VoidLoggerFactory()));
expect(setGlobalLoggerFactory(undefined)); expect(resetGlobalLoggerFactory());
expect((): any => LazyLoggerFactory.getInstance().getLoggerFactoryOrThrow()) expect((): any => LazyLoggerFactory.getInstance().loggerFactory)
.toThrow(new Error('No logger factory has been set yet. Can be caused logger invocation during initialization.')); .toThrow(new Error('No logger factory has been set yet. Can be caused logger invocation during initialization.'));
}); });
}); });