From 087b716c0dd40d49490911c2eb5c5ba598918d85 Mon Sep 17 00:00:00 2001 From: Nacho Vazquez Date: Thu, 16 Jul 2020 21:07:46 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20create=20general=20struc?= =?UTF-8?q?ture=20of=20lumberjack=20library?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add lumberjack core BREAKING CHANGE: add lumberjack core --- .../src/lib/configs/default-log.config.ts | 8 +++ .../src/lib/configs/log-driver.config.ts | 18 +++++ .../src/lib/configs/lumberjack-log.config.ts | 10 +++ .../lumberjack/src/lib/log-creator.ts | 6 ++ .../console-driver/console-driver.module.ts | 26 +++++++ .../console-driver/console.driver.ts | 19 +++++ .../lib/log-drivers/console-driver/index.ts | 1 + .../http-driver/http-driver.config.ts | 28 ++++++++ .../http-driver/http-driver.module.ts | 28 ++++++++ .../log-drivers/http-driver/http.driver.ts | 53 ++++++++++++++ .../src/lib/log-drivers/http-driver/index.ts | 2 + .../lumberjack/src/lib/log-drivers/index.ts | 3 + .../src/lib/log-drivers/log-driver.ts | 12 ++++ .../src/lib/log-types/debug-logs/index.ts | 7 ++ .../src/lib/log-types/error-logs/index.ts | 7 ++ .../lumberjack/src/lib/log-types/index.ts | 4 ++ .../src/lib/log-types/info-logs/index.ts | 7 ++ .../src/lib/log-types/warning-logs/index.ts | 7 ++ .../src/lib/lumberjack-log-levels.ts | 11 +++ .../lumberjack/src/lib/lumberjack-log.ts | 11 +++ .../src/lib/lumberjack.component.spec.ts | 14 ---- .../src/lib/lumberjack.component.ts | 16 ----- .../lumberjack/src/lib/lumberjack.module.ts | 30 ++++++-- .../src/lib/lumberjack.service.spec.ts | 13 ---- .../lumberjack/src/lib/lumberjack.service.ts | 69 +++++++++++++++++-- .../ngworker/lumberjack/src/public-api.ts | 4 +- 26 files changed, 358 insertions(+), 56 deletions(-) create mode 100644 projects/ngworker/lumberjack/src/lib/configs/default-log.config.ts create mode 100644 projects/ngworker/lumberjack/src/lib/configs/log-driver.config.ts create mode 100644 projects/ngworker/lumberjack/src/lib/configs/lumberjack-log.config.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-creator.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/console-driver.module.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/console.driver.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/index.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http-driver.config.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http-driver.module.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http.driver.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/index.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-drivers/index.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-drivers/log-driver.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-types/debug-logs/index.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-types/error-logs/index.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-types/index.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-types/info-logs/index.ts create mode 100644 projects/ngworker/lumberjack/src/lib/log-types/warning-logs/index.ts create mode 100644 projects/ngworker/lumberjack/src/lib/lumberjack-log-levels.ts create mode 100644 projects/ngworker/lumberjack/src/lib/lumberjack-log.ts delete mode 100644 projects/ngworker/lumberjack/src/lib/lumberjack.component.spec.ts delete mode 100644 projects/ngworker/lumberjack/src/lib/lumberjack.component.ts delete mode 100644 projects/ngworker/lumberjack/src/lib/lumberjack.service.spec.ts diff --git a/projects/ngworker/lumberjack/src/lib/configs/default-log.config.ts b/projects/ngworker/lumberjack/src/lib/configs/default-log.config.ts new file mode 100644 index 000000000..21d641db7 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/configs/default-log.config.ts @@ -0,0 +1,8 @@ +import { LumberjackLogConfig } from './lumberjack-log.config'; +import { LumberjackLog } from '../lumberjack-log'; + +export const defaultLogConfig: LumberjackLogConfig = { + format(logEntry: LumberjackLog): string { + return `${logEntry.level.toString()} ${new Date().toISOString()} [${logEntry.context}] ${logEntry.message}`; + }, +}; diff --git a/projects/ngworker/lumberjack/src/lib/configs/log-driver.config.ts b/projects/ngworker/lumberjack/src/lib/configs/log-driver.config.ts new file mode 100644 index 000000000..82a5aede1 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/configs/log-driver.config.ts @@ -0,0 +1,18 @@ +import { InjectionToken } from '@angular/core'; +import { LumberjackLogLevel } from '../lumberjack-log-levels'; + +export const LogDriverConfigToken: InjectionToken = new InjectionToken('__LOG_DRIVER_CONFIG__'); + +export interface LogDriverConfig { + /** + * List of levels to which the log-driver is allowed to log. + * + * If undefined all levels are allowed. + * + */ + levels?: LumberjackLogLevel[]; +} + +export const defaultLogDriverConfig = { + levels: undefined, +}; diff --git a/projects/ngworker/lumberjack/src/lib/configs/lumberjack-log.config.ts b/projects/ngworker/lumberjack/src/lib/configs/lumberjack-log.config.ts new file mode 100644 index 000000000..d90912b60 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/configs/lumberjack-log.config.ts @@ -0,0 +1,10 @@ +import { InjectionToken } from '@angular/core'; +import { LumberjackLog } from '../lumberjack-log'; + +export const LumberjackLogConfigToken: InjectionToken = new InjectionToken( + '__LUMBERJACK_LOG_CONFIG__' +); + +export interface LumberjackLogConfig { + format(logEntry: LumberjackLog): string; +} diff --git a/projects/ngworker/lumberjack/src/lib/log-creator.ts b/projects/ngworker/lumberjack/src/lib/log-creator.ts new file mode 100644 index 000000000..0da9c289c --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-creator.ts @@ -0,0 +1,6 @@ +import { LumberjackLog } from './Lumberjack-log'; +import { LumberjackLogLevel } from './Lumberjack-log-levels'; + +export function createLog(level: LumberjackLogLevel, message: string, context?: string): () => LumberjackLog { + return () => ({ level, message, context }); +} diff --git a/projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/console-driver.module.ts b/projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/console-driver.module.ts new file mode 100644 index 000000000..bc6fd2729 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/console-driver.module.ts @@ -0,0 +1,26 @@ +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { LogDriverConfig, LogDriverConfigToken } from '../../configs/log-driver.config'; +import { ConsoleDriver } from './console.driver'; +import { LogDriverToken } from '../log-driver'; + +export function consoleFactory(config: LogDriverConfig): ConsoleDriver { + return new ConsoleDriver(config); +} + +@NgModule() +export class ConsoleDriverModule { + static forRoot(config: LogDriverConfig = {}): ModuleWithProviders { + return { + ngModule: ConsoleDriverModule, + providers: [ + { provide: LogDriverConfigToken, useValue: config }, + { + provide: LogDriverToken, + useFactory: consoleFactory, + multi: true, + deps: [LogDriverConfigToken], + }, + ], + }; + } +} diff --git a/projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/console.driver.ts b/projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/console.driver.ts new file mode 100644 index 000000000..3ecc7a37e --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/console.driver.ts @@ -0,0 +1,19 @@ +import { LogDriverConfig } from '../../configs/log-driver.config'; +import { LogDriver } from '../log-driver'; + +export class ConsoleDriver implements LogDriver { + constructor(public config: LogDriverConfig) {} + + logInfo(logEntry: string): void { + console.log(logEntry); + } + logDebug(logEntry: string): void { + console.log(logEntry); + } + logError(logEntry: string): void { + console.error(logEntry); + } + logWarning(logEntry: string): void { + console.warn(logEntry); + } +} diff --git a/projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/index.ts b/projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/index.ts new file mode 100644 index 000000000..488e028b0 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-drivers/console-driver/index.ts @@ -0,0 +1 @@ +export * from './console-driver.module'; diff --git a/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http-driver.config.ts b/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http-driver.config.ts new file mode 100644 index 000000000..e449e00b6 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http-driver.config.ts @@ -0,0 +1,28 @@ +import { InjectionToken } from '@angular/core'; +import { LogDriverConfig } from '../../configs/log-driver.config'; + +export const HttpDriverConfigToken: InjectionToken = new InjectionToken('__HTTP_DRIVER_CONFIG__'); + +export interface HttpDriverConfig extends LogDriverConfig { + /** + * + * The identifier of the app who emitted the log. + * This is used to organize logs on the log store. + * + */ + origin: string; + /** + * + * The url of the log store endpoint. + * + * The endpoint matching this url MUST support the POST method. + */ + storeUrl: string; + + /** + * + * Defines the amount of log that should be written before sending them to the log store. + * + */ + logWagonSize: number; +} diff --git a/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http-driver.module.ts b/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http-driver.module.ts new file mode 100644 index 000000000..c94bf732a --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http-driver.module.ts @@ -0,0 +1,28 @@ +import { HttpClient } from '@angular/common/http'; +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { HttpDriverConfig, HttpDriverConfigToken } from './http-driver.config'; +import { HttpDriver } from './http.driver'; +import { LogDriverToken } from '../log-driver'; + +// factory functions need to extracted and exported for AOT +export function httpDriverFactory(httpClient: HttpClient, config: HttpDriverConfig): HttpDriver { + return new HttpDriver(httpClient, config); +} + +@NgModule() +export class HttpDriverModule { + static forRoot(config: HttpDriverConfig): ModuleWithProviders { + return { + ngModule: HttpDriverModule, + providers: [ + { provide: HttpDriverConfigToken, useValue: config }, + { + provide: LogDriverToken, + useFactory: httpDriverFactory, + deps: [HttpClient, HttpDriverConfigToken], + multi: true, + }, + ], + }; + } +} diff --git a/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http.driver.ts b/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http.driver.ts new file mode 100644 index 000000000..26a7556b3 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/http.driver.ts @@ -0,0 +1,53 @@ +import { HttpClient } from '@angular/common/http'; +import { LumberjackLogLevel } from '../../lumberjack-log-levels'; +import { LogDriver } from '../log-driver'; +import { HttpDriverConfig } from './http-driver.config'; + +interface HttpLogEntry { + logEntry: string; + level: LumberjackLogLevel; +} + +interface HttpLogPackage { + logWagon: HttpLogEntry[]; + origin: string; +} + +export class HttpDriver implements LogDriver { + logWagon: HttpLogEntry[] = []; + + constructor(private http: HttpClient, public config: HttpDriverConfig) {} + + logInfo(logEntry: string): void { + this.log(logEntry, LumberjackLogLevel.Info); + } + + logDebug(logEntry: string): void { + this.log(logEntry, LumberjackLogLevel.Debug); + } + + logError(logEntry: string): void { + this.log(logEntry, LumberjackLogLevel.Error); + } + + logWarning(logEntry: string): void { + this.log(logEntry, LumberjackLogLevel.Warning); + } + + private log(logEntry: string, logLevel: LumberjackLogLevel): void { + this.logWagon.push({ logEntry, level: logLevel }); + + const { origin, storeUrl, logWagonSize } = this.config; + + if (this.logWagon.length >= logWagonSize) { + const logPackage: HttpLogPackage = { logWagon: this.logWagon, origin }; + + this.http.post(storeUrl, logPackage).subscribe({ + next: () => { + // clear the wagon on success + this.logWagon = []; + }, + }); + } + } +} diff --git a/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/index.ts b/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/index.ts new file mode 100644 index 000000000..62a874275 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-drivers/http-driver/index.ts @@ -0,0 +1,2 @@ +export * from './http-driver.module'; +export * from './http-driver.config'; diff --git a/projects/ngworker/lumberjack/src/lib/log-drivers/index.ts b/projects/ngworker/lumberjack/src/lib/log-drivers/index.ts new file mode 100644 index 000000000..679b8b3ac --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-drivers/index.ts @@ -0,0 +1,3 @@ +export * from './log-driver'; +export * from './console-driver'; +export * from './http-driver'; diff --git a/projects/ngworker/lumberjack/src/lib/log-drivers/log-driver.ts b/projects/ngworker/lumberjack/src/lib/log-drivers/log-driver.ts new file mode 100644 index 000000000..c7bdc7f9a --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-drivers/log-driver.ts @@ -0,0 +1,12 @@ +import { InjectionToken } from '@angular/core'; +import { LogDriverConfig } from '../configs/log-driver.config'; + +export const LogDriverToken: InjectionToken = new InjectionToken('__LUMBERJACK_LOG_DRIVER_TOKEN__'); + +export interface LogDriver { + config: LogDriverConfig; + logInfo(logEntry: string): void; + logDebug(logEntry: string): void; + logError(logEntry: string): void; + logWarning(logEntry: string): void; +} diff --git a/projects/ngworker/lumberjack/src/lib/log-types/debug-logs/index.ts b/projects/ngworker/lumberjack/src/lib/log-types/debug-logs/index.ts new file mode 100644 index 000000000..e6e632020 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-types/debug-logs/index.ts @@ -0,0 +1,7 @@ +import { createLog } from '../../log-creator'; +import { LumberjackLogLevel } from '../../Lumberjack-log-levels'; +import { LumberjackLog } from '../../lumberjack-log'; + +export function createDebugLog(message: string, context: string = ''): () => LumberjackLog { + return createLog(LumberjackLogLevel.Debug, message, context); +} diff --git a/projects/ngworker/lumberjack/src/lib/log-types/error-logs/index.ts b/projects/ngworker/lumberjack/src/lib/log-types/error-logs/index.ts new file mode 100644 index 000000000..f4e76d2d2 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-types/error-logs/index.ts @@ -0,0 +1,7 @@ +import { createLog } from '../../log-creator'; +import { LumberjackLogLevel } from '../../Lumberjack-log-levels'; +import { LumberjackLog } from '../../lumberjack-log'; + +export function createErrorLog(message: string, context: string = ''): () => LumberjackLog { + return createLog(LumberjackLogLevel.Error, message, context); +} diff --git a/projects/ngworker/lumberjack/src/lib/log-types/index.ts b/projects/ngworker/lumberjack/src/lib/log-types/index.ts new file mode 100644 index 000000000..d54620ebf --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-types/index.ts @@ -0,0 +1,4 @@ +export * from './error-logs'; +export * from './info-logs'; +export * from './warning-logs'; +export * from './debug-logs'; diff --git a/projects/ngworker/lumberjack/src/lib/log-types/info-logs/index.ts b/projects/ngworker/lumberjack/src/lib/log-types/info-logs/index.ts new file mode 100644 index 000000000..a231efcc0 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-types/info-logs/index.ts @@ -0,0 +1,7 @@ +import { createLog } from '../../log-creator'; +import { LumberjackLogLevel } from '../../Lumberjack-log-levels'; +import { LumberjackLog } from '../../lumberjack-log'; + +export function createInfoLog(message: string, context: string = ''): () => LumberjackLog { + return createLog(LumberjackLogLevel.Info, message, context); +} diff --git a/projects/ngworker/lumberjack/src/lib/log-types/warning-logs/index.ts b/projects/ngworker/lumberjack/src/lib/log-types/warning-logs/index.ts new file mode 100644 index 000000000..27c0bf754 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/log-types/warning-logs/index.ts @@ -0,0 +1,7 @@ +import { createLog } from '../../log-creator'; +import { LumberjackLogLevel } from '../../Lumberjack-log-levels'; +import { LumberjackLog } from '../../lumberjack-log'; + +export function createWarningLog(message: string, context: string = ''): () => LumberjackLog { + return createLog(LumberjackLogLevel.Warning, message, context); +} diff --git a/projects/ngworker/lumberjack/src/lib/lumberjack-log-levels.ts b/projects/ngworker/lumberjack/src/lib/lumberjack-log-levels.ts new file mode 100644 index 000000000..953b8d70d --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/lumberjack-log-levels.ts @@ -0,0 +1,11 @@ +/* + * Log levels used by our `Lumberjack` Loggers + * + */ +export enum LumberjackLogLevel { + Debug = 'debug', + Verbose = 'verbose', + Info = 'info', + Warning = 'warn', + Error = 'error', +} diff --git a/projects/ngworker/lumberjack/src/lib/lumberjack-log.ts b/projects/ngworker/lumberjack/src/lib/lumberjack-log.ts new file mode 100644 index 000000000..1c2b0e502 --- /dev/null +++ b/projects/ngworker/lumberjack/src/lib/lumberjack-log.ts @@ -0,0 +1,11 @@ +import { LumberjackLogLevel } from './lumberjack-log-levels'; + +/** + * Represents a Lumberjack specific log. + * + */ +export interface LumberjackLog { + level: LumberjackLogLevel; + message: string; + context: string | undefined; +} diff --git a/projects/ngworker/lumberjack/src/lib/lumberjack.component.spec.ts b/projects/ngworker/lumberjack/src/lib/lumberjack.component.spec.ts deleted file mode 100644 index 3357b586e..000000000 --- a/projects/ngworker/lumberjack/src/lib/lumberjack.component.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Spectator, createComponentFactory } from '@ngneat/spectator'; - -import { LumberjackComponent } from './lumberjack.component'; - -describe('LumberjackComponent', () => { - let spectator: Spectator; - const createComponent = createComponentFactory(LumberjackComponent); - - it('should create', () => { - spectator = createComponent(); - - expect(spectator.component).toBeTruthy(); - }); -}); diff --git a/projects/ngworker/lumberjack/src/lib/lumberjack.component.ts b/projects/ngworker/lumberjack/src/lib/lumberjack.component.ts deleted file mode 100644 index 367112bd9..000000000 --- a/projects/ngworker/lumberjack/src/lib/lumberjack.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'lib-lumberjack', - template: ` -

