add logger component

This commit is contained in:
ginuerzh 2023-11-19 19:55:48 +08:00
parent 79c15f2c37
commit c87faa2017
8 changed files with 108 additions and 12 deletions

View File

@ -79,6 +79,11 @@ type LogRotationConfig struct {
Compress bool `yaml:"compress,omitempty" json:"compress,omitempty"`
}
type LoggerConfig struct {
Name string `json:"name"`
Log *LogConfig `yaml:",omitempty" json:"log,omitempty"`
}
type ProfilingConfig struct {
Addr string `json:"addr"`
}
@ -396,6 +401,7 @@ type ServiceConfig struct {
Limiter string `yaml:",omitempty" json:"limiter,omitempty"`
CLimiter string `yaml:"climiter,omitempty" json:"climiter,omitempty"`
RLimiter string `yaml:"rlimiter,omitempty" json:"rlimiter,omitempty"`
Logger string `yaml:",omitempty" json:"logger,omitempty"`
Recorders []*RecorderObject `yaml:",omitempty" json:"recorders,omitempty"`
Handler *HandlerConfig `yaml:",omitempty" json:"handler,omitempty"`
Listener *ListenerConfig `yaml:",omitempty" json:"listener,omitempty"`
@ -468,6 +474,7 @@ type Config struct {
Limiters []*LimiterConfig `yaml:",omitempty" json:"limiters,omitempty"`
CLimiters []*LimiterConfig `yaml:"climiters,omitempty" json:"climiters,omitempty"`
RLimiters []*LimiterConfig `yaml:"rlimiters,omitempty" json:"rlimiters,omitempty"`
Loggers []*LoggerConfig `yaml:",omitempty" json:"loggers,omitempty"`
TLS *TLSConfig `yaml:",omitempty" json:"tls,omitempty"`
Log *LogConfig `yaml:",omitempty" json:"log,omitempty"`
Profiling *ProfilingConfig `yaml:",omitempty" json:"profiling,omitempty"`

View File

@ -0,0 +1,55 @@
package logger
import (
"io"
"os"
"path/filepath"
"github.com/go-gost/core/logger"
"github.com/go-gost/x/config"
xlogger "github.com/go-gost/x/logger"
"gopkg.in/natefinch/lumberjack.v2"
)
func ParseLogger(cfg *config.LoggerConfig) logger.Logger {
if cfg == nil || cfg.Log == nil {
return nil
}
opts := []xlogger.Option{
xlogger.NameOption(cfg.Name),
xlogger.FormatOption(logger.LogFormat(cfg.Log.Format)),
xlogger.LevelOption(logger.LogLevel(cfg.Log.Level)),
}
var out io.Writer = os.Stderr
switch cfg.Log.Output {
case "none", "null":
return xlogger.Nop()
case "stdout":
out = os.Stdout
case "stderr", "":
out = os.Stderr
default:
if cfg.Log.Rotation != nil {
out = &lumberjack.Logger{
Filename: cfg.Log.Output,
MaxSize: cfg.Log.Rotation.MaxSize,
MaxAge: cfg.Log.Rotation.MaxAge,
MaxBackups: cfg.Log.Rotation.MaxBackups,
LocalTime: cfg.Log.Rotation.LocalTime,
Compress: cfg.Log.Rotation.Compress,
}
} else {
os.MkdirAll(filepath.Dir(cfg.Log.Output), 0755)
f, err := os.OpenFile(cfg.Log.Output, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
logger.Default().Warn(err)
} else {
out = f
}
}
}
opts = append(opts, xlogger.OutputOption(out))
return xlogger.NewLogger(opts...)
}

View File

@ -41,7 +41,12 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) {
Type: "auto",
}
}
serviceLogger := logger.Default().WithFields(map[string]any{
log := registry.LoggerRegistry().Get(cfg.Logger)
if log == nil {
log = logger.Default()
}
serviceLogger := log.WithFields(map[string]any{
"kind": "service",
"service": cfg.Name,
"listener": cfg.Listener.Type,

2
go.mod
View File

@ -10,7 +10,7 @@ require (
github.com/go-gost/core v0.0.0-20231119081403-abc73f2ca2b7
github.com/go-gost/gosocks4 v0.0.1
github.com/go-gost/gosocks5 v0.4.0
github.com/go-gost/plugin v0.0.0-20231119081435-96a9cabbf6b6
github.com/go-gost/plugin v0.0.0-20231119084331-d49a1cb23b3b
github.com/go-gost/relay v0.4.1-0.20230916134211-828f314ddfe7
github.com/go-gost/tls-dissector v0.0.2-0.20220408131628-aac992c27451
github.com/go-redis/redis/v8 v8.11.5

2
go.sum
View File

@ -105,6 +105,8 @@ github.com/go-gost/plugin v0.0.0-20231119062132-d959ab54847f h1:V5m5plmwkIt16B25
github.com/go-gost/plugin v0.0.0-20231119062132-d959ab54847f/go.mod h1:qXr2Zm9Ex2ATqnWuNUzVZqySPMnuIihvblYZt4MlZLw=
github.com/go-gost/plugin v0.0.0-20231119081435-96a9cabbf6b6 h1:nkeo0TCEZVz74eZlVBDM6xiqDjS3DGWFRBOJ6kiDudU=
github.com/go-gost/plugin v0.0.0-20231119081435-96a9cabbf6b6/go.mod h1:qXr2Zm9Ex2ATqnWuNUzVZqySPMnuIihvblYZt4MlZLw=
github.com/go-gost/plugin v0.0.0-20231119084331-d49a1cb23b3b h1:ZmnYutflq+KOZK+Px5RDckorDSxTYlkT4aQbjTC8/C4=
github.com/go-gost/plugin v0.0.0-20231119084331-d49a1cb23b3b/go.mod h1:qXr2Zm9Ex2ATqnWuNUzVZqySPMnuIihvblYZt4MlZLw=
github.com/go-gost/relay v0.4.1-0.20230916134211-828f314ddfe7 h1:qAG1OyjvdA5h221CfFSS3J359V3d2E7dJWyP29QoDSI=
github.com/go-gost/relay v0.4.1-0.20230916134211-828f314ddfe7/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8=
github.com/go-gost/tls-dissector v0.0.2-0.20220408131628-aac992c27451 h1:xj8gUZGYO3nb5+6Bjw9+tsFkA9sYynrOvDvvC4uDV2I=

View File

@ -10,28 +10,35 @@ import (
"github.com/sirupsen/logrus"
)
type LoggerOptions struct {
type Options struct {
Name string
Output io.Writer
Format logger.LogFormat
Level logger.LogLevel
}
type LoggerOption func(opts *LoggerOptions)
type Option func(opts *Options)
func OutputLoggerOption(out io.Writer) LoggerOption {
return func(opts *LoggerOptions) {
func NameOption(name string) Option {
return func(opts *Options) {
opts.Name = name
}
}
func OutputOption(out io.Writer) Option {
return func(opts *Options) {
opts.Output = out
}
}
func FormatLoggerOption(format logger.LogFormat) LoggerOption {
return func(opts *LoggerOptions) {
func FormatOption(format logger.LogFormat) Option {
return func(opts *Options) {
opts.Format = format
}
}
func LevelLoggerOption(level logger.LogLevel) LoggerOption {
return func(opts *LoggerOptions) {
func LevelOption(level logger.LogLevel) Option {
return func(opts *Options) {
opts.Level = level
}
}
@ -40,8 +47,8 @@ type logrusLogger struct {
logger *logrus.Entry
}
func NewLogger(opts ...LoggerOption) logger.Logger {
var options LoggerOptions
func NewLogger(opts ...Option) logger.Logger {
var options Options
for _, opt := range opts {
opt(&options)
}

13
registry/logger.go Normal file
View File

@ -0,0 +1,13 @@
package registry
import (
"github.com/go-gost/core/logger"
)
type loggerRegistry struct {
registry[logger.Logger]
}
func (r *loggerRegistry) Register(name string, v logger.Logger) error {
return r.registry.Register(name, v)
}

View File

@ -15,6 +15,7 @@ import (
"github.com/go-gost/core/limiter/conn"
"github.com/go-gost/core/limiter/rate"
"github.com/go-gost/core/limiter/traffic"
"github.com/go-gost/core/logger"
"github.com/go-gost/core/recorder"
reg "github.com/go-gost/core/registry"
"github.com/go-gost/core/resolver"
@ -49,6 +50,8 @@ var (
ingressReg reg.Registry[ingress.Ingress] = new(ingressRegistry)
routerReg reg.Registry[router.Router] = new(routerRegistry)
sdReg reg.Registry[sd.SD] = new(sdRegistry)
loggerReg reg.Registry[logger.Logger] = new(loggerRegistry)
)
type registry[T any] struct {
@ -175,3 +178,7 @@ func RouterRegistry() reg.Registry[router.Router] {
func SDRegistry() reg.Registry[sd.SD] {
return sdReg
}
func LoggerRegistry() reg.Registry[logger.Logger] {
return loggerReg
}