mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-04-26 13:34:45 +00:00
Improve logging (#1158)
* switch default log level to info add start message and cleanup server start * refactor code * fix agent debug / trace logging
This commit is contained in:
parent
297732eab8
commit
5ca7ede9e4
6 changed files with 104 additions and 96 deletions
|
@ -37,6 +37,7 @@ import (
|
||||||
"github.com/woodpecker-ci/woodpecker/pipeline/backend"
|
"github.com/woodpecker-ci/woodpecker/pipeline/backend"
|
||||||
"github.com/woodpecker-ci/woodpecker/pipeline/rpc"
|
"github.com/woodpecker-ci/woodpecker/pipeline/rpc"
|
||||||
"github.com/woodpecker-ci/woodpecker/shared/utils"
|
"github.com/woodpecker-ci/woodpecker/shared/utils"
|
||||||
|
"github.com/woodpecker-ci/woodpecker/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
func loop(c *cli.Context) error {
|
func loop(c *cli.Context) error {
|
||||||
|
@ -69,11 +70,7 @@ func loop(c *cli.Context) error {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
zerolog.SetGlobalLevel(zerolog.WarnLevel)
|
zerolog.SetGlobalLevel(zerolog.InfoLevel)
|
||||||
if zerolog.GlobalLevel() <= zerolog.DebugLevel {
|
|
||||||
log.Logger = log.With().Caller().Logger()
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("log-level") {
|
if c.IsSet("log-level") {
|
||||||
logLevelFlag := c.String("log-level")
|
logLevelFlag := c.String("log-level")
|
||||||
lvl, err := zerolog.ParseLevel(logLevelFlag)
|
lvl, err := zerolog.ParseLevel(logLevelFlag)
|
||||||
|
@ -82,6 +79,9 @@ func loop(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
zerolog.SetGlobalLevel(lvl)
|
zerolog.SetGlobalLevel(lvl)
|
||||||
}
|
}
|
||||||
|
if zerolog.GlobalLevel() <= zerolog.DebugLevel {
|
||||||
|
log.Logger = log.With().Caller().Logger()
|
||||||
|
}
|
||||||
|
|
||||||
counter.Polling = c.Int("max-procs")
|
counter.Polling = c.Int("max-procs")
|
||||||
counter.Running = 0
|
counter.Running = 0
|
||||||
|
@ -138,17 +138,17 @@ func loop(c *cli.Context) error {
|
||||||
parallel := c.Int("max-procs")
|
parallel := c.Int("max-procs")
|
||||||
wg.Add(parallel)
|
wg.Add(parallel)
|
||||||
|
|
||||||
|
// new engine
|
||||||
|
engine, err := backend.FindEngine(c.String("backend-engine"))
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msgf("cannot find backend engine '%s'", c.String("backend-engine"))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
for i := 0; i < parallel; i++ {
|
for i := 0; i < parallel; i++ {
|
||||||
go func() {
|
go func() {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
|
||||||
// new engine
|
|
||||||
engine, err := backend.FindEngine(c.String("backend-engine"))
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Err(err).Msgf("cannot find backend engine '%s'", c.String("backend-engine"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// load engine (e.g. init api client)
|
// load engine (e.g. init api client)
|
||||||
err = engine.Load()
|
err = engine.Load()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -174,6 +174,10 @@ func loop(c *cli.Context) error {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Info().Msgf(
|
||||||
|
"Starting Woodpecker agent with version '%s' and backend '%s' running up to %d pipelines in parallel",
|
||||||
|
version.String(), engine.Name(), parallel)
|
||||||
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ import (
|
||||||
"github.com/woodpecker-ci/woodpecker/server/router/middleware"
|
"github.com/woodpecker-ci/woodpecker/server/router/middleware"
|
||||||
"github.com/woodpecker-ci/woodpecker/server/store"
|
"github.com/woodpecker-ci/woodpecker/server/store"
|
||||||
"github.com/woodpecker-ci/woodpecker/server/web"
|
"github.com/woodpecker-ci/woodpecker/server/web"
|
||||||
|
"github.com/woodpecker-ci/woodpecker/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
func run(c *cli.Context) error {
|
func run(c *cli.Context) error {
|
||||||
|
@ -63,7 +64,7 @@ func run(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: format output & options to switch to json aka. option to add channels to send logs to
|
// TODO: format output & options to switch to json aka. option to add channels to send logs to
|
||||||
zerolog.SetGlobalLevel(zerolog.WarnLevel)
|
zerolog.SetGlobalLevel(zerolog.InfoLevel)
|
||||||
if c.IsSet("log-level") {
|
if c.IsSet("log-level") {
|
||||||
logLevelFlag := c.String("log-level")
|
logLevelFlag := c.String("log-level")
|
||||||
lvl, err := zerolog.ParseLevel(logLevelFlag)
|
lvl, err := zerolog.ParseLevel(logLevelFlag)
|
||||||
|
@ -118,37 +119,14 @@ func run(c *cli.Context) error {
|
||||||
|
|
||||||
setupEvilGlobals(c, _store, _remote)
|
setupEvilGlobals(c, _store, _remote)
|
||||||
|
|
||||||
proxyWebUI := c.String("www-proxy")
|
|
||||||
|
|
||||||
var webUIServe func(w http.ResponseWriter, r *http.Request)
|
|
||||||
|
|
||||||
if proxyWebUI == "" {
|
|
||||||
webUIServe = web.New().ServeHTTP
|
|
||||||
} else {
|
|
||||||
origin, _ := url.Parse(proxyWebUI)
|
|
||||||
|
|
||||||
director := func(req *http.Request) {
|
|
||||||
req.Header.Add("X-Forwarded-Host", req.Host)
|
|
||||||
req.Header.Add("X-Origin-Host", origin.Host)
|
|
||||||
req.URL.Scheme = origin.Scheme
|
|
||||||
req.URL.Host = origin.Host
|
|
||||||
}
|
|
||||||
|
|
||||||
proxy := &httputil.ReverseProxy{Director: director}
|
|
||||||
webUIServe = proxy.ServeHTTP
|
|
||||||
}
|
|
||||||
|
|
||||||
// setup the server and start the listener
|
|
||||||
handler := router.Load(
|
|
||||||
webUIServe,
|
|
||||||
middleware.Logger(time.RFC3339, true),
|
|
||||||
middleware.Version,
|
|
||||||
middleware.Config(c),
|
|
||||||
middleware.Store(c, _store),
|
|
||||||
)
|
|
||||||
|
|
||||||
var g errgroup.Group
|
var g errgroup.Group
|
||||||
|
|
||||||
|
setupMetrics(&g, _store)
|
||||||
|
|
||||||
|
g.Go(func() error {
|
||||||
|
return cron.Start(c.Context, _store, _remote)
|
||||||
|
})
|
||||||
|
|
||||||
// start the grpc server
|
// start the grpc server
|
||||||
g.Go(func() error {
|
g.Go(func() error {
|
||||||
lis, err := net.Listen("tcp", c.String("grpc-addr"))
|
lis, err := net.Listen("tcp", c.String("grpc-addr"))
|
||||||
|
@ -184,17 +162,36 @@ func run(c *cli.Context) error {
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
setupMetrics(&g, _store)
|
proxyWebUI := c.String("www-proxy")
|
||||||
|
var webUIServe func(w http.ResponseWriter, r *http.Request)
|
||||||
|
|
||||||
g.Go(func() error {
|
if proxyWebUI == "" {
|
||||||
return cron.Start(c.Context, _store, _remote)
|
webUIServe = web.New().ServeHTTP
|
||||||
})
|
} else {
|
||||||
|
origin, _ := url.Parse(proxyWebUI)
|
||||||
|
|
||||||
|
director := func(req *http.Request) {
|
||||||
|
req.Header.Add("X-Forwarded-Host", req.Host)
|
||||||
|
req.Header.Add("X-Origin-Host", origin.Host)
|
||||||
|
req.URL.Scheme = origin.Scheme
|
||||||
|
req.URL.Host = origin.Host
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy := &httputil.ReverseProxy{Director: director}
|
||||||
|
webUIServe = proxy.ServeHTTP
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup the server and start the listener
|
||||||
|
handler := router.Load(
|
||||||
|
webUIServe,
|
||||||
|
middleware.Logger(time.RFC3339, true),
|
||||||
|
middleware.Version,
|
||||||
|
middleware.Config(c),
|
||||||
|
middleware.Store(c, _store),
|
||||||
|
)
|
||||||
|
|
||||||
// start the server with tls enabled
|
|
||||||
if c.String("server-cert") != "" {
|
if c.String("server-cert") != "" {
|
||||||
g.Go(func() error {
|
// start the server with tls enabled
|
||||||
return http.ListenAndServe(":http", http.HandlerFunc(redirect))
|
|
||||||
})
|
|
||||||
g.Go(func() error {
|
g.Go(func() error {
|
||||||
serve := &http.Server{
|
serve := &http.Server{
|
||||||
Addr: ":https",
|
Addr: ":https",
|
||||||
|
@ -208,48 +205,55 @@ func run(c *cli.Context) error {
|
||||||
c.String("server-key"),
|
c.String("server-key"),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
return g.Wait()
|
|
||||||
}
|
|
||||||
|
|
||||||
// start the server without tls enabled
|
// http to https redirect
|
||||||
if !c.Bool("lets-encrypt") {
|
g.Go(func() error {
|
||||||
return http.ListenAndServe(
|
return http.ListenAndServe(":http", http.HandlerFunc(redirect))
|
||||||
c.String("server-addr"),
|
})
|
||||||
handler,
|
} else if c.Bool("lets-encrypt") {
|
||||||
)
|
// start the server with lets-encrypt
|
||||||
}
|
address, err := url.Parse(c.String("server-host"))
|
||||||
|
if err != nil {
|
||||||
// start the server with lets encrypt enabled
|
return err
|
||||||
// listen on ports 443 and 80
|
|
||||||
address, err := url.Parse(c.String("server-host"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
dir := cacheDir()
|
|
||||||
if err := os.MkdirAll(dir, 0o700); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
manager := &autocert.Manager{
|
|
||||||
Prompt: autocert.AcceptTOS,
|
|
||||||
HostPolicy: autocert.HostWhitelist(address.Host),
|
|
||||||
Cache: autocert.DirCache(dir),
|
|
||||||
}
|
|
||||||
g.Go(func() error {
|
|
||||||
return http.ListenAndServe(":http", manager.HTTPHandler(http.HandlerFunc(redirect)))
|
|
||||||
})
|
|
||||||
g.Go(func() error {
|
|
||||||
serve := &http.Server{
|
|
||||||
Addr: ":https",
|
|
||||||
Handler: handler,
|
|
||||||
TLSConfig: &tls.Config{
|
|
||||||
GetCertificate: manager.GetCertificate,
|
|
||||||
NextProtos: []string{"h2", "http/1.1"},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
return serve.ListenAndServeTLS("", "")
|
|
||||||
})
|
dir := cacheDir()
|
||||||
|
if err := os.MkdirAll(dir, 0o700); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
manager := &autocert.Manager{
|
||||||
|
Prompt: autocert.AcceptTOS,
|
||||||
|
HostPolicy: autocert.HostWhitelist(address.Host),
|
||||||
|
Cache: autocert.DirCache(dir),
|
||||||
|
}
|
||||||
|
g.Go(func() error {
|
||||||
|
serve := &http.Server{
|
||||||
|
Addr: ":https",
|
||||||
|
Handler: handler,
|
||||||
|
TLSConfig: &tls.Config{
|
||||||
|
GetCertificate: manager.GetCertificate,
|
||||||
|
NextProtos: []string{"h2", "http/1.1"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return serve.ListenAndServeTLS("", "")
|
||||||
|
})
|
||||||
|
|
||||||
|
// http to https redirect
|
||||||
|
g.Go(func() error {
|
||||||
|
return http.ListenAndServe(":http", manager.HTTPHandler(http.HandlerFunc(redirect)))
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// start the server without tls
|
||||||
|
g.Go(func() error {
|
||||||
|
return http.ListenAndServe(
|
||||||
|
c.String("server-addr"),
|
||||||
|
handler,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info().Msgf("Starting Woodpecker server with version '%s'", version.String())
|
||||||
|
|
||||||
return g.Wait()
|
return g.Wait()
|
||||||
}
|
}
|
||||||
|
|
|
@ -376,7 +376,7 @@ func setupSignatureKeys(_store store.Store) (crypto.PrivateKey, crypto.PublicKey
|
||||||
log.Fatal().Err(err).Msgf("Failed to generate private key")
|
log.Fatal().Err(err).Msgf("Failed to generate private key")
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
log.Info().Msg("Created private key")
|
log.Debug().Msg("Created private key")
|
||||||
return privKey, privKey.Public()
|
return privKey, privKey.Public()
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
log.Fatal().Err(err).Msgf("Failed to load private key")
|
log.Fatal().Err(err).Msgf("Failed to load private key")
|
||||||
|
|
|
@ -13,8 +13,8 @@ import (
|
||||||
// Requests without errors are logged using log.Info().
|
// Requests without errors are logged using log.Info().
|
||||||
//
|
//
|
||||||
// It receives:
|
// It receives:
|
||||||
// 1. A time package format string (e.g. time.RFC3339).
|
// 1. A time package format string (e.g. time.RFC3339).
|
||||||
// 2. A boolean stating whether to use UTC time zone or local.
|
// 2. A boolean stating whether to use UTC time zone or local.
|
||||||
func Logger(timeFormat string, utc bool) gin.HandlerFunc {
|
func Logger(timeFormat string, utc bool) gin.HandlerFunc {
|
||||||
return func(c *gin.Context) {
|
return func(c *gin.Context) {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
@ -42,7 +42,7 @@ func Logger(timeFormat string, utc bool) gin.HandlerFunc {
|
||||||
// Append error field if this is an erroneous request.
|
// Append error field if this is an erroneous request.
|
||||||
log.Error().Str("error", c.Errors.String()).Fields(entry).Msg("")
|
log.Error().Str("error", c.Errors.String()).Fields(entry).Msg("")
|
||||||
} else {
|
} else {
|
||||||
log.Info().Fields(entry).Msg("")
|
log.Debug().Fields(entry).Msg("")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ func Refresh(c *gin.Context) {
|
||||||
// if we really want to fail the request, do we?
|
// if we really want to fail the request, do we?
|
||||||
log.Error().Msgf("cannot refresh access token for %s. %s", user.Login, err)
|
log.Error().Msgf("cannot refresh access token for %s. %s", user.Login, err)
|
||||||
} else {
|
} else {
|
||||||
log.Info().Msgf("refreshed access token for %s", user.Login)
|
log.Debug().Msgf("refreshed access token for %s", user.Login)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -143,7 +143,7 @@ func runTasks(sess *xorm.Session, tasks []*task) error {
|
||||||
log.Error().Err(err).Msgf("migration task '%s' failed but is not required", task.name)
|
log.Error().Err(err).Msgf("migration task '%s' failed but is not required", task.name)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
log.Info().Msgf("migration task '%s' done", task.name)
|
log.Debug().Msgf("migration task '%s' done", task.name)
|
||||||
} else {
|
} else {
|
||||||
log.Trace().Msgf("skip migration task '%s'", task.name)
|
log.Trace().Msgf("skip migration task '%s'", task.name)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue