mirror of
https://github.com/CommunitySolidServer/CommunitySolidServer.git
synced 2024-10-03 14:55:10 +00:00
feat: initial proposal for multithreaded execution
This commit is contained in:
committed by
Joachim Van Herwegen
parent
32245fc604
commit
236bbc6e5d
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user