/** @module log */
import { IContext } from 'pip-services4-components-node';
import { IReferences } from 'pip-services4-components-node';
import { IReferenceable } from 'pip-services4-components-node';
import { Descriptor } from 'pip-services4-components-node';
import { ILogger } from './ILogger';
import { Logger } from './Logger';
import { LogLevel } from './LogLevel';
/**
* Aggregates all loggers from component references under a single component.
*
* It allows to log messages and conveniently send them to multiple destinations.
*
* ### References ###
*
* - \*:logger:\*:\*:1.0 (optional) [[ILogger]] components to pass log messages
*
* @see [[ILogger]]
*
* ### Example ###
*
* class MyComponent implements IConfigurable, IReferenceable {
* private _logger: CompositeLogger = new CompositeLogger();
*
* public configure(config: ConfigParams): void {
* this._logger.configure(config);
* ...
* }
*
* public setReferences(references: IReferences): void {
* this._logger.setReferences(references);
* ...
* }
*
* public myMethod(string context): void {
* this._logger.debug(context, "Called method mycomponent.mymethod");
* ...
* }
* }
*
*/
export class CompositeLogger extends Logger implements IReferenceable {
private readonly _loggers: ILogger[] = [];
/**
* Creates a new instance of the logger.
*
* @param references references to locate the component dependencies.
*/
public constructor(references: IReferences = null) {
super();
if (references) {
this.setReferences(references);
}
}
/**
* Sets references to dependent components.
*
* @param references references to locate the component dependencies.
*/
public setReferences(references: IReferences): void {
super.setReferences(references);
const loggers: any[] = references.getOptional(new Descriptor(null, "logger", null, null, null));
for (const logger of loggers) {
if (typeof logger.log === "function") {
this._loggers.push(logger);
}
}
}
/**
* Writes a log message to the logger destination(s).
*
* @param level a log level.
* @param context (optional) a context to trace execution through call chain.
* @param error an error object associated with this message.
* @param message a human-readable message to log.
*/
protected write(level: LogLevel, context: IContext, error: Error, message: string): void {
for (const logger of this._loggers) {
logger.log(level, context, error, message);
}
}
}