fix(logx): need to wait for the first caller to complete the execution. (#2213)

master
chen quan 2 years ago committed by GitHub
parent 3f3c811e08
commit 4fad067a0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -7,6 +7,7 @@ import (
"os" "os"
"path" "path"
"runtime/debug" "runtime/debug"
"sync"
"sync/atomic" "sync/atomic"
"time" "time"
@ -23,7 +24,7 @@ var (
disableStat uint32 disableStat uint32
options logOptions options logOptions
writer = new(atomicWriter) writer = new(atomicWriter)
setupOnce uint32 setupOnce sync.Once
) )
type ( type (
@ -206,35 +207,35 @@ func SetWriter(w Writer) {
// SetUp sets up the logx. If already set up, just return nil. // SetUp sets up the logx. If already set up, just return nil.
// we allow SetUp to be called multiple times, because for example // we allow SetUp to be called multiple times, because for example
// we need to allow different service frameworks to initialize logx respectively. // we need to allow different service frameworks to initialize logx respectively.
func SetUp(c LogConf) error { func SetUp(c LogConf) (err error) {
// Just ignore the subsequent SetUp calls. // Just ignore the subsequent SetUp calls.
// Because multiple services in one process might call SetUp respectively. // Because multiple services in one process might call SetUp respectively.
if !atomic.CompareAndSwapUint32(&setupOnce, 0, 1) { // Need to wait for the first caller to complete the execution.
return nil setupOnce.Do(func() {
} setupLogLevel(c)
setupLogLevel(c) if len(c.TimeFormat) > 0 {
timeFormat = c.TimeFormat
}
if len(c.TimeFormat) > 0 { switch c.Encoding {
timeFormat = c.TimeFormat case plainEncoding:
} atomic.StoreUint32(&encoding, plainEncodingType)
default:
atomic.StoreUint32(&encoding, jsonEncodingType)
}
switch c.Encoding { switch c.Mode {
case plainEncoding: case fileMode:
atomic.StoreUint32(&encoding, plainEncodingType) err = setupWithFiles(c)
default: case volumeMode:
atomic.StoreUint32(&encoding, jsonEncodingType) err = setupWithVolume(c)
} default:
setupWithConsole()
}
})
switch c.Mode { return
case fileMode:
return setupWithFiles(c)
case volumeMode:
return setupWithVolume(c)
default:
setupWithConsole()
return nil
}
} }
// Severe writes v into severe log. // Severe writes v into severe log.

Loading…
Cancel
Save