starlog/starlog.go
2026-03-19 16:37:57 +08:00

1088 lines
30 KiB
Go

package starlog
import (
"context"
"io"
"os"
"strings"
"sync/atomic"
"time"
)
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)
}
func (logger *StarLogger) SetShowColor(val bool) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.showColor = val
}
func (logger *StarLogger) GetShowColor() bool {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.showColor
}
func (logger *StarLogger) SetLevelColor(level int, color []Attr) {
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...)
}
func (logger *StarLogger) GetLevelColor(level int) []Attr {
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
}
func (logger *StarLogger) SetWriter(wr io.Writer) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.output = wr
logger.logcore.sink = nil
if !logger.logcore.switching {
logger.logcore.writePendingLocked()
}
}
func (logger *StarLogger) GetWriter() io.Writer {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.output
}
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))
}
func (logger *StarLogger) SetHandler(f func(LogData)) {
if f != nil {
StartStacks()
}
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.handlerFunc = f
}
func (logger *StarLogger) GetHandler() func(LogData) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.handlerFunc
}
func (logger *StarLogger) SetSwitching(sw bool) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.switching = sw
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()
}
func (logger *StarLogger) SetOnlyColorLevel(ocl bool) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.onlyColorLevel = ocl
}
func (logger *StarLogger) GetOnlyColorLevel() bool {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.onlyColorLevel
}
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
}
func (logger *StarLogger) SetShowOriginFile(val bool) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.showDeatilFile = val
}
func (logger *StarLogger) GetShowOriginFile() bool {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.showDeatilFile
}
func (logger *StarLogger) SetShowFuncName(val bool) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.showFuncName = val
}
func (logger *StarLogger) GetShowFuncName() bool {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.showFuncName
}
func (logger *StarLogger) SetShowLevel(val bool) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.showLevel = val
}
func (logger *StarLogger) GetShowLevel() bool {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.showLevel
}
func (logger *StarLogger) SetShowFlag(val bool) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.showThread = val
}
func (logger *StarLogger) GetShowFlag() bool {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.showThread
}
func (logger *StarLogger) SetShowStd(val bool) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.showStd = val
}
func (logger *StarLogger) GetShowStd() bool {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.showStd
}
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
}
func (logger *StarLogger) StopWrite() {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.stopWriter = true
}
func (logger *StarLogger) EnableWrite() {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.stopWriter = false
}
func (logger *StarLogger) IsWriteStopped() bool {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.stopWriter
}
// Deprecated: use EnableWrite.
func (logger *StarLogger) EnbaleWrite() {
logger.EnableWrite()
}
// Deprecated: use IsWriteStopped.
func (logger *StarLogger) IsWriteStoed() bool {
return logger.IsWriteStopped()
}
func (logger *StarLogger) Debug(str ...interface{}) {
logger.emit(LvDebug, logger.GetShowStd(), logger.logcore.print(str...))
}
func (logger *StarLogger) Debugf(format string, str ...interface{}) {
logger.emit(LvDebug, logger.GetShowStd(), logger.logcore.printf(format, str...))
}
func (logger *StarLogger) Debugln(str ...interface{}) {
logger.emit(LvDebug, logger.GetShowStd(), logger.logcore.println(str...))
}
func (logger *StarLogger) Info(str ...interface{}) {
logger.emit(LvInfo, logger.GetShowStd(), logger.logcore.print(str...))
}
func (logger *StarLogger) Infof(format string, str ...interface{}) {
logger.emit(LvInfo, logger.GetShowStd(), logger.logcore.printf(format, str...))
}
func (logger *StarLogger) Infoln(str ...interface{}) {
logger.emit(LvInfo, logger.GetShowStd(), logger.logcore.println(str...))
}
func (logger *StarLogger) Notice(str ...interface{}) {
logger.emit(LvNotice, logger.GetShowStd(), logger.logcore.print(str...))
}
func (logger *StarLogger) Noticef(format string, str ...interface{}) {
logger.emit(LvNotice, logger.GetShowStd(), logger.logcore.printf(format, str...))
}
func (logger *StarLogger) Noticeln(str ...interface{}) {
logger.emit(LvNotice, logger.GetShowStd(), logger.logcore.println(str...))
}
func (logger *StarLogger) Warning(str ...interface{}) {
logger.emit(LvWarning, logger.GetShowStd(), logger.logcore.print(str...))
}
func (logger *StarLogger) Warningf(format string, str ...interface{}) {
logger.emit(LvWarning, logger.GetShowStd(), logger.logcore.printf(format, str...))
}
func (logger *StarLogger) Warningln(str ...interface{}) {
logger.emit(LvWarning, logger.GetShowStd(), logger.logcore.println(str...))
}
func (logger *StarLogger) Error(str ...interface{}) {
logger.emit(LvError, logger.GetShowStd(), logger.logcore.print(str...))
}
func (logger *StarLogger) Errorf(format string, str ...interface{}) {
logger.emit(LvError, logger.GetShowStd(), logger.logcore.printf(format, str...))
}
func (logger *StarLogger) Errorln(str ...interface{}) {
logger.emit(LvError, logger.GetShowStd(), logger.logcore.println(str...))
}
func (logger *StarLogger) Critical(str ...interface{}) {
logger.emit(LvCritical, logger.GetShowStd(), logger.logcore.print(str...))
}
func (logger *StarLogger) Criticalf(format string, str ...interface{}) {
logger.emit(LvCritical, logger.GetShowStd(), logger.logcore.printf(format, str...))
}
func (logger *StarLogger) Criticalln(str ...interface{}) {
logger.emit(LvCritical, logger.GetShowStd(), logger.logcore.println(str...))
}
func (logger *StarLogger) Fatal(str ...interface{}) {
logger.emit(LvFatal, logger.GetShowStd(), logger.logcore.print(str...))
_ = logger.Shutdown(context.Background())
os.Exit(9)
}
func (logger *StarLogger) Fatalf(format string, str ...interface{}) {
logger.emit(LvFatal, logger.GetShowStd(), logger.logcore.printf(format, str...))
_ = logger.Shutdown(context.Background())
os.Exit(9)
}
func (logger *StarLogger) Fatalln(str ...interface{}) {
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)
}
func (logger *StarLogger) Print(str ...interface{}) {
logger.logcore.Print(logger.thread, logger.isStd, logger.GetShowStd(), logger.handlerFunc, str...)
}
func (logger *StarLogger) Printf(format string, str ...interface{}) {
logger.logcore.Printf(logger.thread, logger.isStd, logger.GetShowStd(), logger.handlerFunc, format, str...)
}
func (logger *StarLogger) Println(str ...interface{}) {
logger.logcore.Println(logger.thread, logger.isStd, logger.GetShowStd(), logger.handlerFunc, str...)
}
func (logger *StarLogger) Log(showLog bool, level int, str ...interface{}) {
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...)
}
func (logger *StarLogger) Logf(showLog bool, level int, format string, str ...interface{}) {
logger.emit(level, showLog, logger.logcore.printf(format, str...))
}
func (logger *StarLogger) Logln(showLog bool, level int, str ...interface{}) {
logger.emit(level, showLog, logger.logcore.println(str...))
}
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...)
}
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...)
}