mirror of
https://github.com/nabbar/golib.git
synced 2025-12-24 11:51:02 +08:00
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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user