|
|
|
|
@ -60,36 +60,37 @@ type (
|
|
|
|
|
errors errs.ErrorList
|
|
|
|
|
|
|
|
|
|
onErrorFn ActiveLoggerErrorFnc
|
|
|
|
|
onFatalFn ActiveLoggerEntryFnc
|
|
|
|
|
|
|
|
|
|
onEntryErrorFn ActiveLoggerEntryFnc
|
|
|
|
|
onEntryFatalFn ActiveLoggerEntryFnc
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ActiveLoggerFnc func(manager *ActiveLogger)
|
|
|
|
|
ActiveLoggerFnc func(manager *ActiveLogger) error
|
|
|
|
|
|
|
|
|
|
ActiveLoggerErrorFnc func(manager *ActiveLogger, err error)
|
|
|
|
|
ActiveLoggerErrorFnc func(manager *ActiveLogger, err error, logger Logger)
|
|
|
|
|
|
|
|
|
|
ActiveLoggerEntryFnc func(manager *ActiveLogger, entry *Entry)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func NewActiveManager(name string, level Level, options ...ActiveLoggerFnc) *ActiveLogger {
|
|
|
|
|
func NewActiveLogger(name string, level Level, options ...ActiveLoggerFnc) (*ActiveLogger,error) {
|
|
|
|
|
l := &ActiveLogger{
|
|
|
|
|
filters : *NewEntryFilters(),
|
|
|
|
|
level : level,
|
|
|
|
|
state : StateCreated,
|
|
|
|
|
logErrors: true,
|
|
|
|
|
queue : *queue.NewGQueue[*Entry](false),
|
|
|
|
|
level : level,
|
|
|
|
|
name : name,
|
|
|
|
|
state : StateCreated,
|
|
|
|
|
filters : *NewEntryFilters(),
|
|
|
|
|
queue : *queue.NewGQueue[*Entry](false),
|
|
|
|
|
ctx : context.Background(),
|
|
|
|
|
logErrors : true,
|
|
|
|
|
onEntryErrorFn: nopEntryHandler,
|
|
|
|
|
onEntryFatalFn: nopEntryHandler,
|
|
|
|
|
}
|
|
|
|
|
for _,o := range options {
|
|
|
|
|
o(l)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if l.asyncMode {
|
|
|
|
|
if l.ctx == nil {
|
|
|
|
|
l.ctx = context.Background()
|
|
|
|
|
if er := o(l); er != nil {
|
|
|
|
|
return nil,er
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return l
|
|
|
|
|
return l,nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -366,8 +367,12 @@ func (l *ActiveLogger) dispatchEntry(entry *Entry) error {
|
|
|
|
|
er := l.handleLoggers(entry,func(c Logger, e *Entry) error { return c.Log(e) },G.FmtMsgLogErr)
|
|
|
|
|
|
|
|
|
|
if entry.Logger == l {
|
|
|
|
|
if entry.Level == LevelFatal && l.onFatalFn != nil {
|
|
|
|
|
l.onFatalFn(l, entry)
|
|
|
|
|
|
|
|
|
|
if entry.Level == LevelFatal {
|
|
|
|
|
l.onEntryFatalFn(l, entry)
|
|
|
|
|
}
|
|
|
|
|
if entry.Level == LevelError {
|
|
|
|
|
l.onEntryErrorFn(l, entry)
|
|
|
|
|
}
|
|
|
|
|
ReleaseEntry(entry)
|
|
|
|
|
}
|
|
|
|
|
@ -380,7 +385,7 @@ func (l *ActiveLogger) dispatchEntry(entry *Entry) error {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (l *ActiveLogger) handleError (err error, entry *Entry) {
|
|
|
|
|
func (l *ActiveLogger) handleError (err error, entry *Entry, logger Logger) {
|
|
|
|
|
if err == nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
@ -392,7 +397,7 @@ func (l *ActiveLogger) handleError (err error, entry *Entry) {
|
|
|
|
|
l.queue.Push(entry)
|
|
|
|
|
}
|
|
|
|
|
if l.onErrorFn != nil {
|
|
|
|
|
l.onErrorFn(l,err)
|
|
|
|
|
go l.onErrorFn(l,err,logger)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -419,7 +424,7 @@ func (l *ActiveLogger) handleLoggers(entry *Entry, doFn func(c Logger, e *Entry)
|
|
|
|
|
EntryWithExclude (nm),
|
|
|
|
|
EntryWithField (entryFieldLogger,nm,true))
|
|
|
|
|
}
|
|
|
|
|
l.handleError(er,en)
|
|
|
|
|
l.handleError(er,en,co)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -463,31 +468,101 @@ func (l *ActiveLogger) runLogger () {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ActiveLoggerWithFilters (configFilters EntryFiltersFnc) ActiveLoggerFnc {
|
|
|
|
|
return func(a *ActiveLogger) {
|
|
|
|
|
configFilters(&a.filters) } }
|
|
|
|
|
return func(a *ActiveLogger) error {
|
|
|
|
|
if a.State() != StateCreated {
|
|
|
|
|
return G.ErrInvalidState.WrapWithMessage("config-active-logger-with-filters")
|
|
|
|
|
}
|
|
|
|
|
configFilters(&a.filters)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ActiveLoggerWithOnFatal (onFatal ActiveLoggerEntryFnc) ActiveLoggerFnc {
|
|
|
|
|
return func(a *ActiveLogger) {
|
|
|
|
|
a.onFatalFn = onFatal } }
|
|
|
|
|
return func(a *ActiveLogger) error {
|
|
|
|
|
if a.State() != StateCreated {
|
|
|
|
|
return G.ErrInvalidState.WrapWithMessage("config-active-logger-with-on-fatal")
|
|
|
|
|
}
|
|
|
|
|
a.onEntryFatalFn = onFatal
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ActiveLoggerWithOnError (onError ActiveLoggerErrorFnc) ActiveLoggerFnc {
|
|
|
|
|
return func(a *ActiveLogger) {
|
|
|
|
|
a.onErrorFn = onError } }
|
|
|
|
|
return func(a *ActiveLogger) error {
|
|
|
|
|
if a.State() != StateCreated {
|
|
|
|
|
return G.ErrInvalidState.WrapWithMessage("config-active-logger-with-on-error")
|
|
|
|
|
}
|
|
|
|
|
a.onErrorFn = onError
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ActiveLoggerWithOnEntryError (onError ActiveLoggerEntryFnc) ActiveLoggerFnc {
|
|
|
|
|
return func(a *ActiveLogger) error {
|
|
|
|
|
if a.State() != StateCreated {
|
|
|
|
|
return G.ErrInvalidState.WrapWithMessage("config-active-logger-with-on-entry-error")
|
|
|
|
|
}
|
|
|
|
|
if onError == nil {
|
|
|
|
|
a.onEntryErrorFn = nopEntryHandler
|
|
|
|
|
} else {
|
|
|
|
|
a.onEntryErrorFn = onError
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ActiveLoggerWithOnEntryFatal (onError ActiveLoggerEntryFnc) ActiveLoggerFnc {
|
|
|
|
|
return func(a *ActiveLogger) error {
|
|
|
|
|
if a.State() != StateCreated {
|
|
|
|
|
return G.ErrInvalidState.WrapWithMessage("config-active-logger-with-on-entry-error")
|
|
|
|
|
}
|
|
|
|
|
if onError == nil {
|
|
|
|
|
a.onEntryFatalFn = nopEntryHandler
|
|
|
|
|
} else {
|
|
|
|
|
a.onEntryFatalFn = onError
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ActiveLoggerWithExtender (extender ...EntryExtender) ActiveLoggerFnc {
|
|
|
|
|
return func(a *ActiveLogger) {
|
|
|
|
|
a.extenders = append(a.extenders,extender...) } }
|
|
|
|
|
return func(a *ActiveLogger) error {
|
|
|
|
|
if a.State() != StateCreated {
|
|
|
|
|
return G.ErrInvalidState.WrapWithMessage("config-active-logger-with-extender")
|
|
|
|
|
}
|
|
|
|
|
a.extenders = append(a.extenders,extender...)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ActiveLoggerWithContext (ctx context.Context, asyncMode bool) ActiveLoggerFnc {
|
|
|
|
|
return func(a *ActiveLogger) {
|
|
|
|
|
return func(a *ActiveLogger) error {
|
|
|
|
|
if a.State() != StateCreated {
|
|
|
|
|
return G.ErrInvalidState.WrapWithMessage("config-active-logger-with-context")
|
|
|
|
|
}
|
|
|
|
|
if ctx == nil {
|
|
|
|
|
ctx = context.Background()
|
|
|
|
|
} else if ctx.Err() != nil {
|
|
|
|
|
return *errs.NewErrCause(G.ErrInvalidContext.WrapWithMessage("config-active-logger-with-context"),ctx.Err())
|
|
|
|
|
}
|
|
|
|
|
a.ctx = ctx
|
|
|
|
|
if asyncMode {
|
|
|
|
|
a.asyncMode = true
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func nopEntryHandler (_ *ActiveLogger,_ *Entry) {}
|