|
|
@ -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.
|
|
|
|