Files
gocryptotrader/logger/logger_setup.go
Ryan O'Hara-Reid 0a84c5d97a Request package update & rate limit system expansion (#413)
* Initial rework of rework of requester - WIP

* Implementing and checking rate limits - WIP

* implemented coinbene rate limiting shenanigans

* add in remaining WIP

* fixy

* use authenticated rate limit

* drop ceiling as this can be done with a counter later

* add functionality to struct

* purge config options for rate limiting so as to keep things minimal

* prepare futures and swap rate limiting for implementation

* Address linter issues

* Addressed nits, fixed race

* fix linter issue

* remove global var as this was only setting when newrequester was called

* moved rate limit functionality into its own file

* Update Bitfinex with correct rate limit and test endpoints (WIP)

* finish off bitfinex adjustments

* fixes

* fix linter issues

* slowed rate for coinbasepro

* drop rate limit for huobi as the doc times have intermittent 429 issues.

* Set MACOSX_DEPLOYMENT_TARGET to remove linking warning

* Addr Thrasher nits

* Addr glorious nits

* unexport do request function

* fixed nitorinos

* Fixed something I missed

* move disabled rate limiter into loadexchange and use interface functionality

* Add temp quick fix
2020-02-06 11:44:28 +11:00

160 lines
3.7 KiB
Go

package logger
import (
"fmt"
"io"
"io/ioutil"
"os"
"strings"
"github.com/thrasher-corp/gocryptotrader/common/convert"
)
func getWriters(s *SubLoggerConfig) io.Writer {
mw := MultiWriter()
m := mw.(*multiWriter)
outputWriters := strings.Split(s.Output, "|")
for x := range outputWriters {
switch outputWriters[x] {
case "stdout", "console":
m.Add(os.Stdout)
case "stderr":
m.Add(os.Stderr)
case "file":
if FileLoggingConfiguredCorrectly {
m.Add(GlobalLogFile)
}
default:
m.Add(ioutil.Discard)
}
}
return m
}
// GenDefaultSettings return struct with known sane/working logger settings
func GenDefaultSettings() (log Config) {
log = Config{
Enabled: convert.BoolPtr(true),
SubLoggerConfig: SubLoggerConfig{
Level: "INFO|DEBUG|WARN|ERROR",
Output: "console",
},
LoggerFileConfig: &loggerFileConfig{
FileName: "log.txt",
Rotate: convert.BoolPtr(false),
MaxSize: 0,
},
AdvancedSettings: advancedSettings{
ShowLogSystemName: convert.BoolPtr(false),
Spacer: spacer,
TimeStampFormat: timestampFormat,
Headers: headers{
Info: "[INFO]",
Warn: "[WARN]",
Debug: "[DEBUG]",
Error: "[ERROR]",
},
},
}
return
}
func configureSubLogger(logger, levels string, output io.Writer) error {
found, logPtr := validSubLogger(logger)
if !found {
return fmt.Errorf("logger %v not found", logger)
}
logPtr.output = output
logPtr.Levels = splitLevel(levels)
subLoggers[logger] = logPtr
return nil
}
// SetupSubLoggers configure all sub loggers with provided configuration values
func SetupSubLoggers(s []SubLoggerConfig) {
for x := range s {
output := getWriters(&s[x])
err := configureSubLogger(strings.ToUpper(s[x].Name), s[x].Level, output)
if err != nil {
continue
}
}
}
// SetupGlobalLogger setup the global loggers with the default global config values
func SetupGlobalLogger() {
if FileLoggingConfiguredCorrectly {
GlobalLogFile = &Rotate{
FileName: GlobalLogConfig.LoggerFileConfig.FileName,
MaxSize: GlobalLogConfig.LoggerFileConfig.MaxSize,
Rotate: GlobalLogConfig.LoggerFileConfig.Rotate,
}
}
for x := range subLoggers {
subLoggers[x].Levels = splitLevel(GlobalLogConfig.Level)
subLoggers[x].output = getWriters(&GlobalLogConfig.SubLoggerConfig)
}
logger = newLogger(GlobalLogConfig)
}
func splitLevel(level string) (l Levels) {
enabledLevels := strings.Split(level, "|")
for x := range enabledLevels {
switch level := enabledLevels[x]; level {
case "DEBUG":
l.Debug = true
case "INFO":
l.Info = true
case "WARN":
l.Warn = true
case "ERROR":
l.Error = true
}
}
return
}
func registerNewSubLogger(logger string) *subLogger {
temp := subLogger{
name: strings.ToUpper(logger),
output: os.Stdout,
}
temp.Levels = splitLevel("INFO|WARN|DEBUG|ERROR")
subLoggers[logger] = &temp
return &temp
}
// register all loggers at package init()
func init() {
Global = registerNewSubLogger("LOG")
ConnectionMgr = registerNewSubLogger("CONNECTION")
CommunicationMgr = registerNewSubLogger("COMMS")
ConfigMgr = registerNewSubLogger("CONFIG")
DatabaseMgr = registerNewSubLogger("DATABASE")
OrderMgr = registerNewSubLogger("ORDER")
PortfolioMgr = registerNewSubLogger("PORTFOLIO")
SyncMgr = registerNewSubLogger("SYNC")
TimeMgr = registerNewSubLogger("TIMEKEEPER")
GCTScriptMgr = registerNewSubLogger("GCTSCRIPT")
WebsocketMgr = registerNewSubLogger("WEBSOCKET")
EventMgr = registerNewSubLogger("EVENT")
DispatchMgr = registerNewSubLogger("DISPATCH")
RequestSys = registerNewSubLogger("REQUESTER")
ExchangeSys = registerNewSubLogger("EXCHANGE")
GRPCSys = registerNewSubLogger("GRPC")
RESTSys = registerNewSubLogger("REST")
Ticker = registerNewSubLogger("TICKER")
OrderBook = registerNewSubLogger("ORDERBOOK")
}