feat: initial proposal for multithreaded execution

This commit is contained in:
Thomas Dupont
2022-05-13 11:27:31 +02:00
committed by Joachim Van Herwegen
parent 32245fc604
commit 236bbc6e5d
40 changed files with 880 additions and 97 deletions

View File

@@ -1,5 +1,14 @@
import cluster from 'cluster';
import process from 'process';
import type { LogLevel } from './LogLevel';
export interface LogMetadata {
/** Is the current process the Primary process */
isPrimary: boolean;
/** The process id of the current process */
pid: number;
}
/**
* Logs messages on a specific level.
*
@@ -13,7 +22,7 @@ export interface SimpleLogger {
* @param message - The message to log.
* @param meta - Optional metadata to include in the log message.
*/
log: (level: LogLevel, message: string) => SimpleLogger;
log: (level: LogLevel, message: string, meta?: LogMetadata) => SimpleLogger;
}
/**
@@ -79,30 +88,35 @@ export interface Logger extends SimpleLogger {
* leaving only the implementation of {@link SimpleLogger}.
*/
export abstract class BaseLogger implements Logger {
public abstract log(level: LogLevel, message: string): Logger;
public abstract log(level: LogLevel, message: string, meta?: LogMetadata): Logger;
private readonly getMeta = (): LogMetadata => ({
pid: process.pid,
isPrimary: cluster.isMaster,
});
public error(message: string): Logger {
return this.log('error', message);
return this.log('error', message, this.getMeta());
}
public warn(message: string): Logger {
return this.log('warn', message);
return this.log('warn', message, this.getMeta());
}
public info(message: string): Logger {
return this.log('info', message);
return this.log('info', message, this.getMeta());
}
public verbose(message: string): Logger {
return this.log('verbose', message);
return this.log('verbose', message, this.getMeta());
}
public debug(message: string): Logger {
return this.log('debug', message);
return this.log('debug', message, this.getMeta());
}
public silly(message: string): Logger {
return this.log('silly', message);
return this.log('silly', message, this.getMeta());
}
}
@@ -118,8 +132,8 @@ export class WrappingLogger extends BaseLogger {
this.logger = logger;
}
public log(level: LogLevel, message: string): this {
this.logger.log(level, message);
public log(level: LogLevel, message: string, meta?: LogMetadata): this {
this.logger.log(level, message, meta);
return this;
}
}

View File

@@ -1,6 +1,6 @@
import { createLogger, format, transports } from 'winston';
import type * as Transport from 'winston-transport';
import type { Logger } from './Logger';
import type { Logger, LogMetadata } from './Logger';
import type { LoggerFactory } from './LoggerFactory';
import { WinstonLogger } from './WinstonLogger';
@@ -17,6 +17,13 @@ export class WinstonLoggerFactory implements LoggerFactory {
this.level = level;
}
private readonly clusterInfo = (meta: LogMetadata): string => {
if (meta.isPrimary) {
return 'Primary';
}
return `W-${meta.pid ?? '???'}`;
};
public createLogger(label: string): Logger {
return new WinstonLogger(createLogger({
level: this.level,
@@ -24,8 +31,10 @@ export class WinstonLoggerFactory implements LoggerFactory {
format.label({ label }),
format.colorize(),
format.timestamp(),
format.printf(({ level: levelInner, message, label: labelInner, timestamp }: Record<string, any>): string =>
`${timestamp} [${labelInner}] ${levelInner}: ${message}`),
format.metadata({ fillExcept: [ 'level', 'timestamp', 'label', 'message' ]}),
format.printf(({ level: levelInner, message, label: labelInner, timestamp, metadata: meta }:
Record<string, any>): string =>
`${timestamp} [${labelInner}] {${this.clusterInfo(meta)}} ${levelInner}: ${message}`),
),
transports: this.createTransports(),
}));