diff --git a/packages/api/src/api.ts b/packages/api/src/api.ts index 461af9c9ae..e4677f8d2a 100644 --- a/packages/api/src/api.ts +++ b/packages/api/src/api.ts @@ -327,6 +327,15 @@ export type TypedArray = */ export type Watch = (id: string, oldState: T, newState: T) => void; +export const enum LogLevel { + FINE, + DEBUG, + INFO, + WARN, + SEVERE, + NONE +} + /** * @param K key type * @param V value type @@ -566,6 +575,14 @@ export interface ILength { readonly length: number; } +export interface ILogger { + fine(...args: any[]): void; + debug(...args: any[]): void; + info(...args: any[]): void; + warn(...args: any[]): void; + severe(...args: any[]): void; +} + /** * Generic interface for types supporting metadata. Implementations MUST * exclude metadata from any comparisons, equality checks & hashing. diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index a88afb5ccf..f8deb6fc43 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -1,6 +1,7 @@ export * from "./api"; export * from "./assert"; +export * from "./logger"; export * from "./mixin"; export * from "./decorators/configurable"; diff --git a/packages/api/src/logger.ts b/packages/api/src/logger.ts new file mode 100644 index 0000000000..ccff4249fa --- /dev/null +++ b/packages/api/src/logger.ts @@ -0,0 +1,43 @@ +import { ILogger, LogLevel } from "./api"; + +export const NULL_LOGGER: ILogger = { + fine() {}, + debug() {}, + info() {}, + warn() {}, + severe() {} +}; + +export class ConsoleLogger implements ILogger { + id: string; + level: LogLevel; + + constructor(id: string, level = LogLevel.FINE) { + this.id = id; + this.level = level; + } + + fine(...args: any[]): void { + this.level <= LogLevel.FINE && this.log("FINE", args); + } + + debug(...args: any[]): void { + this.level <= LogLevel.DEBUG && this.log("DEBUG", args); + } + + info(...args: any[]): void { + this.level <= LogLevel.INFO && this.log("INFO", args); + } + + warn(...args: any[]): void { + this.level <= LogLevel.WARN && this.log("WARN", args); + } + + severe(...args: any[]): void { + this.level <= LogLevel.SEVERE && this.log("SEVERE", args); + } + + protected log(level: string, args: any[]) { + console.info(`[${level}][${this.id}]`, ...args); + } +}