PKG Logger :

- fix issue #109
- fix issue #106
- fix bug with color linux / win
- fix bug with color between std, file and syslog
- fix using default logger instead of setup logger
- fix logrus logger level
- add debug message to test logger (test-httpserver)

PKG httpserver :
- apply logger's changes
- optimize httpserver shutdown process

PKG httpcli :
- add new params for log error / log check

PKG ldap :
- add new params for log error / log check
This commit is contained in:
Nicolas JUHEL
2021-06-07 15:26:48 +02:00
parent 00a825bea5
commit f015ad5283
12 changed files with 212 additions and 129 deletions

View File

@@ -62,7 +62,7 @@ type PoolServer interface {
Del(bindAddress string) PoolServer
Has(bindAddress string) bool
Len() int
SetLogger(log FuncGetLogger)
SetLogger(log liblog.FuncLog)
MapRun(f MapRunPoolServer)
MapUpd(f MapUpdPoolServer)
@@ -191,7 +191,7 @@ func (p pool) Len() int {
return len(p)
}
func (p pool) SetLogger(log FuncGetLogger) {
func (p pool) SetLogger(log liblog.FuncLog) {
p.MapUpd(func(srv Server) Server {
srv.SetLogger(log)
return srv

View File

@@ -48,13 +48,15 @@ import (
const _TimeoutWaitingPortFreeing = 500 * time.Microsecond
type srvRun struct {
log func() liblog.Logger
err *atomic.Value
run *atomic.Value
snm string
srv *http.Server
ctx context.Context
cnl context.CancelFunc
log liblog.FuncLog // return golib logger interface
err *atomic.Value // last err occured
run *atomic.Value // is running
snm string // server name
bnd string // server bind
tls bool // is tls server or tls mandatory
srv *http.Server // golang http server
ctx context.Context // context
cnl context.CancelFunc // cancel func of context
}
type run interface {
@@ -66,7 +68,7 @@ type run interface {
Shutdown()
}
func newRun(log FuncGetLogger) run {
func newRun(log liblog.FuncLog) run {
return &srvRun{
log: log,
err: new(atomic.Value),
@@ -138,7 +140,11 @@ func (s *srvRun) WaitNotify() {
case <-quit:
s.Shutdown()
case <-s.ctx.Done():
s.Shutdown()
if s.IsRunning() {
s.Shutdown()
} else if s.srv != nil {
s.srvShutdown()
}
}
}
@@ -146,6 +152,21 @@ func (s *srvRun) Merge(srv Server) bool {
panic("implement me")
}
func (s *srvRun) getLogger() liblog.Logger {
var _log liblog.Logger
if s.log == nil {
_log = liblog.GetDefault()
} else if l := s.log(); l == nil {
_log = liblog.GetDefault()
} else {
_log = l
}
_log.SetFields(_log.GetFields().Add("server_name", s.snm).Add("server_bind", s.bnd).Add("server_tls", s.tls))
return _log
}
//nolint #gocognit
func (s *srvRun) Listen(cfg *ServerConfig, handler http.Handler) liberr.Error {
ssl, err := cfg.GetTLS()
@@ -160,21 +181,13 @@ func (s *srvRun) Listen(cfg *ServerConfig, handler http.Handler) liberr.Error {
name = bind
}
var _log liblog.Logger
if s.log == nil {
_log = liblog.GetDefault()
} else if l := s.log(); l == nil {
_log = liblog.GetDefault()
} else {
_log = l
}
_log.SetFields(_log.GetFields().Add("http server '%s'", name))
s.snm = name
s.bnd = bind
s.tls = sTls || ssl.LenCertificatePair() > 0
srv := &http.Server{
Addr: cfg.GetListen().Host,
ErrorLog: _log.GetStdLogger(liblog.ErrorLevel, log.LstdFlags|log.Lmicroseconds),
ErrorLog: s.getLogger().GetStdLogger(liblog.ErrorLevel, log.LstdFlags|log.Lmicroseconds),
}
if cfg.ReadTimeout > 0 {
@@ -257,12 +270,14 @@ func (s *srvRun) Listen(cfg *ServerConfig, handler http.Handler) liberr.Error {
}
s.ctx, s.cnl = context.WithCancel(cfg.getContext())
s.snm = name
s.srv = srv
go func(name, host string, tlsMandatory bool) {
var _log = s.getLogger()
ent := _log.Entry(liblog.InfoLevel, "server stopped")
defer func() {
ent.Log()
if s.ctx != nil && s.cnl != nil && s.ctx.Err() == nil {
s.cnl()
}
@@ -274,18 +289,15 @@ func (s *srvRun) Listen(cfg *ServerConfig, handler http.Handler) liberr.Error {
}
var err error
_log.Entry(liblog.InfoLevel, "Server is starting").Log()
if ssl.LenCertificatePair() > 0 {
liblog.InfoLevel.Logf("TLS Server '%s' is starting with bindable: %s", name, host)
s.setRunning(true)
err = s.srv.ListenAndServeTLS("", "")
} else if tlsMandatory {
//nolint #goerr113
err = fmt.Errorf("missing valid server certificates")
} else {
liblog.InfoLevel.Logf("Server '%s' is starting with bindable: %s", name, host)
s.setRunning(true)
err = s.srv.ListenAndServe()
}
@@ -296,7 +308,8 @@ func (s *srvRun) Listen(cfg *ServerConfig, handler http.Handler) liberr.Error {
return
} else if err != nil {
s.setErr(err)
liblog.ErrorLevel.LogErrorCtxf(liblog.NilLevel, "Listen Server '%s'", err, name)
ent.Level = liblog.ErrorLevel
ent.ErrorAdd(true, err)
}
}(name, bind, sTls)
@@ -308,28 +321,31 @@ func (s *srvRun) Restart(cfg *ServerConfig) {
}
func (s *srvRun) Shutdown() {
ctx, cancel := context.WithTimeout(context.Background(), timeoutShutdown)
defer func() {
cancel()
if s.srv != nil {
_ = s.srv.Close()
}
s.setRunning(false)
}()
liblog.InfoLevel.Logf("Shutdown Server '%s'...", s.snm)
s.srvShutdown()
s.setRunning(false)
if s.cnl != nil && s.ctx != nil && s.ctx.Err() == nil {
s.cnl()
}
}
func (s *srvRun) srvShutdown() {
ctx, cancel := context.WithTimeout(context.Background(), timeoutShutdown)
_log := s.getLogger()
defer func() {
cancel()
if s.srv != nil {
err := s.srv.Close()
s.srv = nil
_log.Entry(liblog.ErrorLevel, "closing server").ErrorAdd(true, err).Check(liblog.InfoLevel)
}
}()
if s.srv != nil {
err := s.srv.Shutdown(ctx)
if err != nil && !errors.Is(err, http.ErrServerClosed) {
liblog.ErrorLevel.Logf("Shutdown Server '%s' Error: %v", s.snm, err)
_log.Entry(liblog.ErrorLevel, "Shutdown server").ErrorAdd(true, err).Check(liblog.InfoLevel)
}
}
}

View File

@@ -44,8 +44,6 @@ const (
timeoutShutdown = 10 * time.Second
)
type FuncGetLogger func() liblog.Logger
type server struct {
log *atomic.Value
run *atomic.Value
@@ -53,7 +51,7 @@ type server struct {
}
type Server interface {
SetLogger(log FuncGetLogger)
SetLogger(log liblog.FuncLog)
GetConfig() *ServerConfig
SetConfig(cfg *ServerConfig) bool
@@ -88,14 +86,14 @@ func NewServer(cfg *ServerConfig) Server {
}
}
func (s *server) SetLogger(log FuncGetLogger) {
func (s *server) SetLogger(log liblog.FuncLog) {
s.log.Store(log)
}
func (s *server) GetLogger() FuncGetLogger {
func (s *server) GetLogger() liblog.FuncLog {
if i := s.log.Load(); i == nil {
return nil
} else if f, ok := i.(FuncGetLogger); ok {
} else if f, ok := i.(liblog.FuncLog); ok {
return f
}
@@ -201,6 +199,8 @@ func (s *server) Listen(handler http.Handler) liberr.Error {
e := r.Listen(s.GetConfig(), handler)
s.setRun(r)
runtime.GC()
return e
}