- lumberjack works! -

- `, - styles: [], -}) -export class LumberjackComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/ngworker/lumberjack/src/lib/lumberjack.module.ts b/projects/ngworker/lumberjack/src/lib/lumberjack.module.ts index 076922a6c..07327bd78 100644 --- a/projects/ngworker/lumberjack/src/lib/lumberjack.module.ts +++ b/projects/ngworker/lumberjack/src/lib/lumberjack.module.ts @@ -1,9 +1,27 @@ -import { NgModule } from '@angular/core'; -import { LumberjackComponent } from './lumberjack.component'; +import { CommonModule } from '@angular/common'; +import { ModuleWithProviders, NgModule } from '@angular/core'; + +import { defaultLogConfig } from './configs/default-log.config'; +import { LumberjackLogConfig, LumberjackLogConfigToken } from './configs/lumberjack-log.config'; +import { LogDriverConfigToken, defaultLogDriverConfig } from './configs/log-driver.config'; @NgModule({ - declarations: [LumberjackComponent], - imports: [], - exports: [LumberjackComponent], + imports: [CommonModule], }) -export class LumberjackModule {} +export class NgLoggerModule { + static forRoot(config: LumberjackLogConfig = defaultLogConfig): ModuleWithProviders { + return { + ngModule: NgLoggerModule, + providers: [ + { + provide: LumberjackLogConfigToken, + useValue: config, + }, + { + provide: LogDriverConfigToken, + useValue: defaultLogDriverConfig, + }, + ], + }; + } +} diff --git a/projects/ngworker/lumberjack/src/lib/lumberjack.service.spec.ts b/projects/ngworker/lumberjack/src/lib/lumberjack.service.spec.ts deleted file mode 100644 index b8152f1aa..000000000 --- a/projects/ngworker/lumberjack/src/lib/lumberjack.service.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createServiceFactory, SpectatorService } from '@ngneat/spectator'; -import { LumberjackService } from './lumberjack.service'; - -describe('LumberjackService', () => { - let spectator: SpectatorService; - const createService = createServiceFactory(LumberjackService); - - beforeEach(() => (spectator = createService())); - - it('should...', () => { - expect(spectator.service).toBeTruthy(); - }); -}); diff --git a/projects/ngworker/lumberjack/src/lib/lumberjack.service.ts b/projects/ngworker/lumberjack/src/lib/lumberjack.service.ts index 3ad19f8bf..b8ae67231 100644 --- a/projects/ngworker/lumberjack/src/lib/lumberjack.service.ts +++ b/projects/ngworker/lumberjack/src/lib/lumberjack.service.ts @@ -1,8 +1,67 @@ -import { Injectable } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; -@Injectable({ - providedIn: 'root', -}) +import { LumberjackLogConfig, LumberjackLogConfigToken } from './configs/lumberjack-log.config'; +import { LogDriver, LogDriverToken } from './log-drivers'; +import { LumberjackLog } from './lumberjack-log'; +import { LumberjackLogLevel } from './lumberjack-log-levels'; + +/** + * Service responsible to add logs to the applications. + * + * It's API provides a single `log` method, which will load all `log-drivers` + * provided through the application. + * + * + */ +@Injectable({ providedIn: 'root' }) export class LumberjackService { - constructor() {} + constructor( + @Inject(LumberjackLogConfigToken) private config: LumberjackLogConfig, + // Each driver must be provided with multi. That way we can capture every provided driver + // and use it to log to its output. + @Inject(LogDriverToken) private logDrivers: LogDriver[] + ) {} + + log(logItem: LumberjackLog): void { + const { format } = this.config; + + for (const logDriver of this.logDrivers) { + if (this.canDriveLog(logDriver, logItem.level)) { + this.logToTheRightLevel(logDriver, logItem, format); + } + } + } + + private canDriveLog(driver: LogDriver, level: LumberjackLogLevel): boolean { + return driver.config.levels === undefined || driver.config.levels.includes(level); + } + + private logToTheRightLevel( + driver: LogDriver, + logItem: LumberjackLog, + format: (logEntry: LumberjackLog) => string + ): void { + switch (logItem.level) { + case LumberjackLogLevel.Info: + driver.logInfo(format(logItem)); + + break; + case LumberjackLogLevel.Error: + driver.logError(format(logItem)); + + break; + case LumberjackLogLevel.Warning: + driver.logWarning(format(logItem)); + + break; + case LumberjackLogLevel.Debug: + driver.logDebug(format(logItem)); + + break; + default: + driver.logInfo(format(logItem)); + + break; + } + } } diff --git a/projects/ngworker/lumberjack/src/public-api.ts b/projects/ngworker/lumberjack/src/public-api.ts index 6b7a124e8..6fc028f2d 100644 --- a/projects/ngworker/lumberjack/src/public-api.ts +++ b/projects/ngworker/lumberjack/src/public-api.ts @@ -2,6 +2,6 @@ * Public API Surface of lumberjack */ -export * from './lib/lumberjack.service'; -export * from './lib/lumberjack.component'; export * from './lib/lumberjack.module'; +export * from './lib/lumberjack.service'; +export * from './lib/log-drivers';