Documentation ¶
Overview ¶
Package log provide a general log interface Usage:
import "github.com/askasoft/pango/log"
log := log.NewLog() log.SetWriter(log.NewAsyncWriter(log.NewConsoleWriter()))
Use it like this:
log.Fatal("fatal") log.Error("error") log.Warn("warning") log.Info("info") log.Debug("debug") log.Trace("trace")
A Logger with name:
log := log.GetLogger("foo") log.Debug("hello")
Index ¶
- Variables
- func Close()
- func Config(filename string) error
- func ConfigWriter(w Writer, c map[string]any) error
- func Debug(v ...any)
- func Debugf(f string, v ...any)
- func Error(v ...any)
- func Errorf(f string, v ...any)
- func Fatal(v ...any)
- func Fatalf(f string, v ...any)
- func GetCallerDepth() int
- func GetProp(k string) any
- func GetProps() map[string]any
- func Info(v ...any)
- func Infof(f string, v ...any)
- func IsDebugEnabled() bool
- func IsErrorEnabled() bool
- func IsFatalEnabled() bool
- func IsInfoEnabled() bool
- func IsTraceEnabled() bool
- func IsWarnEnabled() bool
- func RegisterFilter(name string, fc FilterCreator)
- func RegisterWriter(name string, wc WriterCreator)
- func SetCallerDepth(d int)
- func SetFormatter(lf Formatter)
- func SetLevel(lvl Level)
- func SetLevels(lvls map[string]Level)
- func SetProp(k string, v any)
- func SetProps(props map[string]any)
- func SetWriter(lw Writer)
- func Trace(v ...any)
- func Tracef(f string, v ...any)
- func Warn(v ...any)
- func Warnf(f string, v ...any)
- type AsyncWriter
- type ConnWriter
- type Event
- type EventBuffer
- type FailoverWriter
- type FileWriter
- type Filter
- type FilterCreator
- type Formatter
- type JSONFormatter
- type Level
- type LevelFilter
- type Log
- func (log *Log) Close()
- func (log *Log) Config(filename string) error
- func (log *Log) Debug(v ...any)
- func (log *Log) Debugf(f string, v ...any)
- func (log *Log) Error(v ...any)
- func (log *Log) Errorf(f string, v ...any)
- func (log *Log) Fatal(v ...any)
- func (log *Log) Fatalf(f string, v ...any)
- func (log *Log) Flush()
- func (log *Log) GetCallerDepth() int
- func (log *Log) GetFormatter() Formatter
- func (log *Log) GetLevel() Level
- func (log *Log) GetLogger(name string) Logger
- func (log *Log) GetName() string
- func (log *Log) GetOutputer(name string, lvl Level, callerDepth ...int) Outputer
- func (log *Log) GetProp(k string) any
- func (log *Log) GetProps() map[string]any
- func (log *Log) GetTraceLevel() Level
- func (log *Log) GetWriter() Writer
- func (log *Log) Info(v ...any)
- func (log *Log) Infof(f string, v ...any)
- func (log *Log) IsDebugEnabled() bool
- func (log *Log) IsErrorEnabled() bool
- func (log *Log) IsFatalEnabled() bool
- func (log *Log) IsInfoEnabled() bool
- func (log *Log) IsLevelEnabled(lvl Level) bool
- func (log *Log) IsTraceEnabled() bool
- func (log *Log) IsWarnEnabled() bool
- func (log *Log) Log(lvl Level, v ...any)
- func (log *Log) Logf(lvl Level, f string, v ...any)
- func (log *Log) SetCallerDepth(d int)
- func (log *Log) SetFormatter(lf Formatter)
- func (log *Log) SetLevel(lvl Level)
- func (log *Log) SetLevels(lvls map[string]Level)
- func (log *Log) SetName(name string)
- func (log *Log) SetProp(k string, v any)
- func (log *Log) SetProps(props map[string]any)
- func (log *Log) SetTraceLevel(lvl Level)
- func (log *Log) SetWriter(lw Writer)
- func (log *Log) SwitchWriter(lw Writer)
- func (log *Log) Trace(v ...any)
- func (log *Log) Tracef(f string, v ...any)
- func (log *Log) Warn(v ...any)
- func (log *Log) Warnf(f string, v ...any)
- type Logger
- type MultiFilter
- type MultiWriter
- type NameFilter
- type NameNotFilter
- type NopWriter
- type Outputer
- type SMTPWriter
- func (sw *SMTPWriter) Close()
- func (sw *SMTPWriter) Flush()
- func (sw *SMTPWriter) SetCc(s string)
- func (sw *SMTPWriter) SetFilter(filter string)
- func (sw *SMTPWriter) SetFormat(format string)
- func (sw *SMTPWriter) SetSubject(format string)
- func (sw *SMTPWriter) SetTimeout(timeout string) error
- func (sw *SMTPWriter) SetTo(s string)
- func (sw *SMTPWriter) Write(le *Event) (err error)
- type SlackWriter
- func (sw *SlackWriter) Close()
- func (sw *SlackWriter) Flush()
- func (sw *SlackWriter) SetFilter(filter string)
- func (sw *SlackWriter) SetFormat(format string)
- func (sw *SlackWriter) SetSubject(format string)
- func (sw *SlackWriter) SetTimeout(timeout string) error
- func (sw *SlackWriter) SetWebhook(webhook string) error
- func (sw *SlackWriter) Write(le *Event) (err error)
- type StreamWriter
- type SyncWriter
- type TeamsWriter
- func (tw *TeamsWriter) Close()
- func (tw *TeamsWriter) Flush()
- func (tw *TeamsWriter) SetBuffer(buffer string) error
- func (tw *TeamsWriter) SetFilter(filter string)
- func (tw *TeamsWriter) SetFormat(format string)
- func (tw *TeamsWriter) SetSubject(format string)
- func (tw *TeamsWriter) SetTimeout(timeout string) error
- func (tw *TeamsWriter) SetWebhook(webhook string) error
- func (tw *TeamsWriter) Write(le *Event) (err error)
- type TextFormatter
- type WebhookWriter
- func (ww *WebhookWriter) Close()
- func (ww *WebhookWriter) Flush()
- func (ww *WebhookWriter) SetFilter(filter string)
- func (ww *WebhookWriter) SetFormat(format string)
- func (ww *WebhookWriter) SetTimeout(timeout string) error
- func (ww *WebhookWriter) SetWebhook(webhook string) error
- func (ww *WebhookWriter) Write(le *Event) error
- type Writer
- type WriterCreator
Constants ¶
This section is empty.
Variables ¶
var EOL = iox.EOL
EOL windows: "\r\n" other: "\n"
var JSONFmtDefault = newJSONFormatter(`{"when": %t, "level": %l, "name": %c, "file": %S, "line": %L, "func": %F, "msg": %m, "trace": %T}%n`)
JSONFmtDefault default log format `{"when": %t, "level": %l, "name": %c, "file": %S, "line": %L, "func": %F, "msg": %m, "trace": %T}%n`
var TextFmtDefault = newTextFormatter("%t %l{-5s} %c %S:%L %F() - %m%n%T")
TextFmtDefault default log format "%t %l{-5s} %c %S:%L %F() - %m%n%T"
var TextFmtSimple = newTextFormatter("[%p] %m%n")
TextFmtSimple simple log format "[%p] %m%n"
var TextFmtSubject = newTextFormatter("[%l] %m")
TextFmtSubject subject log format "[%l] %m"
Functions ¶
func ConfigWriter ¶
ConfigWriter config the writer by the configuration map 'c'
func RegisterFilter ¶
func RegisterFilter(name string, fc FilterCreator)
RegisterFilter register log filter type
func RegisterWriter ¶
func RegisterWriter(name string, wc WriterCreator)
RegisterWriter register log writer type
func SetCallerDepth ¶
func SetCallerDepth(d int)
SetCallerDepth set the logger's caller depth (!!SLOW!!), 0: disable runtime.Caller()
Types ¶
type AsyncWriter ¶
type AsyncWriter struct {
// contains filtered or unexported fields
}
AsyncWriter wrapper a log writer to implement asynchrous write
func NewAsyncWriter ¶
func NewAsyncWriter(w Writer, size int) *AsyncWriter
NewAsyncWriter create a async writer and start go routine
func (*AsyncWriter) Close ¶
func (aw *AsyncWriter) Close()
Close Close the underlying writer and wait it for done
func (*AsyncWriter) SetWriter ¶
func (aw *AsyncWriter) SetWriter(w Writer)
SetWriter close the old writer and set the new writer
func (*AsyncWriter) StopAfter ¶
func (aw *AsyncWriter) StopAfter(d time.Duration)
StopAfter auto stop the run() go-routine when the evtChan is empty and after duration d.
func (*AsyncWriter) Write ¶
func (aw *AsyncWriter) Write(le *Event) error
Write async write the log event
type ConnWriter ¶
type ConnWriter struct { Net string Addr string Timeout time.Duration Logfmt Formatter // log formatter Logfil Filter // log filter // contains filtered or unexported fields }
ConnWriter implements Writer. it writes messages in keep-live tcp connection.
func (*ConnWriter) Close ¶
func (cw *ConnWriter) Close()
Close close the file description, close file writer.
func (*ConnWriter) SetFilter ¶
func (cw *ConnWriter) SetFilter(filter string)
SetFilter set the log filter
func (*ConnWriter) SetFormat ¶
func (cw *ConnWriter) SetFormat(format string)
SetFormat set the log formatter
func (*ConnWriter) SetTimeout ¶
func (cw *ConnWriter) SetTimeout(timeout string) error
SetTimeout set timeout
func (*ConnWriter) Write ¶
func (cw *ConnWriter) Write(le *Event) (err error)
Write write logger message to connection.
type EventBuffer ¶
type EventBuffer struct { BufSize int // contains filtered or unexported fields }
EventBuffer a event buffer
func (*EventBuffer) Len ¶
func (eb *EventBuffer) Len() int
Len returns the number of elements currently stored in the buffer.
type FailoverWriter ¶
type FailoverWriter struct {
// contains filtered or unexported fields
}
FailoverWriter implements log Writer Interface and send log message to webhook.
func NewFailoverWriter ¶
func NewFailoverWriter(w Writer, bufSize int) *FailoverWriter
NewFailoverWriter create a failover writer
func (*FailoverWriter) Write ¶
func (fw *FailoverWriter) Write(le *Event) error
Write write event to underlying writer
type FileWriter ¶
type FileWriter struct { Path string // Log file path name DirPerm uint32 // Log dir permission FilePerm uint32 // Log file permission MaxSplit int // Max split files MaxSize int64 // Rotate at size MaxDays int // Max daily files MaxHours int // Max hourly files Gzip bool // Compress rotated log files SyncLevel Level // Call File.Sync() if level <= SyncLevel Logfmt Formatter // log formatter Logfil Filter // log filter // contains filtered or unexported fields }
FileWriter implements Writer. It writes messages and rotate by file size limit, daily, hourly.
func (*FileWriter) Close ¶
func (fw *FileWriter) Close()
Close close the file description, close file writer.
func (*FileWriter) Flush ¶
func (fw *FileWriter) Flush()
Flush flush file logger. there are no buffering messages in file logger in memory. flush file means sync file to disk.
func (*FileWriter) SetFilter ¶
func (fw *FileWriter) SetFilter(filter string)
SetFilter set the log filter
func (*FileWriter) SetFormat ¶
func (fw *FileWriter) SetFormat(format string)
SetFormat set the log formatter
func (*FileWriter) SetMaxSize ¶
func (fw *FileWriter) SetMaxSize(maxSize string)
SetMaxSize set the MaxSize
func (*FileWriter) SetSyncLevel ¶
func (fw *FileWriter) SetSyncLevel(lvl string)
SetSyncLevel set the sync level
func (*FileWriter) Write ¶
func (fw *FileWriter) Write(le *Event) error
Write write logger message into file.
type Filter ¶
Filter log filter
func CreateFilter ¶
CreateFilter create a log filter by name and config
func NewLogFilter ¶
NewLogFilter create a log filter by the configuration string 'c'
func NewNameNotFilter ¶
NewNameNotFilter create a name filter (not equal)
type Formatter ¶
Formatter log formater interface
func NewLogFormatter ¶
NewLogFormatter create a text or json formatter text:[%p] %m%n -> TextFormatter json:{"level":%l, "msg": %m}%n -> JSONFormatter
type JSONFormatter ¶
type JSONFormatter struct {
// contains filtered or unexported fields
}
JSONFormatter json formatter
func NewJSONFormatter ¶
func NewJSONFormatter(format string) *JSONFormatter
NewJSONFormatter create a Json Formatter instance JSON Format %t{format}: time, if {format} is omitted, '2006-01-02T15:04:05.000' will be used %c{format}: logger name %p{format}: log level prefix %l{format}: log level string %x{key}: logger property %X: logger properties (json format) %S: caller source file name (!!SLOW!!) %L: caller source line number (!!SLOW!!) %F: caller function name (!!SLOW!!) %T: caller stack trace (!!SLOW!!) %m: message %n: EOL(Windows: "\r\n", Other: "\n")
func (*JSONFormatter) Init ¶
func (jf *JSONFormatter) Init(format string)
Init initialize the json formatter
type LevelFilter ¶
type LevelFilter struct {
Level Level
}
LevelFilter log level filter
func NewLevelFilter ¶
func NewLevelFilter(lvl Level) *LevelFilter
NewLevelFilter create a level filter
func (*LevelFilter) Reject ¶
func (lf *LevelFilter) Reject(le *Event) bool
Reject filter event by logger name
type Log ¶
type Log struct {
// contains filtered or unexported fields
}
Log is default logger in application. it can contain several writers and log message into all writers.
func Default ¶
func Default() *Log
Default returns the default Log instance used by the package-level functions.
func (*Log) Close ¶
func (log *Log) Close()
Close close logger, flush all data and close the writer.
func (*Log) GetCallerDepth ¶
GetCallerDepth return the logger's depth
func (*Log) GetFormatter ¶
GetFormatter get logger formatter
func (*Log) GetOutputer ¶
Outputer return a io.Writer for go log.SetOutput callerDepth: default is 1 (means +1) if the outputer is used by go std log, set callerDepth to 2 example:
import ( golog "log" "github.com/askasoft/pango/log" ) golog.SetOutput(log.Outputer("GO", log.LevelInfo, 3))
func (*Log) GetTraceLevel ¶
GetTraceLevel return the logger's trace level
func (*Log) IsDebugEnabled ¶
IsDebugEnabled is DEBUG level enabled
func (*Log) IsErrorEnabled ¶
IsErrorEnabled is ERROR level enabled
func (*Log) IsFatalEnabled ¶
IsFatalEnabled is FATAL level enabled
func (*Log) IsInfoEnabled ¶
IsInfoEnabled is INFO level enabled
func (*Log) IsLevelEnabled ¶
IsLevelEnabled is specified level enabled
func (*Log) IsTraceEnabled ¶
IsTraceEnabled is TRACE level enabled
func (*Log) IsWarnEnabled ¶
IsWarnEnabled is WARN level enabled
func (*Log) SetCallerDepth ¶
SetCallerDepth set the logger's caller depth (!!SLOW!!), 0: disable runtime.Caller()
func (*Log) SetFormatter ¶
SetFormatter set logger formatter
func (*Log) SetTraceLevel ¶
SetTraceLevel set the logger's trace level
func (*Log) SwitchWriter ¶
SwitchWriter use lw to replace the log writer
type Logger ¶
type Logger interface { GetLogger(name string) Logger GetOutputer(name string, lvl Level, callerDepth ...int) Outputer GetName() string SetName(name string) GetLevel() Level GetTraceLevel() Level GetFormatter() Formatter GetCallerDepth() int SetCallerDepth(d int) GetProp(k string) any SetProp(k string, v any) GetProps() map[string]any SetProps(map[string]any) IsLevelEnabled(lvl Level) bool Log(lvl Level, v ...any) Logf(lvl Level, f string, v ...any) IsFatalEnabled() bool Fatal(v ...any) Fatalf(f string, v ...any) IsErrorEnabled() bool Error(v ...any) Errorf(f string, v ...any) IsWarnEnabled() bool Warn(v ...any) Warnf(f string, v ...any) IsInfoEnabled() bool Info(v ...any) Infof(f string, v ...any) IsDebugEnabled() bool Debug(v ...any) Debugf(f string, v ...any) IsTraceEnabled() bool Trace(v ...any) Tracef(f string, v ...any) }
Logger logger interface
type MultiFilter ¶
type MultiFilter struct {
Filters []Filter
}
MultiFilter a multiple filter
func NewMultiFilter ¶
func NewMultiFilter(fs ...Filter) *MultiFilter
NewMultiFilter create a multiple filter
func (*MultiFilter) Reject ¶
func (mf *MultiFilter) Reject(le *Event) bool
Reject filter event by multiple filters
type MultiWriter ¶
type MultiWriter struct {
Writers []Writer
}
MultiWriter write log to multiple writers.
func NewMultiWriter ¶
func NewMultiWriter(ws ...Writer) *MultiWriter
NewMultiWriter create a multi writer
func (*MultiWriter) Write ¶
func (mw *MultiWriter) Write(le *Event) error
Write write log event to multiple writers.
type NameFilter ¶
type NameFilter struct {
Name string
}
NameFilter logger name filter
func (*NameFilter) Reject ¶
func (nf *NameFilter) Reject(le *Event) bool
Reject filter event by logger name
type NameNotFilter ¶
type NameNotFilter struct {
Name string
}
NameNotFilter logger name filter
func (*NameNotFilter) Reject ¶
func (nnf *NameNotFilter) Reject(le *Event) bool
Reject filter event by logger name
type Outputer ¶
Outputer interface for io.Writer, gorm.logger.Writer
func GetOutputer ¶
GetOutputer return a io.Writer for go log.SetOutput callerDepth: default is 1 (means +1) if the outputer is used by go std log, set callerDepth to 2 example:
import ( golog "log" "github.com/askasoft/pango/log" ) golog.SetOutput(log.Outputer("GO", log.LevelInfo, 2))
type SMTPWriter ¶
type SMTPWriter struct { Host string Port int Username string Password string From string Tos []string Ccs []string Timeout time.Duration Subfmt Formatter // subject formatter Logfmt Formatter // log formatter Logfil Filter // log filter // contains filtered or unexported fields }
SMTPWriter implements log Writer Interface and send log message.
func (*SMTPWriter) SetFilter ¶
func (sw *SMTPWriter) SetFilter(filter string)
SetFilter set the log filter
func (*SMTPWriter) SetFormat ¶
func (sw *SMTPWriter) SetFormat(format string)
SetFormat set the log formatter
func (*SMTPWriter) SetSubject ¶
func (sw *SMTPWriter) SetSubject(format string)
SetSubject set the subject formatter
func (*SMTPWriter) SetTimeout ¶
func (sw *SMTPWriter) SetTimeout(timeout string) error
SetTimeout set timeout
func (*SMTPWriter) Write ¶
func (sw *SMTPWriter) Write(le *Event) (err error)
Write send log message to smtp server.
type SlackWriter ¶
type SlackWriter struct { Webhook string Timeout time.Duration Subfmt Formatter // subject formatter Logfmt Formatter // log formatter Logfil Filter // log filter // contains filtered or unexported fields }
SlackWriter implements log Writer Interface and send log message to slack.
func (*SlackWriter) SetFilter ¶
func (sw *SlackWriter) SetFilter(filter string)
SetFilter set the log filter
func (*SlackWriter) SetFormat ¶
func (sw *SlackWriter) SetFormat(format string)
SetFormat set the log formatter
func (*SlackWriter) SetSubject ¶
func (sw *SlackWriter) SetSubject(format string)
SetSubject set the subject formatter
func (*SlackWriter) SetTimeout ¶
func (sw *SlackWriter) SetTimeout(timeout string) error
SetTimeout set timeout
func (*SlackWriter) SetWebhook ¶
func (sw *SlackWriter) SetWebhook(webhook string) error
SetWebhook set the webhook URL
func (*SlackWriter) Write ¶
func (sw *SlackWriter) Write(le *Event) (err error)
Write send log message to slack
type StreamWriter ¶
type StreamWriter struct { Color bool //this filed is useful only when system's terminal supports color Output io.Writer // log output Logfmt Formatter // log formatter Logfil Filter // log filter // contains filtered or unexported fields }
StreamWriter implements log Writer Interface and writes messages to terminal.
func (*StreamWriter) SetFilter ¶
func (sw *StreamWriter) SetFilter(filter string)
SetFilter set the log filter
func (*StreamWriter) SetFormat ¶
func (sw *StreamWriter) SetFormat(format string)
SetFormat set the log formatter
func (*StreamWriter) Write ¶
func (sw *StreamWriter) Write(le *Event) (err error)
Write write message in console.
type SyncWriter ¶
type SyncWriter struct {
// contains filtered or unexported fields
}
SyncWriter synchronized log writer
func NewSyncWriter ¶
func NewSyncWriter(w Writer) *SyncWriter
NewSyncWriter create a synchronized writer
func (*SyncWriter) Close ¶
func (sw *SyncWriter) Close()
Close synchronize close the underlying writer
func (*SyncWriter) Flush ¶
func (sw *SyncWriter) Flush()
Flush synchronize flush the underlying writer
func (*SyncWriter) SetWriter ¶
func (sw *SyncWriter) SetWriter(w Writer)
SetWriter synchronize close the old log writer then set the new log writer
func (*SyncWriter) Write ¶
func (sw *SyncWriter) Write(le *Event) error
Write synchronize write log event
type TeamsWriter ¶
type TeamsWriter struct { Webhook string Timeout time.Duration Subfmt Formatter // subject formatter Logfmt Formatter // log formatter Logfil Filter // log filter // contains filtered or unexported fields }
TeamsWriter implements log Writer Interface and send log message to teams.
func (*TeamsWriter) SetBuffer ¶
func (tw *TeamsWriter) SetBuffer(buffer string) error
SetBuffer set the event buffer size
func (*TeamsWriter) SetFilter ¶
func (tw *TeamsWriter) SetFilter(filter string)
SetFilter set the log filter
func (*TeamsWriter) SetFormat ¶
func (tw *TeamsWriter) SetFormat(format string)
SetFormat set the log formatter
func (*TeamsWriter) SetSubject ¶
func (tw *TeamsWriter) SetSubject(format string)
SetSubject set the subject formatter
func (*TeamsWriter) SetTimeout ¶
func (tw *TeamsWriter) SetTimeout(timeout string) error
SetTimeout set timeout
func (*TeamsWriter) SetWebhook ¶
func (tw *TeamsWriter) SetWebhook(webhook string) error
SetWebhook set the webhook URL
func (*TeamsWriter) Write ¶
func (tw *TeamsWriter) Write(le *Event) (err error)
Write send log message to teams
type TextFormatter ¶
type TextFormatter struct {
// contains filtered or unexported fields
}
TextFormatter text formatter
func NewTextFormatter ¶
func NewTextFormatter(format string) *TextFormatter
NewTextFormatter create a Text Formatter instance Text Format %t{format}: time, if {format} is omitted, '2006-01-02T15:04:05.000' will be used %c{format}: logger name %p{format}: log level prefix %l{format}: log level string %x{key}: logger property %X{=| }: logger properties (operator|separator) %S: caller source file name (!!SLOW!!) %L: caller source line number (!!SLOW!!) %F: caller function name (!!SLOW!!) %T: caller stack trace (!!SLOW!!) %m: message %n: EOL(Windows: "\r\n", Other: "\n")
func (*TextFormatter) Init ¶
func (tf *TextFormatter) Init(format string)
Init initialize the text formatter
type WebhookWriter ¶
type WebhookWriter struct { Webhook string // webhook URL Method string // http method ContentType string Timeout time.Duration Logfmt Formatter // log formatter Logfil Filter // log filter // contains filtered or unexported fields }
WebhookWriter implements log Writer Interface and send log message to webhook.
func (*WebhookWriter) SetFilter ¶
func (ww *WebhookWriter) SetFilter(filter string)
SetFilter set the log filter
func (*WebhookWriter) SetFormat ¶
func (ww *WebhookWriter) SetFormat(format string)
SetFormat set the log formatter
func (*WebhookWriter) SetTimeout ¶
func (ww *WebhookWriter) SetTimeout(timeout string) error
SetTimeout set timeout
func (*WebhookWriter) SetWebhook ¶
func (ww *WebhookWriter) SetWebhook(webhook string) error
SetWebhook set the webhook URL
func (*WebhookWriter) Write ¶
func (ww *WebhookWriter) Write(le *Event) error
Write send log message to webhook
type Writer ¶
Writer log writer interface
func NewConsoleWriter ¶
func NewConsoleWriter() Writer
NewConsoleWriter create a color console log writer
Source Files ¶
- async_writer.go
- conn_writer.go
- fallover_writer.go
- file_writer.go
- log.go
- logconfig.go
- logevent.go
- logevent_buffer_go118.go
- logfilter.go
- logformatter.go
- logger.go
- loglevel.go
- loglog.go
- logoutputer.go
- logwritter.go
- multi_writer.go
- nop_writer.go
- slack_writer.go
- smtp_writer.go
- stream_writer.go
- sync_writer.go
- teams_writer.go
- webhook_writer.go