add chain.Chainable interface
This commit is contained in:
@ -53,8 +53,8 @@ func buildService(cfg *config.Config) (services []*service.Service) {
|
|||||||
listener.LoggerOption(listenerLogger),
|
listener.LoggerOption(listenerLogger),
|
||||||
)
|
)
|
||||||
|
|
||||||
if chainable, ok := ln.(listener.Chainable); ok {
|
if chainable, ok := ln.(chain.Chainable); ok {
|
||||||
chainable.Chain(chains[svc.Chain])
|
chainable.WithChain(chains[svc.Chain])
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := ln.Init(metadata.MapMetadata(svc.Listener.Metadata)); err != nil {
|
if err := ln.Init(metadata.MapMetadata(svc.Listener.Metadata)); err != nil {
|
||||||
@ -67,11 +67,14 @@ func buildService(cfg *config.Config) (services []*service.Service) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
h := registry.GetHandler(svc.Handler.Type)(
|
h := registry.GetHandler(svc.Handler.Type)(
|
||||||
handler.ChainOption(chains[svc.Chain]),
|
|
||||||
handler.BypassOption(bypasses[svc.Bypass]),
|
handler.BypassOption(bypasses[svc.Bypass]),
|
||||||
handler.LoggerOption(handlerLogger),
|
handler.LoggerOption(handlerLogger),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if chainable, ok := h.(chain.Chainable); ok {
|
||||||
|
chainable.WithChain(chains[svc.Chain])
|
||||||
|
}
|
||||||
|
|
||||||
if forwarder, ok := h.(handler.Forwarder); ok {
|
if forwarder, ok := h.(handler.Forwarder); ok {
|
||||||
forwarder.Forward(forwarderFromConfig(svc.Forwarder))
|
forwarder.Forward(forwarderFromConfig(svc.Forwarder))
|
||||||
}
|
}
|
||||||
@ -162,6 +165,8 @@ func logFromConfig(cfg *config.LogConfig) logger.Logger {
|
|||||||
|
|
||||||
var out io.Writer = os.Stderr
|
var out io.Writer = os.Stderr
|
||||||
switch cfg.Output {
|
switch cfg.Output {
|
||||||
|
case "none":
|
||||||
|
return logger.Nop()
|
||||||
case "stdout", "":
|
case "stdout", "":
|
||||||
out = os.Stdout
|
out = os.Stdout
|
||||||
case "stderr":
|
case "stderr":
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
log:
|
log:
|
||||||
output: stderr # stderr, stdout, /path/to/file
|
output: stderr # none, stderr, stdout, /path/to/file
|
||||||
level: debug # debug, info, warn, error, fatal
|
level: debug # debug, info, warn, error, fatal
|
||||||
format: json # text, json
|
format: json # text, json
|
||||||
|
|
||||||
|
@ -1,47 +1,40 @@
|
|||||||
services:
|
services:
|
||||||
- name: service-0
|
- name: service-0
|
||||||
url: tcp://:8080/:8081?abc=def&true=true&n=123
|
url: ss://abc:123@:18338/:18338
|
||||||
addr: :8080
|
addr: :18338
|
||||||
chain: chain-0
|
chain: chain-0
|
||||||
listener:
|
listener:
|
||||||
type: tcp
|
type: tcp
|
||||||
metadata:
|
metadata:
|
||||||
abc: def
|
users:
|
||||||
"n": "123"
|
- abc:123
|
||||||
"true": "true"
|
|
||||||
handler:
|
handler:
|
||||||
type: tcp
|
type: tcp
|
||||||
metadata:
|
metadata:
|
||||||
abc: def
|
users:
|
||||||
"n": "123"
|
- abc:123
|
||||||
"true": "true"
|
|
||||||
forwarder:
|
forwarder:
|
||||||
targets:
|
targets:
|
||||||
- :8081
|
- :18338
|
||||||
chains:
|
chains:
|
||||||
- name: chain-0
|
- name: chain-0
|
||||||
hops:
|
hops:
|
||||||
- name: hop-0
|
- name: hop-0
|
||||||
nodes:
|
nodes:
|
||||||
- name: node-0
|
- name: node-0
|
||||||
url: auto://:1081?n=123t
|
url: socks://abc:123@:11080?type=abc&key=value
|
||||||
addr: :1081
|
addr: :11080
|
||||||
dialer:
|
dialer:
|
||||||
type: auto
|
type: tcp
|
||||||
metadata:
|
metadata:
|
||||||
"n": 123t
|
key: value
|
||||||
|
type: abc
|
||||||
|
user:
|
||||||
|
- abc:123
|
||||||
connector:
|
connector:
|
||||||
type: auto
|
type: socks
|
||||||
metadata:
|
metadata:
|
||||||
"n": 123t
|
key: value
|
||||||
- name: hop-1
|
type: abc
|
||||||
nodes:
|
user:
|
||||||
- name: node-0
|
- abc:123
|
||||||
url: auto://:1082
|
|
||||||
addr: :1082
|
|
||||||
dialer:
|
|
||||||
type: auto
|
|
||||||
metadata: {}
|
|
||||||
connector:
|
|
||||||
type: auto
|
|
||||||
metadata: {}
|
|
||||||
|
2
go.mod
2
go.mod
@ -23,6 +23,7 @@ require (
|
|||||||
github.com/xtaci/tcpraw v1.2.25
|
github.com/xtaci/tcpraw v1.2.25
|
||||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
|
||||||
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420
|
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420
|
||||||
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
@ -57,5 +58,4 @@ require (
|
|||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||||
gopkg.in/ini.v1 v1.63.2 // indirect
|
gopkg.in/ini.v1 v1.63.2 // indirect
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
|
||||||
)
|
)
|
||||||
|
8
go.sum
8
go.sum
@ -113,14 +113,6 @@ github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2
|
|||||||
github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc=
|
github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc=
|
||||||
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 h1:A95M6UWcfZgOuJkQ7QLfG0Hs5peWIUSysCDNz4pfe04=
|
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 h1:A95M6UWcfZgOuJkQ7QLfG0Hs5peWIUSysCDNz4pfe04=
|
||||||
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09/go.mod h1:1G6I7HP7VFVxveGkoK8mnprnJqSqJjdcASKsdUn4Pp4=
|
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09/go.mod h1:1G6I7HP7VFVxveGkoK8mnprnJqSqJjdcASKsdUn4Pp4=
|
||||||
github.com/go-gost/relay v0.1.0 h1:UOf2YwAzzaUjY5mdpMuLfSw0vz62iIFYk7oJQkuhlGw=
|
|
||||||
github.com/go-gost/relay v0.1.0/go.mod h1:YFCpddLOFE3NlIkeDWRdEs8gL/GFsqXdtaf8SV5v4YQ=
|
|
||||||
github.com/go-gost/relay v0.1.1-0.20211028021513-03c783f893bc h1:F8wBeQYP8JvzIG/6rwRsC+R+D97lstozbsqwRknd4XU=
|
|
||||||
github.com/go-gost/relay v0.1.1-0.20211028021513-03c783f893bc/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8=
|
|
||||||
github.com/go-gost/relay v0.1.1-0.20211117133957-4b109438dc89 h1:1EtXLpAYeGVcptB0Jt8AeRe+GQnbTjbqeYA3L02pCIY=
|
|
||||||
github.com/go-gost/relay v0.1.1-0.20211117133957-4b109438dc89/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8=
|
|
||||||
github.com/go-gost/relay v0.1.1-0.20211122140942-99db08018413 h1:vF0HQWLlwu2GTZQgS9HJlOWUhnEZy8np/fCbWizI/08=
|
|
||||||
github.com/go-gost/relay v0.1.1-0.20211122140942-99db08018413/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8=
|
|
||||||
github.com/go-gost/relay v0.1.1-0.20211122150329-54ee406ea49d h1:rzGVzkSvxuDZg8PoYmOR+tvcAg9Dr8whgV19kzuO4YA=
|
github.com/go-gost/relay v0.1.1-0.20211122150329-54ee406ea49d h1:rzGVzkSvxuDZg8PoYmOR+tvcAg9Dr8whgV19kzuO4YA=
|
||||||
github.com/go-gost/relay v0.1.1-0.20211122150329-54ee406ea49d/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8=
|
github.com/go-gost/relay v0.1.1-0.20211122150329-54ee406ea49d/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package chain
|
package chain
|
||||||
|
|
||||||
|
type Chainable interface {
|
||||||
|
WithChain(chain *Chain)
|
||||||
|
}
|
||||||
|
|
||||||
type Chain struct {
|
type Chain struct {
|
||||||
groups []*NodeGroup
|
groups []*NodeGroup
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,6 @@ func NewHandler(opts ...handler.Option) handler.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &forwardHandler{
|
return &forwardHandler{
|
||||||
chain: options.Chain,
|
|
||||||
bypass: options.Bypass,
|
bypass: options.Bypass,
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
}
|
}
|
||||||
@ -43,6 +42,11 @@ func (h *forwardHandler) Init(md md.Metadata) (err error) {
|
|||||||
return h.parseMetadata(md)
|
return h.parseMetadata(md)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implements chain.Chainable interface
|
||||||
|
func (h *forwardHandler) WithChain(chain *chain.Chain) {
|
||||||
|
h.chain = chain
|
||||||
|
}
|
||||||
|
|
||||||
// Forward implements handler.Forwarder.
|
// Forward implements handler.Forwarder.
|
||||||
func (h *forwardHandler) Forward(group *chain.NodeGroup) {
|
func (h *forwardHandler) Forward(group *chain.NodeGroup) {
|
||||||
h.group = group
|
h.group = group
|
||||||
|
@ -41,7 +41,6 @@ func NewHandler(opts ...handler.Option) handler.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &httpHandler{
|
return &httpHandler{
|
||||||
chain: options.Chain,
|
|
||||||
bypass: options.Bypass,
|
bypass: options.Bypass,
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
}
|
}
|
||||||
@ -51,6 +50,11 @@ func (h *httpHandler) Init(md md.Metadata) error {
|
|||||||
return h.parseMetadata(md)
|
return h.parseMetadata(md)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implements chain.Chainable interface
|
||||||
|
func (h *httpHandler) WithChain(chain *chain.Chain) {
|
||||||
|
h.chain = chain
|
||||||
|
}
|
||||||
|
|
||||||
func (h *httpHandler) Handle(ctx context.Context, conn net.Conn) {
|
func (h *httpHandler) Handle(ctx context.Context, conn net.Conn) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
|
@ -2,12 +2,10 @@ package handler
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-gost/gost/pkg/bypass"
|
"github.com/go-gost/gost/pkg/bypass"
|
||||||
"github.com/go-gost/gost/pkg/chain"
|
|
||||||
"github.com/go-gost/gost/pkg/logger"
|
"github.com/go-gost/gost/pkg/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Options struct {
|
type Options struct {
|
||||||
Chain *chain.Chain
|
|
||||||
Bypass bypass.Bypass
|
Bypass bypass.Bypass
|
||||||
Logger logger.Logger
|
Logger logger.Logger
|
||||||
}
|
}
|
||||||
@ -20,12 +18,6 @@ func LoggerOption(logger logger.Logger) Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ChainOption(chain *chain.Chain) Option {
|
|
||||||
return func(opts *Options) {
|
|
||||||
opts.Chain = chain
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BypassOption(bypass bypass.Bypass) Option {
|
func BypassOption(bypass bypass.Bypass) Option {
|
||||||
return func(opts *Options) {
|
return func(opts *Options) {
|
||||||
opts.Bypass = bypass
|
opts.Bypass = bypass
|
||||||
|
@ -34,7 +34,6 @@ func NewHandler(opts ...handler.Option) handler.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &relayHandler{
|
return &relayHandler{
|
||||||
chain: options.Chain,
|
|
||||||
bypass: options.Bypass,
|
bypass: options.Bypass,
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
}
|
}
|
||||||
@ -44,6 +43,11 @@ func (h *relayHandler) Init(md md.Metadata) (err error) {
|
|||||||
return h.parseMetadata(md)
|
return h.parseMetadata(md)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implements chain.Chainable interface
|
||||||
|
func (h *relayHandler) WithChain(chain *chain.Chain) {
|
||||||
|
h.chain = chain
|
||||||
|
}
|
||||||
|
|
||||||
// Forward implements handler.Forwarder.
|
// Forward implements handler.Forwarder.
|
||||||
func (h *relayHandler) Forward(group *chain.NodeGroup) {
|
func (h *relayHandler) Forward(group *chain.NodeGroup) {
|
||||||
h.group = group
|
h.group = group
|
||||||
|
@ -33,7 +33,6 @@ func NewHandler(opts ...handler.Option) handler.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &socks4Handler{
|
return &socks4Handler{
|
||||||
chain: options.Chain,
|
|
||||||
bypass: options.Bypass,
|
bypass: options.Bypass,
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
}
|
}
|
||||||
@ -43,6 +42,11 @@ func (h *socks4Handler) Init(md md.Metadata) (err error) {
|
|||||||
return h.parseMetadata(md)
|
return h.parseMetadata(md)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implements chain.Chainable interface
|
||||||
|
func (h *socks4Handler) WithChain(chain *chain.Chain) {
|
||||||
|
h.chain = chain
|
||||||
|
}
|
||||||
|
|
||||||
func (h *socks4Handler) Handle(ctx context.Context, conn net.Conn) {
|
func (h *socks4Handler) Handle(ctx context.Context, conn net.Conn) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@ func NewHandler(opts ...handler.Option) handler.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &socks5Handler{
|
return &socks5Handler{
|
||||||
chain: options.Chain,
|
|
||||||
bypass: options.Bypass,
|
bypass: options.Bypass,
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
}
|
}
|
||||||
@ -56,6 +55,11 @@ func (h *socks5Handler) Init(md md.Metadata) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implements chain.Chainable interface
|
||||||
|
func (h *socks5Handler) WithChain(chain *chain.Chain) {
|
||||||
|
h.chain = chain
|
||||||
|
}
|
||||||
|
|
||||||
func (h *socks5Handler) Handle(ctx context.Context, conn net.Conn) {
|
func (h *socks5Handler) Handle(ctx context.Context, conn net.Conn) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@ func NewHandler(opts ...handler.Option) handler.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &ssHandler{
|
return &ssHandler{
|
||||||
chain: options.Chain,
|
|
||||||
bypass: options.Bypass,
|
bypass: options.Bypass,
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
}
|
}
|
||||||
@ -45,6 +44,11 @@ func (h *ssHandler) Init(md md.Metadata) (err error) {
|
|||||||
return h.parseMetadata(md)
|
return h.parseMetadata(md)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implements chain.Chainable interface
|
||||||
|
func (h *ssHandler) WithChain(chain *chain.Chain) {
|
||||||
|
h.chain = chain
|
||||||
|
}
|
||||||
|
|
||||||
func (h *ssHandler) Handle(ctx context.Context, conn net.Conn) {
|
func (h *ssHandler) Handle(ctx context.Context, conn net.Conn) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
|
@ -34,7 +34,6 @@ func NewHandler(opts ...handler.Option) handler.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &ssuHandler{
|
return &ssuHandler{
|
||||||
chain: options.Chain,
|
|
||||||
bypass: options.Bypass,
|
bypass: options.Bypass,
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
}
|
}
|
||||||
@ -44,6 +43,11 @@ func (h *ssuHandler) Init(md md.Metadata) (err error) {
|
|||||||
return h.parseMetadata(md)
|
return h.parseMetadata(md)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implements chain.Chainable interface
|
||||||
|
func (h *ssuHandler) WithChain(chain *chain.Chain) {
|
||||||
|
h.chain = chain
|
||||||
|
}
|
||||||
|
|
||||||
func (h *ssuHandler) Handle(ctx context.Context, conn net.Conn) {
|
func (h *ssuHandler) Handle(ctx context.Context, conn net.Conn) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"github.com/go-gost/gost/pkg/chain"
|
|
||||||
"github.com/go-gost/gost/pkg/metadata"
|
"github.com/go-gost/gost/pkg/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -22,7 +21,3 @@ type Listener interface {
|
|||||||
type Accepter interface {
|
type Accepter interface {
|
||||||
Accept() (net.Conn, error)
|
Accept() (net.Conn, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Chainable interface {
|
|
||||||
Chain(chain *chain.Chain)
|
|
||||||
}
|
|
||||||
|
@ -38,8 +38,8 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// implements listener.Chainable interface
|
// implements chain.Chainable interface
|
||||||
func (l *rtcpListener) Chain(chain *chain.Chain) {
|
func (l *rtcpListener) WithChain(chain *chain.Chain) {
|
||||||
l.chain = chain
|
l.chain = chain
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,8 +38,8 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// implements listener.Chainable interface
|
// implements chain.Chainable interface
|
||||||
func (l *rudpListener) Chain(chain *chain.Chain) {
|
func (l *rudpListener) WithChain(chain *chain.Chain) {
|
||||||
l.chain = chain
|
l.chain = chain
|
||||||
}
|
}
|
||||||
|
|
||||||
|
53
pkg/logger/nop_logger.go
Normal file
53
pkg/logger/nop_logger.go
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package logger
|
||||||
|
|
||||||
|
var (
|
||||||
|
nop = &nopLogger{}
|
||||||
|
)
|
||||||
|
|
||||||
|
func Nop() Logger {
|
||||||
|
return nop
|
||||||
|
}
|
||||||
|
|
||||||
|
type nopLogger struct{}
|
||||||
|
|
||||||
|
func (l *nopLogger) WithFields(fields map[string]interface{}) Logger {
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Debug(args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Debugf(format string, args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Info(args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Infof(format string, args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Warn(args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Warnf(format string, args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Error(args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Errorf(format string, args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Fatal(args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) Fatalf(format string, args ...interface{}) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) GetLevel() LogLevel {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *nopLogger) IsLevelEnabled(level LogLevel) bool {
|
||||||
|
return false
|
||||||
|
}
|
Reference in New Issue
Block a user