-
Notifications
You must be signed in to change notification settings - Fork 0
/
CompositeLogger.ts
88 lines (80 loc) · 2.85 KB
/
CompositeLogger.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/** @module log */
import { IReferences } from 'pip-services-commons-node';
import { IReferenceable } from 'pip-services-commons-node';
import { Descriptor } from 'pip-services-commons-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 ###
*
* - <code>\*:logger:\*:\*:1.0</code> (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 correlationId): void {
* this._logger.debug(correlationId, "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);
let loggers: any[] = references.getOptional<any>(new Descriptor(null, "logger", null, null, null));
for (var i = 0; i < loggers.length; i++) {
let logger: ILogger = loggers[i];
// Todo: This doesn't work in TS. Redo...
if (logger != this as ILogger)
this._loggers.push(logger);
}
}
/**
* Writes a log message to the logger destination(s).
*
* @param level a log level.
* @param correlationId (optional) transaction id 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, correlationId: string, error: Error, message: string): void {
for (let index = 0; index < this._loggers.length; index++)
this._loggers[index].log(level, correlationId, error, message);
}
}