2019-06-28 10:56:57 +08:00
|
|
|
package starlog
|
|
|
|
|
|
|
|
|
|
import (
|
2026-03-19 16:37:57 +08:00
|
|
|
"context"
|
2020-06-08 15:02:07 +08:00
|
|
|
"io"
|
2026-03-19 16:37:57 +08:00
|
|
|
"os"
|
|
|
|
|
"strings"
|
|
|
|
|
"sync/atomic"
|
|
|
|
|
"time"
|
2019-12-04 12:31:08 +08:00
|
|
|
)
|
2019-06-28 10:56:57 +08:00
|
|
|
|
2026-03-19 16:37:57 +08:00
|
|
|
func (logger *StarLogger) clone() *StarLogger {
|
|
|
|
|
if logger == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return &StarLogger{
|
|
|
|
|
thread: logger.thread,
|
|
|
|
|
handlerFunc: logger.handlerFunc,
|
|
|
|
|
logcore: logger.logcore,
|
|
|
|
|
isStd: logger.isStd,
|
|
|
|
|
fields: cloneFields(logger.fields),
|
|
|
|
|
logErr: logger.logErr,
|
|
|
|
|
logCtx: logger.logCtx,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func normalizePendingLimit(limit int) int {
|
|
|
|
|
if limit < 0 {
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
return limit
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func normalizeDropPolicy(policy PendingDropPolicy) PendingDropPolicy {
|
|
|
|
|
switch policy {
|
|
|
|
|
case PendingDropOldest, PendingDropNewest, PendingBlock:
|
|
|
|
|
return policy
|
|
|
|
|
default:
|
|
|
|
|
return PendingDropOldest
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *starlog) snapshotConfigLocked() Config {
|
|
|
|
|
rateCfg := normalizeRateLimitConfig(DefaultRateLimitConfig())
|
|
|
|
|
if logger.rateLimiter != nil {
|
|
|
|
|
rateCfg = logger.rateLimiter.Config()
|
|
|
|
|
}
|
|
|
|
|
samplingCfg := normalizeSamplingConfig(DefaultSamplingConfig())
|
|
|
|
|
if logger.sampler != nil {
|
|
|
|
|
samplingCfg = logger.sampler.Config()
|
|
|
|
|
}
|
|
|
|
|
dedupCfg := normalizeDedupConfig(DefaultDedupConfig())
|
|
|
|
|
if logger.deduper != nil {
|
|
|
|
|
dedupCfg = logger.deduper.Config()
|
|
|
|
|
}
|
|
|
|
|
return Config{
|
|
|
|
|
Name: logger.name,
|
|
|
|
|
Level: logger.minLevel,
|
|
|
|
|
StdErrLevel: logger.errOutputLevel,
|
|
|
|
|
ShowFuncName: logger.showFuncName,
|
|
|
|
|
ShowFlag: logger.showThread,
|
|
|
|
|
ShowLevel: logger.showLevel,
|
|
|
|
|
ShowOriginFile: logger.showDeatilFile,
|
|
|
|
|
ShowColor: logger.showColor,
|
|
|
|
|
OnlyColorLevel: logger.onlyColorLevel,
|
|
|
|
|
ShowStd: logger.showStd,
|
|
|
|
|
StopWriter: logger.stopWriter,
|
|
|
|
|
AutoAppendNewline: logger.autoAppendNewline,
|
|
|
|
|
Switching: logger.switching,
|
|
|
|
|
LevelColors: cloneLevelAttrsMap(logger.colorList),
|
|
|
|
|
KeywordColors: cloneColorMap(logger.keywordColors),
|
|
|
|
|
KeywordMatch: logger.keywordMatchOptions,
|
|
|
|
|
ShowFieldColor: logger.showFieldColor,
|
|
|
|
|
FieldKeyColor: cloneAttrs(logger.fieldKeyColor),
|
|
|
|
|
FieldTypeColors: cloneColorMap(logger.fieldTypeColors),
|
|
|
|
|
FieldValueColors: cloneColorMap(logger.fieldValueColors),
|
|
|
|
|
EntryHandler: logger.entryHandler,
|
|
|
|
|
EntryHandlerTimeout: logger.entryHandlerTimeout,
|
|
|
|
|
Formatter: logger.formatter,
|
|
|
|
|
Sink: logger.sink,
|
|
|
|
|
Writer: logger.output,
|
|
|
|
|
PendingWriteLimit: logger.pendingWriteLimit,
|
|
|
|
|
PendingDropPolicy: logger.pendingDropPolicy,
|
|
|
|
|
Redactor: logger.redactor,
|
|
|
|
|
RedactRules: cloneRedactRules(logger.redactRules),
|
|
|
|
|
RedactFailMode: logger.redactFailMode,
|
|
|
|
|
RedactMaskToken: logger.redactMaskToken,
|
|
|
|
|
RateLimit: rateCfg,
|
|
|
|
|
Sampling: samplingCfg,
|
|
|
|
|
Dedup: dedupCfg,
|
|
|
|
|
ContextFieldExtractor: logger.contextFields,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *starlog) applyPendingLimitLocked(limit int) {
|
|
|
|
|
logger.pendingWriteLimit = normalizePendingLimit(limit)
|
|
|
|
|
if logger.pendingWriteLimit == 0 {
|
|
|
|
|
logger.signalPendingCondLocked()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if len(logger.pendingWrites) <= logger.pendingWriteLimit {
|
|
|
|
|
logger.signalPendingCondLocked()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
dropped := len(logger.pendingWrites) - logger.pendingWriteLimit
|
|
|
|
|
switch logger.pendingDropPolicy {
|
|
|
|
|
case PendingDropNewest:
|
|
|
|
|
keepEnd := len(logger.pendingWrites) - dropped
|
|
|
|
|
for idx := keepEnd; idx < len(logger.pendingWrites); idx++ {
|
|
|
|
|
reportWriteError(ErrPendingWriteDropped, LogData{
|
|
|
|
|
Name: logger.name,
|
|
|
|
|
Log: logger.pendingWrites[idx],
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
logger.pendingWrites = logger.pendingWrites[:keepEnd]
|
|
|
|
|
default:
|
|
|
|
|
for idx := 0; idx < dropped; idx++ {
|
|
|
|
|
reportWriteError(ErrPendingWriteDropped, LogData{
|
|
|
|
|
Name: logger.name,
|
|
|
|
|
Log: logger.pendingWrites[idx],
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
logger.pendingWrites = logger.pendingWrites[dropped:]
|
|
|
|
|
}
|
|
|
|
|
atomic.AddUint64(&logger.pendingDropCount, uint64(dropped))
|
|
|
|
|
logger.signalPendingCondLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *starlog) applyConfigLocked(cfg Config) {
|
|
|
|
|
logger.name = cfg.Name
|
|
|
|
|
logger.minLevel = cfg.Level
|
|
|
|
|
logger.errOutputLevel = cfg.StdErrLevel
|
|
|
|
|
logger.showFuncName = cfg.ShowFuncName
|
|
|
|
|
logger.showThread = cfg.ShowFlag
|
|
|
|
|
logger.showLevel = cfg.ShowLevel
|
|
|
|
|
logger.showDeatilFile = cfg.ShowOriginFile
|
|
|
|
|
logger.showColor = cfg.ShowColor
|
|
|
|
|
logger.onlyColorLevel = cfg.OnlyColorLevel
|
|
|
|
|
logger.showStd = cfg.ShowStd
|
|
|
|
|
logger.stopWriter = cfg.StopWriter
|
|
|
|
|
logger.autoAppendNewline = cfg.AutoAppendNewline
|
|
|
|
|
logger.colorList = cloneLevelAttrsMap(cfg.LevelColors)
|
|
|
|
|
logger.colorMe = cloneLevelColorMap(logger.colorList)
|
|
|
|
|
logger.keywordColors = cloneColorMap(cfg.KeywordColors)
|
|
|
|
|
logger.rebuildKeywordCachesLocked()
|
|
|
|
|
logger.keywordMatchOptions = cfg.KeywordMatch
|
|
|
|
|
logger.showFieldColor = cfg.ShowFieldColor
|
|
|
|
|
logger.fieldKeyColor = cloneAttrs(cfg.FieldKeyColor)
|
|
|
|
|
logger.fieldTypeColors = cloneColorMap(cfg.FieldTypeColors)
|
|
|
|
|
logger.fieldValueColors = cloneColorMap(cfg.FieldValueColors)
|
|
|
|
|
logger.entryHandler = cfg.EntryHandler
|
|
|
|
|
if cfg.EntryHandlerTimeout < 0 {
|
|
|
|
|
cfg.EntryHandlerTimeout = 0
|
|
|
|
|
}
|
|
|
|
|
logger.entryHandlerTimeout = cfg.EntryHandlerTimeout
|
|
|
|
|
logger.formatter = cfg.Formatter
|
|
|
|
|
logger.sink = cfg.Sink
|
|
|
|
|
logger.output = cfg.Writer
|
|
|
|
|
logger.pendingDropPolicy = normalizeDropPolicy(cfg.PendingDropPolicy)
|
|
|
|
|
logger.applyPendingLimitLocked(cfg.PendingWriteLimit)
|
|
|
|
|
logger.redactor = cfg.Redactor
|
|
|
|
|
logger.redactRules = cloneRedactRules(cfg.RedactRules)
|
|
|
|
|
switch cfg.RedactFailMode {
|
|
|
|
|
case RedactFailMaskAll, RedactFailOpen, RedactFailDrop:
|
|
|
|
|
logger.redactFailMode = cfg.RedactFailMode
|
|
|
|
|
default:
|
|
|
|
|
logger.redactFailMode = RedactFailMaskAll
|
|
|
|
|
}
|
|
|
|
|
logger.redactMaskToken = normalizeRedactMask(cfg.RedactMaskToken)
|
|
|
|
|
if logger.rateLimiter == nil {
|
|
|
|
|
logger.rateLimiter = newRateLimiter()
|
|
|
|
|
}
|
|
|
|
|
logger.rateLimiter.SetConfig(cfg.RateLimit)
|
|
|
|
|
if logger.sampler == nil {
|
|
|
|
|
logger.sampler = newSampler()
|
|
|
|
|
}
|
|
|
|
|
logger.sampler.SetConfig(cfg.Sampling)
|
|
|
|
|
if logger.deduper == nil {
|
|
|
|
|
logger.deduper = newDeduper()
|
|
|
|
|
}
|
|
|
|
|
logger.deduper.SetConfig(cfg.Dedup)
|
|
|
|
|
logger.contextFields = cfg.ContextFieldExtractor
|
|
|
|
|
logger.switching = cfg.Switching
|
|
|
|
|
if !logger.switching {
|
|
|
|
|
logger.writePendingLocked()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
logger.signalPendingCondLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetConfig() Config {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.snapshotConfigLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) ApplyConfig(cfg Config) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.applyConfigLocked(cfg)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) UpdateConfig(update func(*Config)) {
|
|
|
|
|
if update == nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
cfg := logger.logcore.snapshotConfigLocked()
|
|
|
|
|
update(&cfg)
|
|
|
|
|
logger.logcore.applyConfigLocked(cfg)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func DefaultConfig() Config {
|
|
|
|
|
core := newLogCore(nil)
|
|
|
|
|
return core.snapshotConfigLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) WithField(key string, value interface{}) *StarLogger {
|
|
|
|
|
key = strings.TrimSpace(key)
|
|
|
|
|
if key == "" {
|
|
|
|
|
return logger
|
|
|
|
|
}
|
|
|
|
|
cloned := logger.clone()
|
|
|
|
|
if cloned.fields == nil {
|
|
|
|
|
cloned.fields = make(Fields)
|
|
|
|
|
}
|
|
|
|
|
cloned.fields[key] = value
|
|
|
|
|
return cloned
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) WithFields(fields Fields) *StarLogger {
|
|
|
|
|
if len(fields) == 0 {
|
|
|
|
|
return logger
|
|
|
|
|
}
|
|
|
|
|
cloned := logger.clone()
|
|
|
|
|
if cloned.fields == nil {
|
|
|
|
|
cloned.fields = make(Fields)
|
|
|
|
|
}
|
|
|
|
|
for key, value := range fields {
|
|
|
|
|
key = strings.TrimSpace(key)
|
|
|
|
|
if key == "" {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
cloned.fields[key] = value
|
|
|
|
|
}
|
|
|
|
|
return cloned
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) WithError(err error) *StarLogger {
|
|
|
|
|
cloned := logger.clone()
|
|
|
|
|
cloned.logErr = err
|
|
|
|
|
return cloned
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) WithContext(ctx context.Context) *StarLogger {
|
|
|
|
|
cloned := logger.clone()
|
|
|
|
|
cloned.logCtx = ctx
|
|
|
|
|
return cloned
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetContextFieldExtractor(extractor func(context.Context) Fields) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.contextFields = extractor
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetRedactor(redactor Redactor) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.redactor = redactor
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetRedactor() Redactor {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.redactor
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) AddRedactRule(rule RedactRule) {
|
|
|
|
|
if rule == nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.redactRules = append(logger.logcore.redactRules, rule)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetRedactRules(rules []RedactRule) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.redactRules = cloneRedactRules(rules)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) ClearRedactRules() {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.redactRules = nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetRedactRuleCount() int {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return len(logger.logcore.redactRules)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetRedactFailMode(mode RedactFailMode) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
switch mode {
|
|
|
|
|
case RedactFailMaskAll, RedactFailOpen, RedactFailDrop:
|
|
|
|
|
default:
|
|
|
|
|
mode = RedactFailMaskAll
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.redactFailMode = mode
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetRedactFailMode() RedactFailMode {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.redactFailMode
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetRedactMaskToken(mask string) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.redactMaskToken = normalizeRedactMask(mask)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetRedactMaskToken() string {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.redactMaskToken
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetRedactErrorCount() uint64 {
|
|
|
|
|
return atomic.LoadUint64(&logger.logcore.redactErrorCount)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) emit(level int, isShow bool, message string) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
handler := logger.handlerFunc
|
|
|
|
|
logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.build(logger.thread, logger.isStd, isShow, handler, level, message, cloneFields(logger.fields), logger.logErr, logger.logCtx)
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) SetShowColor(val bool) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.showColor = val
|
2019-06-28 10:56:57 +08:00
|
|
|
}
|
2019-12-04 12:31:08 +08:00
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) GetShowColor() bool {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
return logger.logcore.showColor
|
2019-06-28 10:56:57 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) SetLevelColor(level int, color []Attr) {
|
2026-03-19 16:37:57 +08:00
|
|
|
cloned := make([]Attr, len(color))
|
|
|
|
|
copy(cloned, color)
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.colorList[level] = cloned
|
|
|
|
|
logger.logcore.colorMe[level] = NewColor(cloned...)
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
2019-06-28 10:56:57 +08:00
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) GetLevelColor(level int) []Attr {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
if logger.logcore.colorList[level] == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
cloned := make([]Attr, len(logger.logcore.colorList[level]))
|
|
|
|
|
copy(cloned, logger.logcore.colorList[level])
|
|
|
|
|
return cloned
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetLevel(level int) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.minLevel = level
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetLevel() int {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.minLevel
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) IsLevelEnabled(level int) bool {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return level >= logger.logcore.minLevel
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) SetWriter(wr io.Writer) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.output = wr
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.sink = nil
|
|
|
|
|
if !logger.logcore.switching {
|
|
|
|
|
logger.logcore.writePendingLocked()
|
|
|
|
|
}
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) GetWriter() io.Writer {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
return logger.logcore.output
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-19 16:37:57 +08:00
|
|
|
func (logger *StarLogger) SetSink(sink Sink) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.sink = sink
|
|
|
|
|
if !logger.logcore.switching {
|
|
|
|
|
logger.logcore.writePendingLocked()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetSinks(sinks ...Sink) {
|
|
|
|
|
logger.SetSink(NewMultiSink(sinks...))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetSink() Sink {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.sink
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetFormatter(formatter Formatter) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.formatter = formatter
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetFormatter() Formatter {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.formatter
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetEntryHandler(handler Handler) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.entryHandler = handler
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetEntryHandler() Handler {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.entryHandler
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) AppendEntryHandler(handler Handler) {
|
|
|
|
|
if handler == nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
current := logger.logcore.entryHandler
|
|
|
|
|
logger.logcore.mu.Unlock()
|
|
|
|
|
logger.SetEntryHandler(ChainHandler(current, handler))
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-16 11:01:09 +08:00
|
|
|
func (logger *StarLogger) SetHandler(f func(LogData)) {
|
2023-02-03 14:20:02 +08:00
|
|
|
if f != nil {
|
|
|
|
|
StartStacks()
|
|
|
|
|
}
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.handlerFunc = f
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
2022-06-16 11:01:09 +08:00
|
|
|
func (logger *StarLogger) GetHandler() func(LogData) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
return logger.handlerFunc
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) SetSwitching(sw bool) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.switching = sw
|
2026-03-19 16:37:57 +08:00
|
|
|
if !sw {
|
|
|
|
|
logger.logcore.writePendingLocked()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.signalPendingCondLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetAsyncErrorHandler(alert func(error, LogData)) {
|
|
|
|
|
SetAsyncErrorHandler(alert)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetAsyncDropCount() uint64 {
|
|
|
|
|
return GetAsyncDropCount()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetAsyncFallbackToSync(enable bool) {
|
|
|
|
|
SetAsyncFallbackToSync(enable)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetAsyncFallbackToSync() bool {
|
|
|
|
|
return GetAsyncFallbackToSync()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetAsyncHandlerTimeout(timeout time.Duration) {
|
|
|
|
|
SetAsyncHandlerTimeout(timeout)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetAsyncHandlerTimeout() time.Duration {
|
|
|
|
|
return GetAsyncHandlerTimeout()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetWriteErrorHandler(alert func(error, LogData)) {
|
|
|
|
|
SetWriteErrorHandler(alert)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetWriteErrorCount() uint64 {
|
|
|
|
|
return GetWriteErrorCount()
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2021-09-23 10:28:05 +08:00
|
|
|
func (logger *StarLogger) SetOnlyColorLevel(ocl bool) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2021-09-23 10:28:05 +08:00
|
|
|
logger.logcore.onlyColorLevel = ocl
|
|
|
|
|
}
|
|
|
|
|
func (logger *StarLogger) GetOnlyColorLevel() bool {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2021-09-23 10:28:05 +08:00
|
|
|
return logger.logcore.onlyColorLevel
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-19 16:37:57 +08:00
|
|
|
func (logger *StarLogger) SetColorMode(mode ColorMode) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
switch mode {
|
|
|
|
|
case ColorModeOff:
|
|
|
|
|
logger.logcore.showColor = false
|
|
|
|
|
logger.logcore.onlyColorLevel = false
|
|
|
|
|
case ColorModeLevelOnly:
|
|
|
|
|
logger.logcore.showColor = true
|
|
|
|
|
logger.logcore.onlyColorLevel = true
|
|
|
|
|
default:
|
|
|
|
|
logger.logcore.showColor = true
|
|
|
|
|
logger.logcore.onlyColorLevel = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetColorMode() ColorMode {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
if !logger.logcore.showColor {
|
|
|
|
|
return ColorModeOff
|
|
|
|
|
}
|
|
|
|
|
if logger.logcore.onlyColorLevel {
|
|
|
|
|
return ColorModeLevelOnly
|
|
|
|
|
}
|
|
|
|
|
return ColorModeFullLine
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetKeywordColor(keyword string, color []Attr) {
|
|
|
|
|
keyword = strings.TrimSpace(keyword)
|
|
|
|
|
if keyword == "" {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
cloned := make([]Attr, len(color))
|
|
|
|
|
copy(cloned, color)
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.keywordColors[keyword] = cloned
|
|
|
|
|
logger.logcore.rebuildKeywordCachesLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func cloneAttrs(color []Attr) []Attr {
|
|
|
|
|
cloned := make([]Attr, len(color))
|
|
|
|
|
copy(cloned, color)
|
|
|
|
|
return cloned
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func cloneColorMap(source map[string][]Attr) map[string][]Attr {
|
|
|
|
|
if len(source) == 0 {
|
|
|
|
|
return map[string][]Attr{}
|
|
|
|
|
}
|
|
|
|
|
cloned := make(map[string][]Attr, len(source))
|
|
|
|
|
for key, attrs := range source {
|
|
|
|
|
cloned[key] = cloneAttrs(attrs)
|
|
|
|
|
}
|
|
|
|
|
return cloned
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) RemoveKeywordColor(keyword string) {
|
|
|
|
|
keyword = strings.TrimSpace(keyword)
|
|
|
|
|
if keyword == "" {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
delete(logger.logcore.keywordColors, keyword)
|
|
|
|
|
logger.logcore.rebuildKeywordCachesLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) ClearKeywordColors() {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.keywordColors = make(map[string][]Attr)
|
|
|
|
|
logger.logcore.rebuildKeywordCachesLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetKeywordColors(colors map[string][]Attr) {
|
|
|
|
|
cloned := make(map[string][]Attr, len(colors))
|
|
|
|
|
for keyword, attrs := range colors {
|
|
|
|
|
keyword = strings.TrimSpace(keyword)
|
|
|
|
|
if keyword == "" {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
attrCopy := make([]Attr, len(attrs))
|
|
|
|
|
copy(attrCopy, attrs)
|
|
|
|
|
cloned[keyword] = attrCopy
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.keywordColors = cloned
|
|
|
|
|
logger.logcore.rebuildKeywordCachesLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetKeywordColors() map[string][]Attr {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
cloned := make(map[string][]Attr, len(logger.logcore.keywordColors))
|
|
|
|
|
for keyword, attrs := range logger.logcore.keywordColors {
|
|
|
|
|
attrCopy := make([]Attr, len(attrs))
|
|
|
|
|
copy(attrCopy, attrs)
|
|
|
|
|
cloned[keyword] = attrCopy
|
|
|
|
|
}
|
|
|
|
|
return cloned
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetKeywordMatchOptions(opts KeywordMatchOptions) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.keywordMatchOptions = opts
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetKeywordMatchOptions() KeywordMatchOptions {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.keywordMatchOptions
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetKeywordIgnoreCase(enable bool) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.keywordMatchOptions.IgnoreCase = enable
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetKeywordIgnoreCase() bool {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.keywordMatchOptions.IgnoreCase
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetKeywordWholeWord(enable bool) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.keywordMatchOptions.WholeWord = enable
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetKeywordWholeWord() bool {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.keywordMatchOptions.WholeWord
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetShowFieldColor(show bool) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.showFieldColor = show
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetShowFieldColor() bool {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.showFieldColor
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetFieldKeyColor(color []Attr) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.fieldKeyColor = cloneAttrs(color)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetFieldKeyColor() []Attr {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return cloneAttrs(logger.logcore.fieldKeyColor)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetFieldTypeColor(fieldType string, color []Attr) {
|
|
|
|
|
fieldType = strings.TrimSpace(strings.ToLower(fieldType))
|
|
|
|
|
if fieldType == "" {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
if logger.logcore.fieldTypeColors == nil {
|
|
|
|
|
logger.logcore.fieldTypeColors = make(map[string][]Attr)
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.fieldTypeColors[fieldType] = cloneAttrs(color)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetFieldTypeColors() map[string][]Attr {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return cloneColorMap(logger.logcore.fieldTypeColors)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetFieldValueColor(field string, color []Attr) {
|
|
|
|
|
field = strings.TrimSpace(field)
|
|
|
|
|
if field == "" {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
if logger.logcore.fieldValueColors == nil {
|
|
|
|
|
logger.logcore.fieldValueColors = make(map[string][]Attr)
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.fieldValueColors[field] = cloneAttrs(color)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) RemoveFieldValueColor(field string) {
|
|
|
|
|
field = strings.TrimSpace(field)
|
|
|
|
|
if field == "" {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
delete(logger.logcore.fieldValueColors, field)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) ClearFieldValueColors() {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.fieldValueColors = make(map[string][]Attr)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetFieldValueColors() map[string][]Attr {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return cloneColorMap(logger.logcore.fieldValueColors)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetPendingWriteLimit(limit int) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.applyPendingLimitLocked(limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetPendingWriteLimit() int {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.pendingWriteLimit
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetPendingDropPolicy(policy PendingDropPolicy) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.pendingDropPolicy = normalizeDropPolicy(policy)
|
|
|
|
|
logger.logcore.signalPendingCondLocked()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetPendingDropPolicy() PendingDropPolicy {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.pendingDropPolicy
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetPendingDropCount() uint64 {
|
|
|
|
|
return atomic.LoadUint64(&logger.logcore.pendingDropCount)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetPendingBlockCount() uint64 {
|
|
|
|
|
return atomic.LoadUint64(&logger.logcore.pendingBlockCount)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetPendingPeakLength() int {
|
|
|
|
|
return int(atomic.LoadUint64(&logger.logcore.pendingPeakLen))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetPendingStats() PendingStats {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return PendingStats{
|
|
|
|
|
Limit: logger.logcore.pendingWriteLimit,
|
|
|
|
|
Length: len(logger.logcore.pendingWrites),
|
|
|
|
|
PeakLength: int(atomic.LoadUint64(&logger.logcore.pendingPeakLen)),
|
|
|
|
|
DropCount: atomic.LoadUint64(&logger.logcore.pendingDropCount),
|
|
|
|
|
BlockCount: atomic.LoadUint64(&logger.logcore.pendingBlockCount),
|
|
|
|
|
Policy: logger.logcore.pendingDropPolicy,
|
|
|
|
|
Switching: logger.logcore.switching,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) SetEntryHandlerTimeout(timeout time.Duration) {
|
|
|
|
|
if timeout < 0 {
|
|
|
|
|
timeout = 0
|
|
|
|
|
}
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.entryHandlerTimeout = timeout
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetEntryHandlerTimeout() time.Duration {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.entryHandlerTimeout
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) SetShowOriginFile(val bool) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.showDeatilFile = val
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) GetShowOriginFile() bool {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
return logger.logcore.showDeatilFile
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) SetShowFuncName(val bool) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.showFuncName = val
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) GetShowFuncName() bool {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
return logger.logcore.showFuncName
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) SetShowLevel(val bool) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.showLevel = val
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) GetShowLevel() bool {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
return logger.logcore.showLevel
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) SetShowFlag(val bool) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.showThread = val
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) GetShowFlag() bool {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
return logger.logcore.showThread
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) SetShowStd(val bool) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.showStd = val
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) GetShowStd() bool {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
return logger.logcore.showStd
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-19 16:37:57 +08:00
|
|
|
func (logger *StarLogger) SetAutoAppendNewline(enable bool) {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
logger.logcore.autoAppendNewline = enable
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) GetAutoAppendNewline() bool {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
|
|
|
|
return logger.logcore.autoAppendNewline
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) StopWrite() {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.stopWriter = true
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-19 16:37:57 +08:00
|
|
|
func (logger *StarLogger) EnableWrite() {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
logger.logcore.stopWriter = false
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-19 16:37:57 +08:00
|
|
|
func (logger *StarLogger) IsWriteStopped() bool {
|
|
|
|
|
logger.logcore.mu.Lock()
|
|
|
|
|
defer logger.logcore.mu.Unlock()
|
2020-12-21 17:22:45 +08:00
|
|
|
return logger.logcore.stopWriter
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-19 16:37:57 +08:00
|
|
|
// Deprecated: use EnableWrite.
|
|
|
|
|
func (logger *StarLogger) EnbaleWrite() {
|
|
|
|
|
logger.EnableWrite()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Deprecated: use IsWriteStopped.
|
|
|
|
|
func (logger *StarLogger) IsWriteStoed() bool {
|
|
|
|
|
return logger.IsWriteStopped()
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Debug(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvDebug, logger.GetShowStd(), logger.logcore.print(str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Debugf(format string, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvDebug, logger.GetShowStd(), logger.logcore.printf(format, str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Debugln(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvDebug, logger.GetShowStd(), logger.logcore.println(str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Info(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvInfo, logger.GetShowStd(), logger.logcore.print(str...))
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Infof(format string, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvInfo, logger.GetShowStd(), logger.logcore.printf(format, str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Infoln(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvInfo, logger.GetShowStd(), logger.logcore.println(str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Notice(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvNotice, logger.GetShowStd(), logger.logcore.print(str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Noticef(format string, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvNotice, logger.GetShowStd(), logger.logcore.printf(format, str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Noticeln(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvNotice, logger.GetShowStd(), logger.logcore.println(str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Warning(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvWarning, logger.GetShowStd(), logger.logcore.print(str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Warningf(format string, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvWarning, logger.GetShowStd(), logger.logcore.printf(format, str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Warningln(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvWarning, logger.GetShowStd(), logger.logcore.println(str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Error(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvError, logger.GetShowStd(), logger.logcore.print(str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Errorf(format string, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvError, logger.GetShowStd(), logger.logcore.printf(format, str...))
|
2020-06-08 15:02:07 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Errorln(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvError, logger.GetShowStd(), logger.logcore.println(str...))
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Critical(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvCritical, logger.GetShowStd(), logger.logcore.print(str...))
|
2020-10-22 16:42:21 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Criticalf(format string, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvCritical, logger.GetShowStd(), logger.logcore.printf(format, str...))
|
2020-10-22 16:42:21 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Criticalln(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvCritical, logger.GetShowStd(), logger.logcore.println(str...))
|
2020-10-22 16:42:21 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Fatal(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvFatal, logger.GetShowStd(), logger.logcore.print(str...))
|
|
|
|
|
_ = logger.Shutdown(context.Background())
|
|
|
|
|
os.Exit(9)
|
2020-10-22 16:42:21 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Fatalf(format string, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvFatal, logger.GetShowStd(), logger.logcore.printf(format, str...))
|
|
|
|
|
_ = logger.Shutdown(context.Background())
|
|
|
|
|
os.Exit(9)
|
2019-12-04 12:31:08 +08:00
|
|
|
}
|
|
|
|
|
|
2020-12-21 17:22:45 +08:00
|
|
|
func (logger *StarLogger) Fatalln(str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(LvFatal, logger.GetShowStd(), logger.logcore.println(str...))
|
|
|
|
|
_ = logger.Shutdown(context.Background())
|
|
|
|
|
os.Exit(9)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Panic(str ...interface{}) {
|
|
|
|
|
msg := logger.logcore.print(str...)
|
|
|
|
|
logger.emit(LvPanic, logger.GetShowStd(), msg)
|
|
|
|
|
panic(str)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Panicf(format string, str ...interface{}) {
|
|
|
|
|
msg := logger.logcore.printf(format, str...)
|
|
|
|
|
logger.emit(LvPanic, logger.GetShowStd(), msg)
|
|
|
|
|
panic(msg)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Panicln(str ...interface{}) {
|
|
|
|
|
msg := logger.logcore.println(str...)
|
|
|
|
|
logger.emit(LvPanic, logger.GetShowStd(), msg)
|
|
|
|
|
panic(msg)
|
2019-06-28 10:56:57 +08:00
|
|
|
}
|
2020-12-22 11:07:20 +08:00
|
|
|
|
|
|
|
|
func (logger *StarLogger) Print(str ...interface{}) {
|
2021-09-23 10:28:05 +08:00
|
|
|
logger.logcore.Print(logger.thread, logger.isStd, logger.GetShowStd(), logger.handlerFunc, str...)
|
2020-12-22 11:07:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Printf(format string, str ...interface{}) {
|
2021-09-23 10:28:05 +08:00
|
|
|
logger.logcore.Printf(logger.thread, logger.isStd, logger.GetShowStd(), logger.handlerFunc, format, str...)
|
2020-12-22 11:07:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Println(str ...interface{}) {
|
2021-09-23 10:28:05 +08:00
|
|
|
logger.logcore.Println(logger.thread, logger.isStd, logger.GetShowStd(), logger.handlerFunc, str...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Log(showLog bool, level int, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(level, showLog, logger.logcore.print(str...))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) LogContext(ctx context.Context, showLog bool, level int, str ...interface{}) {
|
|
|
|
|
logger.WithContext(ctx).Log(showLog, level, str...)
|
2021-09-23 10:28:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Logf(showLog bool, level int, format string, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(level, showLog, logger.logcore.printf(format, str...))
|
2021-09-23 10:28:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Logln(showLog bool, level int, str ...interface{}) {
|
2026-03-19 16:37:57 +08:00
|
|
|
logger.emit(level, showLog, logger.logcore.println(str...))
|
2020-12-22 11:07:20 +08:00
|
|
|
}
|
2022-06-16 11:01:09 +08:00
|
|
|
|
|
|
|
|
func (logger *StarLogger) Write(str ...interface{}) {
|
|
|
|
|
logger.logcore.Write(str...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Writef(format string, str ...interface{}) {
|
|
|
|
|
logger.logcore.Writef(format, str...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) Writeln(str ...interface{}) {
|
|
|
|
|
logger.logcore.Writeln(str...)
|
|
|
|
|
}
|
2026-03-19 16:37:57 +08:00
|
|
|
|
|
|
|
|
func (logger *StarLogger) DebugContext(ctx context.Context, str ...interface{}) {
|
|
|
|
|
logger.WithContext(ctx).Debug(str...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) InfoContext(ctx context.Context, str ...interface{}) {
|
|
|
|
|
logger.WithContext(ctx).Info(str...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) NoticeContext(ctx context.Context, str ...interface{}) {
|
|
|
|
|
logger.WithContext(ctx).Notice(str...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) WarningContext(ctx context.Context, str ...interface{}) {
|
|
|
|
|
logger.WithContext(ctx).Warning(str...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) ErrorContext(ctx context.Context, str ...interface{}) {
|
|
|
|
|
logger.WithContext(ctx).Error(str...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (logger *StarLogger) CriticalContext(ctx context.Context, str ...interface{}) {
|
|
|
|
|
logger.WithContext(ctx).Critical(str...)
|
|
|
|
|
}
|