|
|
|
|
@ -31,8 +31,8 @@ import (
|
|
|
|
|
type (
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Scope struct {
|
|
|
|
|
loggerLevel
|
|
|
|
|
LoggerScope struct {
|
|
|
|
|
LoggerLevel
|
|
|
|
|
Aggregators
|
|
|
|
|
|
|
|
|
|
path string
|
|
|
|
|
@ -43,22 +43,22 @@ type (
|
|
|
|
|
scopes Scopes
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ScopeFnc func (s *Scope)
|
|
|
|
|
LoggerScopeFnc func (s *LoggerScope)
|
|
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func newScope(name string, level Level, parent Loggable, path string, nodes [][]byte, options []ScopeFnc) *Scope {
|
|
|
|
|
func newLoggerScope(name string, level Level, parent Loggable, path string, nodes [][]byte, options []LoggerScopeFnc) *LoggerScope {
|
|
|
|
|
if path != "" {
|
|
|
|
|
path = fmt.Sprintf("%s%c%s",path,G.ScopeSep,name)
|
|
|
|
|
} else {
|
|
|
|
|
path = name
|
|
|
|
|
}
|
|
|
|
|
sc := &Scope {
|
|
|
|
|
loggerLevel: *newLoggerLevel(name,level),
|
|
|
|
|
parent: parent,
|
|
|
|
|
nodes : append(nodes,[]byte(name)),
|
|
|
|
|
path : path,
|
|
|
|
|
sc := &LoggerScope{
|
|
|
|
|
LoggerLevel: *newLoggerLevel(name,level),
|
|
|
|
|
parent: parent,
|
|
|
|
|
nodes : append(nodes,[]byte(name)),
|
|
|
|
|
path : path,
|
|
|
|
|
}
|
|
|
|
|
sc.logFn = sc.log
|
|
|
|
|
for _,o := range options {
|
|
|
|
|
@ -68,91 +68,91 @@ func newScope(name string, level Level, parent Loggable, path string, nodes [][]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Scope) Nodes() [][]byte {
|
|
|
|
|
func (s *LoggerScope) Nodes() [][]byte {
|
|
|
|
|
return s.nodes }
|
|
|
|
|
|
|
|
|
|
func (s *Scope) Path () string {
|
|
|
|
|
func (s *LoggerScope) Path () string {
|
|
|
|
|
return s.path }
|
|
|
|
|
|
|
|
|
|
func (s *Scope) Mode () (m ScopeMode) {
|
|
|
|
|
s.mux.RLock()
|
|
|
|
|
func (s *LoggerScope) Mode () (m ScopeMode) {
|
|
|
|
|
s.RLock()
|
|
|
|
|
m = s.mode
|
|
|
|
|
s.mux.RUnlock()
|
|
|
|
|
s.RUnlock()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Scope) SetMode (mode ScopeMode) {
|
|
|
|
|
func (s *LoggerScope) SetMode (mode ScopeMode) {
|
|
|
|
|
if !mode.isValid() {
|
|
|
|
|
panic(G.ErrInvalidScopeMode)
|
|
|
|
|
}
|
|
|
|
|
s.mux.Lock()
|
|
|
|
|
s.Lock()
|
|
|
|
|
s.mode = mode
|
|
|
|
|
s.mux.Unlock()
|
|
|
|
|
s.Unlock()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Scope) GetScope (name string) *Scope {
|
|
|
|
|
func (s *LoggerScope) GetScope (name string) *LoggerScope {
|
|
|
|
|
return s.getScope(strings.Split(strings.ToLower(name),g.scopeSepStr)) }
|
|
|
|
|
|
|
|
|
|
func (s *Scope) getScope (nodes []string)( sc *Scope) {
|
|
|
|
|
s.mux.RLock()
|
|
|
|
|
func (s *LoggerScope) getScope (nodes []string)( sc *LoggerScope) {
|
|
|
|
|
s.RLock()
|
|
|
|
|
if sc = s.scopes.getScope(nodes[0]); sc != nil {
|
|
|
|
|
if len(nodes) > 1 {
|
|
|
|
|
sc = sc.getScope(nodes[:1])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
s.mux.RUnlock()
|
|
|
|
|
s.RUnlock()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Scope) NewScope (path string, options ...ScopeFnc) (*Scope,error) {
|
|
|
|
|
func (s *LoggerScope) NewScope (path string, options ...LoggerScopeFnc) (*LoggerScope,error) {
|
|
|
|
|
return s.newScope(strings.Split(strings.ToLower(path),g.scopeSepStr),options) }
|
|
|
|
|
|
|
|
|
|
func (s *Scope) newScope (path []string, options []ScopeFnc) (sc *Scope, er error) {
|
|
|
|
|
s.mux.Lock()
|
|
|
|
|
func (s *LoggerScope) newScope (path []string, options []LoggerScopeFnc) (sc *LoggerScope, er error) {
|
|
|
|
|
s.Lock()
|
|
|
|
|
if sc = s.scopes.getScope(path[0]); sc == nil {
|
|
|
|
|
sc = newScope(path[0], s.level, s, s.path, s.nodes,options)
|
|
|
|
|
sc = newLoggerScope(path[0], s.level, s, s.path, s.nodes,options)
|
|
|
|
|
s.scopes = append(s.scopes, sc)
|
|
|
|
|
if len(path) == 1 {
|
|
|
|
|
s.mux.Unlock()
|
|
|
|
|
s.Unlock()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
} else if len(path) == 1 {
|
|
|
|
|
s.mux.Unlock()
|
|
|
|
|
s.Unlock()
|
|
|
|
|
return nil,G.ErrDuplicatedScope
|
|
|
|
|
}
|
|
|
|
|
sc,er = sc.newScope(path[1:],options)
|
|
|
|
|
s.mux.Unlock()
|
|
|
|
|
s.Unlock()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Scope) Log(ent *Entry) error {
|
|
|
|
|
s.mux.Lock()
|
|
|
|
|
func (s *LoggerScope) Log(ent *Entry) error {
|
|
|
|
|
s.Lock()
|
|
|
|
|
if s.mode & ScopeFilter != 0 && !s.level.Has(ent.Level) {
|
|
|
|
|
s.mux.Unlock()
|
|
|
|
|
s.Unlock()
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if s.mode.IsCascade() {
|
|
|
|
|
s.Apply(ent)
|
|
|
|
|
}
|
|
|
|
|
s.mux.Unlock()
|
|
|
|
|
s.Unlock()
|
|
|
|
|
return s.parent.Log(ent)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Scope) log(lvl Level, msg string, err error,ops ...EntryFnc){
|
|
|
|
|
s.mux.Lock()
|
|
|
|
|
func (s *LoggerScope) log(lvl Level, msg string, err error,ops ...EntryFnc){
|
|
|
|
|
s.Lock()
|
|
|
|
|
if !s.level.Has(lvl) {
|
|
|
|
|
s.mux.Unlock()
|
|
|
|
|
s.Unlock()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
en := s.Apply(AcquireEntry(nil,lvl,msg,err,ops...))
|
|
|
|
|
en.Scope = s.path
|
|
|
|
|
en.Scopes= s.nodes
|
|
|
|
|
s.mux.Unlock()
|
|
|
|
|
s.Unlock()
|
|
|
|
|
|
|
|
|
|
s.parent.Log(en)
|
|
|
|
|
ReleaseEntry(en)
|
|
|
|
|
@ -160,8 +160,8 @@ func (s *Scope) log(lvl Level, msg string, err error,ops ...EntryFnc){
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ScopeWithMode (mode ScopeMode) ScopeFnc {
|
|
|
|
|
return func(s *Scope) {
|
|
|
|
|
func LoggerScopeWithMode(mode ScopeMode) LoggerScopeFnc {
|
|
|
|
|
return func(s *LoggerScope) {
|
|
|
|
|
if !mode.isValid() {
|
|
|
|
|
panic(G.ErrInvalidScopeMode)
|
|
|
|
|
}
|
|
|
|
|
@ -174,8 +174,8 @@ func ScopeWithMode (mode ScopeMode) ScopeFnc {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ScopeWithLevel (level Level) ScopeFnc {
|
|
|
|
|
return func(s *Scope) {
|
|
|
|
|
func LoggerScopeWithLevel(level Level) LoggerScopeFnc {
|
|
|
|
|
return func(s *LoggerScope) {
|
|
|
|
|
if !level.isValid() {
|
|
|
|
|
panic(G.ErrInvalidLevel)
|
|
|
|
|
}
|
|
|
|
|
@ -183,8 +183,8 @@ func ScopeWithLevel (level Level) ScopeFnc {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func ScopeWithAggregator (aggregator ...EntryFnc) ScopeFnc {
|
|
|
|
|
return func(s *Scope) {
|
|
|
|
|
func LoggerScopeWithAggregator(aggregator ...EntryFnc) LoggerScopeFnc {
|
|
|
|
|
return func(s *LoggerScope) {
|
|
|
|
|
for _,a := range aggregator {
|
|
|
|
|
s.Aggregators = s.Aggregators.Append(a)
|
|
|
|
|
}
|