mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 23:16:45 +00:00
* orderbook: export orderbook nodes for external strategy inspection * orderbook: Add in methods for locking and unlocking multiple books at the same time e.g. book1.LockWith(book2); defer book1.UnlockWith(book2) * include waiting functionality for depth change alert * backtester: add word. * log: include logger changes to impl with downstream integration * engine: reduce params for loading exchange * assort: rm verbose in tests, change wording in ob, expose sync.waitgroup for ext. sync options * ticker: reduce map look ups and contention when using RW mutex when there are over 80% writes adds find last function to get the latest rate * engine/syncmanager: add in waitgroup for step over for external package calls * cleaup * engine: linter fix * currency/fx: include all references to fiat currencies to default * orderbook: Add in fields to Unsafe type for strategies to detect potential out of sync book operations * syncmanager: changed config variable to display correct time * ordermanager: Add time when none provided * currency/manager: update getasset param to get enabled assets for minor optimizations * ftx: use get all wallet balances for a better accounts breakdown * orderbook: unlock in reverse order * bithumb: fixes bug on market buy and sell orders * bithumb: fix bug for nonce is also time window sensitive * bithumb: get orders add required parameter * bithumb: Add asset type to account struct * currency: improve log output when checking currency and it fails * bithumb: Add error return on incomplete pair * ticker:unexport all service related methods * ticker/currency: fixes * orderbook: fix comment * engine: revert variable name in LoadExchange method * sync_manager: fix panic when enabling disabling manager * engine: fix naming convention of exported function and comments * engine: update comment * orderbook: fix comment for unsafe type
102 lines
2.4 KiB
Go
102 lines
2.4 KiB
Go
package log
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
errEmptyLoggerName = errors.New("cannot have empty logger name")
|
|
errSubLoggerAlreadyregistered = errors.New("sub logger already registered")
|
|
)
|
|
|
|
// NewSubLogger allows for a new sub logger to be registered.
|
|
func NewSubLogger(name string) (*SubLogger, error) {
|
|
if name == "" {
|
|
return nil, errEmptyLoggerName
|
|
}
|
|
name = strings.ToUpper(name)
|
|
_, ok := subLoggers[name]
|
|
if ok {
|
|
return nil, errSubLoggerAlreadyregistered
|
|
}
|
|
return registerNewSubLogger(name), nil
|
|
}
|
|
|
|
func newLogger(c *Config) *Logger {
|
|
return &Logger{
|
|
Timestamp: c.AdvancedSettings.TimeStampFormat,
|
|
Spacer: c.AdvancedSettings.Spacer,
|
|
ErrorHeader: c.AdvancedSettings.Headers.Error,
|
|
InfoHeader: c.AdvancedSettings.Headers.Info,
|
|
WarnHeader: c.AdvancedSettings.Headers.Warn,
|
|
DebugHeader: c.AdvancedSettings.Headers.Debug,
|
|
ShowLogSystemName: *c.AdvancedSettings.ShowLogSystemName,
|
|
}
|
|
}
|
|
|
|
func (l *Logger) newLogEvent(data, header, slName string, w io.Writer) error {
|
|
if w == nil {
|
|
return errors.New("io.Writer not set")
|
|
}
|
|
|
|
e := eventPool.Get().(*Event)
|
|
e.output = w
|
|
e.data = append(e.data, []byte(header)...)
|
|
if l.ShowLogSystemName {
|
|
e.data = append(e.data, l.Spacer...)
|
|
e.data = append(e.data, slName...)
|
|
}
|
|
e.data = append(e.data, l.Spacer...)
|
|
if l.Timestamp != "" {
|
|
e.data = time.Now().AppendFormat(e.data, l.Timestamp)
|
|
}
|
|
e.data = append(e.data, l.Spacer...)
|
|
e.data = append(e.data, []byte(data)...)
|
|
if data == "" || data[len(data)-1] != '\n' {
|
|
e.data = append(e.data, '\n')
|
|
}
|
|
_, err := e.output.Write(e.data)
|
|
|
|
e.data = e.data[:0]
|
|
eventPool.Put(e)
|
|
|
|
return err
|
|
}
|
|
|
|
// CloseLogger is called on shutdown of application
|
|
func CloseLogger() error {
|
|
return GlobalLogFile.Close()
|
|
}
|
|
|
|
func validSubLogger(s string) (bool, *SubLogger) {
|
|
if v, found := subLoggers[s]; found {
|
|
return true, v
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
// Level retries the current sublogger levels
|
|
func Level(s string) (*Levels, error) {
|
|
found, logger := validSubLogger(s)
|
|
if !found {
|
|
return nil, fmt.Errorf("logger %v not found", s)
|
|
}
|
|
|
|
return &logger.Levels, nil
|
|
}
|
|
|
|
// SetLevel sets sublogger levels
|
|
func SetLevel(s, level string) (*Levels, error) {
|
|
found, logger := validSubLogger(s)
|
|
if !found {
|
|
return nil, fmt.Errorf("logger %v not found", s)
|
|
}
|
|
logger.Levels = splitLevel(level)
|
|
|
|
return &logger.Levels, nil
|
|
}
|