4 "github.com/mattn/go-colorable"
5 "gopkg.in/natefinch/lumberjack.v2"
10 type CompositeMultiHandler struct {
11 DebugHandler LogHandler
12 InfoHandler LogHandler
13 WarnHandler LogHandler
14 ErrorHandler LogHandler
15 CriticalHandler LogHandler
18 func NewCompositeMultiHandler() (*CompositeMultiHandler, LogHandler) {
19 cw := &CompositeMultiHandler{}
22 func (h *CompositeMultiHandler) Log(r *Record) (err error) {
24 var handler LogHandler
28 handler = h.InfoHandler
30 handler = h.DebugHandler
32 handler = h.WarnHandler
34 handler = h.ErrorHandler
36 handler = h.CriticalHandler
39 // Embed the caller function in the context
46 func (h *CompositeMultiHandler) SetHandler(handler LogHandler, replace bool, level LogLevel) {
48 // Ignore empty handler
51 source := &h.DebugHandler
54 source = &h.DebugHandler
56 source = &h.InfoHandler
58 source = &h.WarnHandler
60 source = &h.ErrorHandler
62 source = &h.CriticalHandler
65 if !replace && *source != nil {
66 // If we are not replacing the source make sure that the level handler is applied first
67 if _, isLevel := (*source).(*LevelFilterHandler); !isLevel {
68 *source = LevelHandler(level, *source)
70 // If this already was a list add a new logger to it
71 if ll, found := (*source).(*ListLogHandler); found {
74 *source = NewListLogHandler(*source, handler)
81 // For the multi handler set the handler, using the LogOptions defined
82 func (h *CompositeMultiHandler) SetHandlers(handler LogHandler, options *LogOptions) {
83 if len(options.Levels) == 0 {
84 options.Levels = LvlAllList
88 for _, lvl := range options.Levels {
89 h.SetHandler(handler, options.ReplaceExistingHandler, lvl)
93 func (h *CompositeMultiHandler) SetJson(writer io.Writer, options *LogOptions) {
94 handler := CallerFileHandler(StreamHandler(writer, JsonFormatEx(
95 options.GetBoolDefault("pretty", false),
96 options.GetBoolDefault("lineSeparated", true),
98 if options.HandlerWrap != nil {
99 handler = options.HandlerWrap.SetChild(handler)
101 h.SetHandlers(handler, options)
104 // Use built in rolling function
105 func (h *CompositeMultiHandler) SetJsonFile(filePath string, options *LogOptions) {
106 writer := &lumberjack.Logger{
108 MaxSize: options.GetIntDefault("maxSizeMB", 1024), // megabytes
109 MaxAge: options.GetIntDefault("maxAgeDays", 7), //days
110 MaxBackups: options.GetIntDefault("maxBackups", 7),
111 Compress: options.GetBoolDefault("compress", true),
113 h.SetJson(writer, options)
116 func (h *CompositeMultiHandler) SetTerminal(writer io.Writer, options *LogOptions) {
117 streamHandler := StreamHandler(
119 TerminalFormatHandler(
120 options.GetBoolDefault("noColor", false),
121 options.GetBoolDefault("smallDate", true)))
123 if os.Stdout == writer {
124 streamHandler = StreamHandler(
125 colorable.NewColorableStdout(),
126 TerminalFormatHandler(
127 options.GetBoolDefault("noColor", false),
128 options.GetBoolDefault("smallDate", true)))
129 } else if os.Stderr == writer {
130 streamHandler = StreamHandler(
131 colorable.NewColorableStderr(),
132 TerminalFormatHandler(
133 options.GetBoolDefault("noColor", false),
134 options.GetBoolDefault("smallDate", true)))
136 handler := CallerFileHandler(streamHandler)
138 if options.HandlerWrap != nil {
139 handler = options.HandlerWrap.SetChild(handler)
141 h.SetHandlers(handler, options)
144 // Use built in rolling function
145 func (h *CompositeMultiHandler) SetTerminalFile(filePath string, options *LogOptions) {
146 writer := &lumberjack.Logger{
148 MaxSize: options.GetIntDefault("maxSizeMB", 1024), // megabytes
149 MaxAge: options.GetIntDefault("maxAgeDays", 7), //days
150 MaxBackups: options.GetIntDefault("maxBackups", 7),
151 Compress: options.GetBoolDefault("compress", true),
153 h.SetTerminal(writer, options)
156 func (h *CompositeMultiHandler) Disable(levels ...LogLevel) {
157 if len(levels) == 0 {
160 for _, level := range levels {
171 h.CriticalHandler = nil