Skip to content

Commit

Permalink
feat: 🎸 create general structure of lumberjack library
Browse files Browse the repository at this point in the history
- add lumberjack core

BREAKING CHANGE: add lumberjack core
  • Loading branch information
nacho-vazquez committed Jul 17, 2020
1 parent 2cfac30 commit 087b716
Show file tree
Hide file tree
Showing 26 changed files with 358 additions and 56 deletions.
Original file line number Diff line number Diff line change
@@ -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}`;
},
};
18 changes: 18 additions & 0 deletions projects/ngworker/lumberjack/src/lib/configs/log-driver.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { InjectionToken } from '@angular/core';
import { LumberjackLogLevel } from '../lumberjack-log-levels';

export const LogDriverConfigToken: InjectionToken<LogDriverConfig> = 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,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { InjectionToken } from '@angular/core';
import { LumberjackLog } from '../lumberjack-log';

export const LumberjackLogConfigToken: InjectionToken<LumberjackLogConfig> = new InjectionToken(
'__LUMBERJACK_LOG_CONFIG__'
);

export interface LumberjackLogConfig {
format(logEntry: LumberjackLog): string;
}
6 changes: 6 additions & 0 deletions projects/ngworker/lumberjack/src/lib/log-creator.ts
Original file line number Diff line number Diff line change
@@ -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 });
}
Original file line number Diff line number Diff line change
@@ -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<ConsoleDriverModule> {
return {
ngModule: ConsoleDriverModule,
providers: [
{ provide: LogDriverConfigToken, useValue: config },
{
provide: LogDriverToken,
useFactory: consoleFactory,
multi: true,
deps: [LogDriverConfigToken],
},
],
};
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './console-driver.module';
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { InjectionToken } from '@angular/core';
import { LogDriverConfig } from '../../configs/log-driver.config';

export const HttpDriverConfigToken: InjectionToken<HttpDriverConfig> = 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;
}
Original file line number Diff line number Diff line change
@@ -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<HttpDriverModule> {
return {
ngModule: HttpDriverModule,
providers: [
{ provide: HttpDriverConfigToken, useValue: config },
{
provide: LogDriverToken,
useFactory: httpDriverFactory,
deps: [HttpClient, HttpDriverConfigToken],
multi: true,
},
],
};
}
}
Original file line number Diff line number Diff line change
@@ -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 = [];
},
});
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './http-driver.module';
export * from './http-driver.config';
3 changes: 3 additions & 0 deletions projects/ngworker/lumberjack/src/lib/log-drivers/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './log-driver';
export * from './console-driver';
export * from './http-driver';
12 changes: 12 additions & 0 deletions projects/ngworker/lumberjack/src/lib/log-drivers/log-driver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { InjectionToken } from '@angular/core';
import { LogDriverConfig } from '../configs/log-driver.config';

export const LogDriverToken: InjectionToken<LogDriver> = 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;
}
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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);
}
4 changes: 4 additions & 0 deletions projects/ngworker/lumberjack/src/lib/log-types/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export * from './error-logs';
export * from './info-logs';
export * from './warning-logs';
export * from './debug-logs';
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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);
}
11 changes: 11 additions & 0 deletions projects/ngworker/lumberjack/src/lib/lumberjack-log-levels.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/*
* Log levels used by our `Lumberjack` Loggers
*
*/
export enum LumberjackLogLevel {
Debug = 'debug',
Verbose = 'verbose',
Info = 'info',
Warning = 'warn',
Error = 'error',
}
11 changes: 11 additions & 0 deletions projects/ngworker/lumberjack/src/lib/lumberjack-log.ts
Original file line number Diff line number Diff line change
@@ -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;
}
14 changes: 0 additions & 14 deletions projects/ngworker/lumberjack/src/lib/lumberjack.component.spec.ts

This file was deleted.

16 changes: 0 additions & 16 deletions projects/ngworker/lumberjack/src/lib/lumberjack.component.ts

This file was deleted.

30 changes: 24 additions & 6 deletions projects/ngworker/lumberjack/src/lib/lumberjack.module.ts
Original file line number Diff line number Diff line change
@@ -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<NgLoggerModule> {
return {
ngModule: NgLoggerModule,
providers: [
{
provide: LumberjackLogConfigToken,
useValue: config,
},
{
provide: LogDriverConfigToken,
useValue: defaultLogDriverConfig,
},
],
};
}
}
13 changes: 0 additions & 13 deletions projects/ngworker/lumberjack/src/lib/lumberjack.service.spec.ts

This file was deleted.

Loading

0 comments on commit 087b716

Please sign in to comment.