/
CompositeLogger.go
106 lines (95 loc) · 2.82 KB
/
CompositeLogger.go
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package log
import (
"context"
"github.com/pip-services4/pip-services4-go/pip-services4-components-go/refer"
)
// CompositeLogger aggregates all loggers from component references under a single component.
// It allows logging messages and conveniently send them to multiple destinations.
//
// References:
// - *:logger:*:*:1.0 (optional) ILogger components to pass log messages
//
// see ILogger
// Example:
// type MyComponent {
// _logger CompositeLogger
// }
// func (mc* MyComponent) Configure(ctx context.Context, config ConfigParams) {
// mc._logger.Configure(ctx, config)
// ...
// }
//
// func (mc* MyComponent) SetReferences(ctx context.Context, references IReferences) {
// mc._logger.SetReferences(ctx, references)
// ...
// }
//
// func (mc* MyComponent) myMethod(ctx context.Context) {
// mc._logger.Debug(ctx context.Context, "Called method mycomponent.mymethod")
// ...
// }
// var mc MyComponent = MyComponent{}
// mc._logger = NewCompositeLogger()
type CompositeLogger struct {
*Logger
loggers []ILogger
}
// NewCompositeLogger creates a new instance of the logger.
//
// Returns: *CompositeLogger
func NewCompositeLogger() *CompositeLogger {
c := &CompositeLogger{
loggers: []ILogger{},
}
c.Logger = InheritLogger(c)
c.SetLevel(LevelTrace)
return c
}
// NewCompositeLoggerFromReferences creates a new instance of the logger.
//
// Parameters:
// - ctx context.Context
// - refer.IReferences references to locate the component dependencies.
// Returns: CompositeLogger
func NewCompositeLoggerFromReferences(ctx context.Context, references refer.IReferences) *CompositeLogger {
c := NewCompositeLogger()
c.SetReferences(ctx, references)
return c
}
// SetReferences sets references to dependent components.
//
// Parameters:
// - ctx context.Context
// - refer.IReferences references to locate the component dependencies.
func (c *CompositeLogger) SetReferences(ctx context.Context, references refer.IReferences) {
c.Logger.SetReferences(ctx, references)
if c.loggers == nil {
c.loggers = []ILogger{}
}
loggers := references.GetOptional(
refer.NewDescriptor("*", "logger", "*", "*", "*"),
)
for _, l := range loggers {
if l == c {
continue
}
if logger, ok := l.(ILogger); ok {
c.loggers = append(c.loggers, logger)
}
}
}
// Writes a log message to the logger destination(s).
// Parameters:
// - ctx context.Context
// - level LogLevel a log level.
// - ctx context.Context execution context to trace execution through call chain.
// - err error an error object associated with this message.
// - message string a human-readable message to log.
func (c *CompositeLogger) Write(ctx context.Context, level LevelType, err error, message string) {
if c.loggers == nil && len(c.loggers) == 0 {
return
}
for _, logger := range c.loggers {
logger.Log(ctx, level, err, message)
}
}