File: composite_multihandler.go

package info (click to toggle)
golang-github-revel-revel 1.0.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,240 kB
  • sloc: xml: 7; makefile: 7; javascript: 1
file content (174 lines) | stat: -rw-r--r-- 4,542 bytes parent folder | download | duplicates (2)
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package logger

import (
	"github.com/mattn/go-colorable"
	"gopkg.in/natefinch/lumberjack.v2"
	"io"
	"os"
)

type CompositeMultiHandler struct {
	DebugHandler    LogHandler
	InfoHandler     LogHandler
	WarnHandler     LogHandler
	ErrorHandler    LogHandler
	CriticalHandler LogHandler
}

func NewCompositeMultiHandler() (*CompositeMultiHandler, LogHandler) {
	cw := &CompositeMultiHandler{}
	return cw, cw
}
func (h *CompositeMultiHandler) Log(r *Record) (err error) {

	var handler LogHandler

	switch r.Level {
	case LvlInfo:
		handler = h.InfoHandler
	case LvlDebug:
		handler = h.DebugHandler
	case LvlWarn:
		handler = h.WarnHandler
	case LvlError:
		handler = h.ErrorHandler
	case LvlCrit:
		handler = h.CriticalHandler
	}

	// Embed the caller function in the context
	if handler != nil {
		handler.Log(r)
	}
	return
}

func (h *CompositeMultiHandler) SetHandler(handler LogHandler, replace bool, level LogLevel) {
	if handler == nil {
		// Ignore empty handler
		return
	}
	source := &h.DebugHandler
	switch level {
	case LvlDebug:
		source = &h.DebugHandler
	case LvlInfo:
		source = &h.InfoHandler
	case LvlWarn:
		source = &h.WarnHandler
	case LvlError:
		source = &h.ErrorHandler
	case LvlCrit:
		source = &h.CriticalHandler
	}

	if !replace && *source != nil {
		// If we are not replacing the source make sure that the level handler is applied first
		if _, isLevel := (*source).(*LevelFilterHandler); !isLevel {
			*source = LevelHandler(level, *source)
		}
		// If this already was a list add a new logger to it
		if ll, found := (*source).(*ListLogHandler); found {
			ll.Add(handler)
		} else {
			*source = NewListLogHandler(*source, handler)
		}
	} else {
		*source = handler
	}
}

// For the multi handler set the handler, using the LogOptions defined
func (h *CompositeMultiHandler) SetHandlers(handler LogHandler, options *LogOptions) {
	if len(options.Levels) == 0 {
		options.Levels = LvlAllList
	}

	// Set all levels
	for _, lvl := range options.Levels {
		h.SetHandler(handler, options.ReplaceExistingHandler, lvl)
	}

}
func (h *CompositeMultiHandler) SetJson(writer io.Writer, options *LogOptions) {
	handler := CallerFileHandler(StreamHandler(writer, JsonFormatEx(
		options.GetBoolDefault("pretty", false),
		options.GetBoolDefault("lineSeparated", true),
	)))
	if options.HandlerWrap != nil {
		handler = options.HandlerWrap.SetChild(handler)
	}
	h.SetHandlers(handler, options)
}

// Use built in rolling function
func (h *CompositeMultiHandler) SetJsonFile(filePath string, options *LogOptions) {
	writer := &lumberjack.Logger{
		Filename:   filePath,
		MaxSize:    options.GetIntDefault("maxSizeMB", 1024), // megabytes
		MaxAge:     options.GetIntDefault("maxAgeDays", 7),   //days
		MaxBackups: options.GetIntDefault("maxBackups", 7),
		Compress:   options.GetBoolDefault("compress", true),
	}
	h.SetJson(writer, options)
}

func (h *CompositeMultiHandler) SetTerminal(writer io.Writer, options *LogOptions) {
	streamHandler := StreamHandler(
		writer,
		TerminalFormatHandler(
			options.GetBoolDefault("noColor", false),
			options.GetBoolDefault("smallDate", true)))

	if os.Stdout == writer {
		streamHandler = StreamHandler(
			colorable.NewColorableStdout(),
			TerminalFormatHandler(
				options.GetBoolDefault("noColor", false),
				options.GetBoolDefault("smallDate", true)))
	} else if os.Stderr == writer {
		streamHandler = StreamHandler(
			colorable.NewColorableStderr(),
			TerminalFormatHandler(
				options.GetBoolDefault("noColor", false),
				options.GetBoolDefault("smallDate", true)))
	}
	handler := CallerFileHandler(streamHandler)

	if options.HandlerWrap != nil {
		handler = options.HandlerWrap.SetChild(handler)
	}
	h.SetHandlers(handler, options)
}

// Use built in rolling function
func (h *CompositeMultiHandler) SetTerminalFile(filePath string, options *LogOptions) {
	writer := &lumberjack.Logger{
		Filename:   filePath,
		MaxSize:    options.GetIntDefault("maxSizeMB", 1024), // megabytes
		MaxAge:     options.GetIntDefault("maxAgeDays", 7),   //days
		MaxBackups: options.GetIntDefault("maxBackups", 7),
		Compress:   options.GetBoolDefault("compress", true),
	}
	h.SetTerminal(writer, options)
}

func (h *CompositeMultiHandler) Disable(levels ...LogLevel) {
	if len(levels) == 0 {
		levels = LvlAllList
	}
	for _, level := range levels {
		switch level {
		case LvlDebug:
			h.DebugHandler = nil
		case LvlInfo:
			h.InfoHandler = nil
		case LvlWarn:
			h.WarnHandler = nil
		case LvlError:
			h.ErrorHandler = nil
		case LvlCrit:
			h.CriticalHandler = nil
		}
	}
}