-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlogs.go
110 lines (90 loc) · 2.92 KB
/
logs.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
107
108
109
110
package otelemetry
import (
"context"
"time"
"go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc"
"go.opentelemetry.io/otel/exporters/stdout/stdoutlog"
"go.opentelemetry.io/otel/log"
sdklog "go.opentelemetry.io/otel/sdk/log"
sdkresource "go.opentelemetry.io/otel/sdk/resource"
)
// Log interface provides methods for logging operations.
type Log interface {
// Log returns the original logger.
Log() log.Logger // original logger
Debug(ctx context.Context, msg string, kv ...log.KeyValue)
Info(ctx context.Context, msg string, kv ...log.KeyValue)
Warning(ctx context.Context, msg string, kv ...log.KeyValue)
Error(ctx context.Context, msg string, kv ...log.KeyValue)
Fatal(ctx context.Context, msg string, kv ...log.KeyValue)
}
// otellog is an implementation of the Log interface using OpenTelemetry.
type otellog struct {
log log.Logger
}
func newLoggerProvider(ctx context.Context, otelAgentAddr string, res *sdkresource.Resource, opts LoggerOptions) (*sdklog.LoggerProvider, error) {
exporter, err := otlploggrpc.New(ctx,
otlploggrpc.WithInsecure(),
otlploggrpc.WithEndpoint(otelAgentAddr),
)
if err != nil {
return nil, err
}
provider := sdklog.NewLoggerProvider(
sdklog.WithResource(res),
sdklog.WithProcessor(sdklog.NewBatchProcessor(exporter)),
)
return provider, nil
}
func newStdoutLoggerProvider(res *sdkresource.Resource) (*sdklog.LoggerProvider, error) {
exporter, err := stdoutlog.New()
if err != nil {
return nil, err
}
//stdoutlog.WithWriter(f),
//stdoutlog.WithPrettyPrint(),
provider := sdklog.NewLoggerProvider(
sdklog.WithResource(res),
sdklog.WithProcessor(sdklog.NewBatchProcessor(exporter)),
)
return provider, nil
}
const (
Debug = "DEBUG"
Info = "INFO"
Warn = "WARN"
Error = "ERROR"
Fatal = "FATAL"
)
func (l *otellog) Log() log.Logger {
return l.log
}
func (l *otellog) Debug(ctx context.Context, msg string, kv ...log.KeyValue) {
record := getRecord(msg, log.SeverityDebug, Debug, kv...)
l.log.Emit(ctx, record)
}
func (l *otellog) Info(ctx context.Context, msg string, kv ...log.KeyValue) {
record := getRecord(msg, log.SeverityInfo, Info, kv...)
l.log.Emit(ctx, record)
}
func (l *otellog) Warning(ctx context.Context, msg string, kv ...log.KeyValue) {
record := getRecord(msg, log.SeverityWarn, Warn, kv...)
l.log.Emit(ctx, record)
}
func (l *otellog) Error(ctx context.Context, msg string, kv ...log.KeyValue) {
record := getRecord(msg, log.SeverityError, Error, kv...)
l.log.Emit(ctx, record)
}
func (l *otellog) Fatal(ctx context.Context, msg string, kv ...log.KeyValue) {
record := getRecord(msg, log.SeverityFatal, Fatal, kv...)
l.log.Emit(ctx, record)
}
func getRecord(msg string, severity log.Severity, sevName string, kv ...log.KeyValue) log.Record {
var record log.Record
record.SetBody(log.StringValue(msg))
record.SetSeverity(severity)
record.SetSeverityText(sevName)
record.SetTimestamp(time.Now())
record.AddAttributes(kv...)
return record
}