mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-06-04 23:16:54 +00:00
GCT: general updates across codebase (#699)
* 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
This commit is contained in:
@@ -4,9 +4,28 @@ 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,
|
||||
@@ -53,7 +72,7 @@ func CloseLogger() error {
|
||||
return GlobalLogFile.Close()
|
||||
}
|
||||
|
||||
func validSubLogger(s string) (bool, *subLogger) {
|
||||
func validSubLogger(s string) (bool, *SubLogger) {
|
||||
if v, found := subLoggers[s]; found {
|
||||
return true, v
|
||||
}
|
||||
|
||||
@@ -122,8 +122,8 @@ func splitLevel(level string) (l Levels) {
|
||||
return
|
||||
}
|
||||
|
||||
func registerNewSubLogger(logger string) *subLogger {
|
||||
temp := subLogger{
|
||||
func registerNewSubLogger(logger string) *SubLogger {
|
||||
temp := SubLogger{
|
||||
name: strings.ToUpper(logger),
|
||||
output: os.Stdout,
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package log
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strings"
|
||||
@@ -224,7 +225,7 @@ func TestNewLogEvent(t *testing.T) {
|
||||
func TestInfo(t *testing.T) {
|
||||
w := &bytes.Buffer{}
|
||||
|
||||
tempSL := subLogger{
|
||||
tempSL := SubLogger{
|
||||
"TESTYMCTESTALOT",
|
||||
splitLevel("INFO|WARN|DEBUG|ERROR"),
|
||||
w,
|
||||
@@ -262,3 +263,22 @@ func TestSubLoggerName(t *testing.T) {
|
||||
t.Error("Unexpected SUBLOGGER in output")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewSubLogger(t *testing.T) {
|
||||
_, err := NewSubLogger("")
|
||||
if !errors.Is(err, errEmptyLoggerName) {
|
||||
t.Fatalf("received: %v but expected: %v", err, errEmptyLoggerName)
|
||||
}
|
||||
|
||||
sl, err := NewSubLogger("TESTERINOS")
|
||||
if !errors.Is(err, nil) {
|
||||
t.Fatalf("received: %v but expected: %v", err, nil)
|
||||
}
|
||||
|
||||
Debug(sl, "testerinos")
|
||||
|
||||
_, err = NewSubLogger("TESTERINOS")
|
||||
if !errors.Is(err, errSubLoggerAlreadyregistered) {
|
||||
t.Fatalf("received: %v but expected: %v", err, errSubLoggerAlreadyregistered)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,7 +85,9 @@ type Levels struct {
|
||||
Info, Debug, Warn, Error bool
|
||||
}
|
||||
|
||||
type subLogger struct {
|
||||
// SubLogger defines a sub logger can be used externally for packages wanted to
|
||||
// leverage GCT library logger features.
|
||||
type SubLogger struct {
|
||||
name string
|
||||
Levels
|
||||
output io.Writer
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
)
|
||||
|
||||
// Info takes a pointer subLogger struct and string sends to newLogEvent
|
||||
func Info(sl *subLogger, data string) {
|
||||
func Info(sl *SubLogger, data string) {
|
||||
fields := getFields(sl)
|
||||
if fields == nil {
|
||||
return
|
||||
@@ -19,7 +19,7 @@ func Info(sl *subLogger, data string) {
|
||||
}
|
||||
|
||||
// Infoln takes a pointer subLogger struct and interface sends to newLogEvent
|
||||
func Infoln(sl *subLogger, v ...interface{}) {
|
||||
func Infoln(sl *SubLogger, v ...interface{}) {
|
||||
fields := getFields(sl)
|
||||
if fields == nil {
|
||||
return
|
||||
@@ -32,12 +32,12 @@ func Infoln(sl *subLogger, v ...interface{}) {
|
||||
}
|
||||
|
||||
// Infof takes a pointer subLogger struct, string & interface formats and sends to Info()
|
||||
func Infof(sl *subLogger, data string, v ...interface{}) {
|
||||
func Infof(sl *SubLogger, data string, v ...interface{}) {
|
||||
Info(sl, fmt.Sprintf(data, v...))
|
||||
}
|
||||
|
||||
// Debug takes a pointer subLogger struct and string sends to multiwriter
|
||||
func Debug(sl *subLogger, data string) {
|
||||
func Debug(sl *SubLogger, data string) {
|
||||
fields := getFields(sl)
|
||||
if fields == nil {
|
||||
return
|
||||
@@ -50,7 +50,7 @@ func Debug(sl *subLogger, data string) {
|
||||
}
|
||||
|
||||
// Debugln takes a pointer subLogger struct, string and interface sends to newLogEvent
|
||||
func Debugln(sl *subLogger, v ...interface{}) {
|
||||
func Debugln(sl *SubLogger, v ...interface{}) {
|
||||
fields := getFields(sl)
|
||||
if fields == nil {
|
||||
return
|
||||
@@ -63,12 +63,12 @@ func Debugln(sl *subLogger, v ...interface{}) {
|
||||
}
|
||||
|
||||
// Debugf takes a pointer subLogger struct, string & interface formats and sends to Info()
|
||||
func Debugf(sl *subLogger, data string, v ...interface{}) {
|
||||
func Debugf(sl *SubLogger, data string, v ...interface{}) {
|
||||
Debug(sl, fmt.Sprintf(data, v...))
|
||||
}
|
||||
|
||||
// Warn takes a pointer subLogger struct & string and sends to newLogEvent()
|
||||
func Warn(sl *subLogger, data string) {
|
||||
func Warn(sl *SubLogger, data string) {
|
||||
fields := getFields(sl)
|
||||
if fields == nil {
|
||||
return
|
||||
@@ -81,7 +81,7 @@ func Warn(sl *subLogger, data string) {
|
||||
}
|
||||
|
||||
// Warnln takes a pointer subLogger struct & interface formats and sends to newLogEvent()
|
||||
func Warnln(sl *subLogger, v ...interface{}) {
|
||||
func Warnln(sl *SubLogger, v ...interface{}) {
|
||||
fields := getFields(sl)
|
||||
if fields == nil {
|
||||
return
|
||||
@@ -94,12 +94,12 @@ func Warnln(sl *subLogger, v ...interface{}) {
|
||||
}
|
||||
|
||||
// Warnf takes a pointer subLogger struct, string & interface formats and sends to Warn()
|
||||
func Warnf(sl *subLogger, data string, v ...interface{}) {
|
||||
func Warnf(sl *SubLogger, data string, v ...interface{}) {
|
||||
Warn(sl, fmt.Sprintf(data, v...))
|
||||
}
|
||||
|
||||
// Error takes a pointer subLogger struct & interface formats and sends to newLogEvent()
|
||||
func Error(sl *subLogger, data ...interface{}) {
|
||||
func Error(sl *SubLogger, data ...interface{}) {
|
||||
fields := getFields(sl)
|
||||
if fields == nil {
|
||||
return
|
||||
@@ -112,7 +112,7 @@ func Error(sl *subLogger, data ...interface{}) {
|
||||
}
|
||||
|
||||
// Errorln takes a pointer subLogger struct, string & interface formats and sends to newLogEvent()
|
||||
func Errorln(sl *subLogger, v ...interface{}) {
|
||||
func Errorln(sl *SubLogger, v ...interface{}) {
|
||||
fields := getFields(sl)
|
||||
if fields == nil {
|
||||
return
|
||||
@@ -125,7 +125,7 @@ func Errorln(sl *subLogger, v ...interface{}) {
|
||||
}
|
||||
|
||||
// Errorf takes a pointer subLogger struct, string & interface formats and sends to Debug()
|
||||
func Errorf(sl *subLogger, data string, v ...interface{}) {
|
||||
func Errorf(sl *SubLogger, data string, v ...interface{}) {
|
||||
Error(sl, fmt.Sprintf(data, v...))
|
||||
}
|
||||
|
||||
@@ -147,7 +147,7 @@ func enabled() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func getFields(sl *subLogger) *logFields {
|
||||
func getFields(sl *SubLogger) *logFields {
|
||||
if !enabled() {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -4,33 +4,33 @@ import "io"
|
||||
|
||||
// Global vars related to the logger package
|
||||
var (
|
||||
subLoggers = map[string]*subLogger{}
|
||||
subLoggers = map[string]*SubLogger{}
|
||||
|
||||
Global *subLogger
|
||||
BackTester *subLogger
|
||||
ConnectionMgr *subLogger
|
||||
CommunicationMgr *subLogger
|
||||
APIServerMgr *subLogger
|
||||
ConfigMgr *subLogger
|
||||
DatabaseMgr *subLogger
|
||||
DataHistory *subLogger
|
||||
GCTScriptMgr *subLogger
|
||||
OrderMgr *subLogger
|
||||
PortfolioMgr *subLogger
|
||||
SyncMgr *subLogger
|
||||
TimeMgr *subLogger
|
||||
WebsocketMgr *subLogger
|
||||
EventMgr *subLogger
|
||||
DispatchMgr *subLogger
|
||||
Global *SubLogger
|
||||
BackTester *SubLogger
|
||||
ConnectionMgr *SubLogger
|
||||
CommunicationMgr *SubLogger
|
||||
APIServerMgr *SubLogger
|
||||
ConfigMgr *SubLogger
|
||||
DatabaseMgr *SubLogger
|
||||
DataHistory *SubLogger
|
||||
GCTScriptMgr *SubLogger
|
||||
OrderMgr *SubLogger
|
||||
PortfolioMgr *SubLogger
|
||||
SyncMgr *SubLogger
|
||||
TimeMgr *SubLogger
|
||||
WebsocketMgr *SubLogger
|
||||
EventMgr *SubLogger
|
||||
DispatchMgr *SubLogger
|
||||
|
||||
RequestSys *subLogger
|
||||
ExchangeSys *subLogger
|
||||
GRPCSys *subLogger
|
||||
RESTSys *subLogger
|
||||
RequestSys *SubLogger
|
||||
ExchangeSys *SubLogger
|
||||
GRPCSys *SubLogger
|
||||
RESTSys *SubLogger
|
||||
|
||||
Ticker *subLogger
|
||||
OrderBook *subLogger
|
||||
Trade *subLogger
|
||||
Ticker *SubLogger
|
||||
OrderBook *SubLogger
|
||||
Trade *SubLogger
|
||||
)
|
||||
|
||||
// logFields is used to store data in a non-global and thread-safe manner
|
||||
|
||||
Reference in New Issue
Block a user