New logger for the Traefik logs
This commit is contained in:
parent
27c02b5a56
commit
56f7515ecd
297 changed files with 2337 additions and 1934 deletions
|
@ -9,9 +9,10 @@ import (
|
|||
|
||||
dockertypes "github.com/docker/docker/api/types"
|
||||
"github.com/docker/go-connections/nat"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/traefik/traefik/v2/pkg/config/dynamic"
|
||||
"github.com/traefik/traefik/v2/pkg/config/label"
|
||||
"github.com/traefik/traefik/v2/pkg/log"
|
||||
"github.com/traefik/traefik/v2/pkg/logs"
|
||||
"github.com/traefik/traefik/v2/pkg/provider"
|
||||
"github.com/traefik/traefik/v2/pkg/provider/constraints"
|
||||
)
|
||||
|
@ -21,17 +22,17 @@ func (p *Provider) buildConfiguration(ctx context.Context, containersInspected [
|
|||
|
||||
for _, container := range containersInspected {
|
||||
containerName := getServiceName(container) + "-" + container.ID
|
||||
ctxContainer := log.With(ctx, log.Str("container", containerName))
|
||||
|
||||
logger := log.Ctx(ctx).With().Str("container", containerName).Logger()
|
||||
ctxContainer := logger.WithContext(ctx)
|
||||
|
||||
if !p.keepContainer(ctxContainer, container) {
|
||||
continue
|
||||
}
|
||||
|
||||
logger := log.FromContext(ctxContainer)
|
||||
|
||||
confFromLabel, err := label.DecodeConfiguration(container.Labels)
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
logger.Error().Err(err).Send()
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -41,7 +42,7 @@ func (p *Provider) buildConfiguration(ctx context.Context, containersInspected [
|
|||
|
||||
err := p.buildTCPServiceConfiguration(ctxContainer, container, confFromLabel.TCP)
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
logger.Error().Err(err).Send()
|
||||
continue
|
||||
}
|
||||
provider.BuildTCPRouterConfiguration(ctxContainer, confFromLabel.TCP)
|
||||
|
@ -52,7 +53,7 @@ func (p *Provider) buildConfiguration(ctx context.Context, containersInspected [
|
|||
|
||||
err := p.buildUDPServiceConfiguration(ctxContainer, container, confFromLabel.UDP)
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
logger.Error().Err(err).Send()
|
||||
continue
|
||||
}
|
||||
provider.BuildUDPRouterConfiguration(ctxContainer, confFromLabel.UDP)
|
||||
|
@ -67,7 +68,7 @@ func (p *Provider) buildConfiguration(ctx context.Context, containersInspected [
|
|||
|
||||
err = p.buildServiceConfiguration(ctxContainer, container, confFromLabel.HTTP)
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
logger.Error().Err(err).Send()
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -106,7 +107,7 @@ func (p *Provider) buildTCPServiceConfiguration(ctx context.Context, container d
|
|||
}
|
||||
|
||||
for name, service := range configuration.Services {
|
||||
ctx := log.With(ctx, log.Str(log.ServiceName, name))
|
||||
ctx := log.Ctx(ctx).With().Str(logs.ServiceName, name).Logger().WithContext(ctx)
|
||||
if err := p.addServerTCP(ctx, container, service.LoadBalancer); err != nil {
|
||||
return fmt.Errorf("service %q error: %w", name, err)
|
||||
}
|
||||
|
@ -130,7 +131,7 @@ func (p *Provider) buildUDPServiceConfiguration(ctx context.Context, container d
|
|||
}
|
||||
|
||||
for name, service := range configuration.Services {
|
||||
ctx := log.With(ctx, log.Str(log.ServiceName, name))
|
||||
ctx := log.Ctx(ctx).With().Str(logs.ServiceName, name).Logger().WithContext(ctx)
|
||||
if err := p.addServerUDP(ctx, container, service.LoadBalancer); err != nil {
|
||||
return fmt.Errorf("service %q error: %w", name, err)
|
||||
}
|
||||
|
@ -156,7 +157,7 @@ func (p *Provider) buildServiceConfiguration(ctx context.Context, container dock
|
|||
}
|
||||
|
||||
for name, service := range configuration.Services {
|
||||
ctx := log.With(ctx, log.Str(log.ServiceName, name))
|
||||
ctx := log.Ctx(ctx).With().Str(logs.ServiceName, name).Logger().WithContext(ctx)
|
||||
if err := p.addServer(ctx, container, service.LoadBalancer); err != nil {
|
||||
return fmt.Errorf("service %q error: %w", name, err)
|
||||
}
|
||||
|
@ -166,25 +167,25 @@ func (p *Provider) buildServiceConfiguration(ctx context.Context, container dock
|
|||
}
|
||||
|
||||
func (p *Provider) keepContainer(ctx context.Context, container dockerData) bool {
|
||||
logger := log.FromContext(ctx)
|
||||
logger := log.Ctx(ctx)
|
||||
|
||||
if !container.ExtraConf.Enable {
|
||||
logger.Debug("Filtering disabled container")
|
||||
logger.Debug().Msg("Filtering disabled container")
|
||||
return false
|
||||
}
|
||||
|
||||
matches, err := constraints.MatchLabels(container.Labels, p.Constraints)
|
||||
if err != nil {
|
||||
logger.Errorf("Error matching constraints expression: %v", err)
|
||||
logger.Error().Err(err).Msg("Error matching constraints expression")
|
||||
return false
|
||||
}
|
||||
if !matches {
|
||||
logger.Debugf("Container pruned by constraint expression: %q", p.Constraints)
|
||||
logger.Debug().Msgf("Container pruned by constraint expression: %q", p.Constraints)
|
||||
return false
|
||||
}
|
||||
|
||||
if !p.AllowEmptyServices && container.Health != "" && container.Health != dockertypes.Healthy {
|
||||
logger.Debug("Filtering unhealthy or starting container")
|
||||
logger.Debug().Msg("Filtering unhealthy or starting container")
|
||||
return false
|
||||
}
|
||||
|
||||
|
@ -274,7 +275,7 @@ func (p *Provider) addServer(ctx context.Context, container dockerData, loadBala
|
|||
}
|
||||
|
||||
func (p *Provider) getIPPort(ctx context.Context, container dockerData, serverPort string) (string, string, error) {
|
||||
logger := log.FromContext(ctx)
|
||||
logger := log.Ctx(ctx)
|
||||
|
||||
var ip, port string
|
||||
usedBound := false
|
||||
|
@ -283,9 +284,9 @@ func (p *Provider) getIPPort(ctx context.Context, container dockerData, serverPo
|
|||
portBinding, err := p.getPortBinding(container, serverPort)
|
||||
switch {
|
||||
case err != nil:
|
||||
logger.Infof("Unable to find a binding for container %q, falling back on its internal IP/Port.", container.Name)
|
||||
logger.Info().Msgf("Unable to find a binding for container %q, falling back on its internal IP/Port.", container.Name)
|
||||
case portBinding.HostIP == "0.0.0.0" || len(portBinding.HostIP) == 0:
|
||||
logger.Infof("Cannot determine the IP address (got %q) for %q's binding, falling back on its internal IP/Port.", portBinding.HostIP, container.Name)
|
||||
logger.Info().Msgf("Cannot determine the IP address (got %q) for %q's binding, falling back on its internal IP/Port.", portBinding.HostIP, container.Name)
|
||||
default:
|
||||
ip = portBinding.HostIP
|
||||
port = portBinding.HostPort
|
||||
|
@ -306,7 +307,7 @@ func (p *Provider) getIPPort(ctx context.Context, container dockerData, serverPo
|
|||
}
|
||||
|
||||
func (p Provider) getIPAddress(ctx context.Context, container dockerData) string {
|
||||
logger := log.FromContext(ctx)
|
||||
logger := log.Ctx(ctx)
|
||||
|
||||
if container.ExtraConf.Docker.Network != "" {
|
||||
settings := container.NetworkSettings
|
||||
|
@ -316,7 +317,7 @@ func (p Provider) getIPAddress(ctx context.Context, container dockerData) string
|
|||
return network.Addr
|
||||
}
|
||||
|
||||
logger.Warnf("Could not find network named '%s' for container '%s'! Maybe you're missing the project's prefix in the label? Defaulting to first available network.", container.ExtraConf.Docker.Network, container.Name)
|
||||
logger.Warn().Msgf("Could not find network named '%s' for container '%s'! Maybe you're missing the project's prefix in the label? Defaulting to first available network.", container.ExtraConf.Docker.Network, container.Name)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -336,14 +337,14 @@ func (p Provider) getIPAddress(ctx context.Context, container dockerData) string
|
|||
if container.NetworkSettings.NetworkMode.IsContainer() {
|
||||
dockerClient, err := p.createClient()
|
||||
if err != nil {
|
||||
logger.Warnf("Unable to get IP address: %s", err)
|
||||
logger.Warn().Err(err).Msg("Unable to get IP address")
|
||||
return ""
|
||||
}
|
||||
|
||||
connectedContainer := container.NetworkSettings.NetworkMode.ConnectedContainer()
|
||||
containerInspected, err := dockerClient.ContainerInspect(context.Background(), connectedContainer)
|
||||
if err != nil {
|
||||
logger.Warnf("Unable to get IP address for container %s : Failed to inspect container ID %s, error: %s", container.Name, connectedContainer, err)
|
||||
logger.Warn().Err(err).Msgf("Unable to get IP address for container %s: failed to inspect container ID %s", container.Name, connectedContainer)
|
||||
return ""
|
||||
}
|
||||
|
||||
|
@ -352,7 +353,7 @@ func (p Provider) getIPAddress(ctx context.Context, container dockerData) string
|
|||
containerParsed := parseContainer(containerInspected)
|
||||
extraConf, err := p.getConfiguration(containerParsed)
|
||||
if err != nil {
|
||||
logger.Warnf("Unable to get IP address for container %s : failed to get extra configuration for container %s: %s", container.Name, containerInspected.Name, err)
|
||||
logger.Warn().Err(err).Msgf("Unable to get IP address for container %s : failed to get extra configuration for container %s", container.Name, containerInspected.Name)
|
||||
return ""
|
||||
}
|
||||
|
||||
|
@ -368,7 +369,7 @@ func (p Provider) getIPAddress(ctx context.Context, container dockerData) string
|
|||
return network.Addr
|
||||
}
|
||||
|
||||
logger.Warn("Unable to find the IP address.")
|
||||
logger.Warn().Msg("Unable to find the IP address.")
|
||||
return ""
|
||||
}
|
||||
|
||||
|
|
|
@ -23,10 +23,11 @@ import (
|
|||
"github.com/docker/docker/client"
|
||||
"github.com/docker/go-connections/nat"
|
||||
"github.com/docker/go-connections/sockets"
|
||||
"github.com/rs/zerolog/log"
|
||||
ptypes "github.com/traefik/paerser/types"
|
||||
"github.com/traefik/traefik/v2/pkg/config/dynamic"
|
||||
"github.com/traefik/traefik/v2/pkg/job"
|
||||
"github.com/traefik/traefik/v2/pkg/log"
|
||||
"github.com/traefik/traefik/v2/pkg/logs"
|
||||
"github.com/traefik/traefik/v2/pkg/provider"
|
||||
"github.com/traefik/traefik/v2/pkg/safe"
|
||||
"github.com/traefik/traefik/v2/pkg/types"
|
||||
|
@ -162,7 +163,7 @@ func (p *Provider) getClientOpts() ([]client.Opt, error) {
|
|||
}
|
||||
|
||||
if p.TLS != nil {
|
||||
ctx := log.With(context.Background(), log.Str(log.ProviderName, "docker"))
|
||||
ctx := log.With().Str(logs.ProviderName, "docker").Logger().WithContext(context.Background())
|
||||
|
||||
conf, err := p.TLS.CreateTLSConfig(ctx)
|
||||
if err != nil {
|
||||
|
@ -191,40 +192,41 @@ func (p *Provider) getClientOpts() ([]client.Opt, error) {
|
|||
// Provide allows the docker provider to provide configurations to traefik using the given configuration channel.
|
||||
func (p *Provider) Provide(configurationChan chan<- dynamic.Message, pool *safe.Pool) error {
|
||||
pool.GoCtx(func(routineCtx context.Context) {
|
||||
ctxLog := log.With(routineCtx, log.Str(log.ProviderName, "docker"))
|
||||
logger := log.FromContext(ctxLog)
|
||||
logger := log.Ctx(routineCtx).With().Str(logs.ProviderName, "docker").Logger()
|
||||
ctxLog := logger.WithContext(routineCtx)
|
||||
|
||||
operation := func() error {
|
||||
var err error
|
||||
ctx, cancel := context.WithCancel(ctxLog)
|
||||
defer cancel()
|
||||
|
||||
ctx = log.With(ctx, log.Str(log.ProviderName, "docker"))
|
||||
ctx = log.Ctx(ctx).With().Str(logs.ProviderName, "docker").Logger().WithContext(ctx)
|
||||
|
||||
dockerClient, err := p.createClient()
|
||||
if err != nil {
|
||||
logger.Errorf("Failed to create a client for docker, error: %s", err)
|
||||
logger.Error().Err(err).Msg("Failed to create a client for docker, error")
|
||||
return err
|
||||
}
|
||||
defer dockerClient.Close()
|
||||
|
||||
serverVersion, err := dockerClient.ServerVersion(ctx)
|
||||
if err != nil {
|
||||
logger.Errorf("Failed to retrieve information of the docker client and server host: %s", err)
|
||||
logger.Error().Err(err).Msg("Failed to retrieve information of the docker client and server host")
|
||||
return err
|
||||
}
|
||||
logger.Debugf("Provider connection established with docker %s (API %s)", serverVersion.Version, serverVersion.APIVersion)
|
||||
|
||||
logger.Debug().Msgf("Provider connection established with docker %s (API %s)", serverVersion.Version, serverVersion.APIVersion)
|
||||
|
||||
var dockerDataList []dockerData
|
||||
if p.SwarmMode {
|
||||
dockerDataList, err = p.listServices(ctx, dockerClient)
|
||||
if err != nil {
|
||||
logger.Errorf("Failed to list services for docker swarm mode, error %s", err)
|
||||
logger.Error().Err(err).Msg("Failed to list services for docker swarm mode")
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
dockerDataList, err = p.listContainers(ctx, dockerClient)
|
||||
if err != nil {
|
||||
logger.Errorf("Failed to list containers for docker, error %s", err)
|
||||
logger.Error().Err(err).Msg("Failed to list containers for docker")
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -242,8 +244,8 @@ func (p *Provider) Provide(configurationChan chan<- dynamic.Message, pool *safe.
|
|||
ticker := time.NewTicker(time.Duration(p.SwarmModeRefreshSeconds))
|
||||
|
||||
pool.GoCtx(func(ctx context.Context) {
|
||||
ctx = log.With(ctx, log.Str(log.ProviderName, "docker"))
|
||||
logger := log.FromContext(ctx)
|
||||
logger := log.Ctx(ctx).With().Str(logs.ProviderName, "docker").Logger()
|
||||
ctx = logger.WithContext(ctx)
|
||||
|
||||
defer close(errChan)
|
||||
for {
|
||||
|
@ -251,7 +253,7 @@ func (p *Provider) Provide(configurationChan chan<- dynamic.Message, pool *safe.
|
|||
case <-ticker.C:
|
||||
services, err := p.listServices(ctx, dockerClient)
|
||||
if err != nil {
|
||||
logger.Errorf("Failed to list services for docker swarm mode, error %s", err)
|
||||
logger.Error().Err(err).Msg("Failed to list services for docker swarm mode")
|
||||
errChan <- err
|
||||
return
|
||||
}
|
||||
|
@ -282,10 +284,10 @@ func (p *Provider) Provide(configurationChan chan<- dynamic.Message, pool *safe.
|
|||
}
|
||||
|
||||
startStopHandle := func(m eventtypes.Message) {
|
||||
logger.Debugf("Provider event received %+v", m)
|
||||
logger.Debug().Msgf("Provider event received %+v", m)
|
||||
containers, err := p.listContainers(ctx, dockerClient)
|
||||
if err != nil {
|
||||
logger.Errorf("Failed to list containers for docker, error %s", err)
|
||||
logger.Error().Err(err).Msg("Failed to list containers for docker")
|
||||
// Call cancel to get out of the monitor
|
||||
return
|
||||
}
|
||||
|
@ -314,7 +316,7 @@ func (p *Provider) Provide(configurationChan chan<- dynamic.Message, pool *safe.
|
|||
}
|
||||
case err := <-errc:
|
||||
if errors.Is(err, io.EOF) {
|
||||
logger.Debug("Provider event stream closed")
|
||||
logger.Debug().Msg("Provider event stream closed")
|
||||
}
|
||||
return err
|
||||
case <-ctx.Done():
|
||||
|
@ -327,11 +329,11 @@ func (p *Provider) Provide(configurationChan chan<- dynamic.Message, pool *safe.
|
|||
}
|
||||
|
||||
notify := func(err error, time time.Duration) {
|
||||
logger.Errorf("Provider connection error %+v, retrying in %s", err, time)
|
||||
logger.Error().Err(err).Msgf("Provider connection error, retrying in %s", time)
|
||||
}
|
||||
err := backoff.RetryNotify(safe.OperationWithRecover(operation), backoff.WithContext(job.NewBackOff(backoff.NewExponentialBackOff()), ctxLog), notify)
|
||||
if err != nil {
|
||||
logger.Errorf("Cannot connect to docker server %+v", err)
|
||||
logger.Error().Err(err).Msg("Cannot connect to docker server")
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -354,7 +356,7 @@ func (p *Provider) listContainers(ctx context.Context, dockerClient client.Conta
|
|||
|
||||
extraConf, err := p.getConfiguration(dData)
|
||||
if err != nil {
|
||||
log.FromContext(ctx).Errorf("Skip container %s: %v", getServiceName(dData), err)
|
||||
log.Ctx(ctx).Error().Err(err).Msgf("Skip container %s", getServiceName(dData))
|
||||
continue
|
||||
}
|
||||
dData.ExtraConf = extraConf
|
||||
|
@ -367,7 +369,7 @@ func (p *Provider) listContainers(ctx context.Context, dockerClient client.Conta
|
|||
func inspectContainers(ctx context.Context, dockerClient client.ContainerAPIClient, containerID string) dockerData {
|
||||
containerInspected, err := dockerClient.ContainerInspect(ctx, containerID)
|
||||
if err != nil {
|
||||
log.FromContext(ctx).Warnf("Failed to inspect container %s, error: %s", containerID, err)
|
||||
log.Ctx(ctx).Warn().Err(err).Msgf("Failed to inspect container %s", containerID)
|
||||
return dockerData{}
|
||||
}
|
||||
|
||||
|
@ -428,7 +430,7 @@ func parseContainer(container dockertypes.ContainerJSON) dockerData {
|
|||
}
|
||||
|
||||
func (p *Provider) listServices(ctx context.Context, dockerClient client.APIClient) ([]dockerData, error) {
|
||||
logger := log.FromContext(ctx)
|
||||
logger := log.Ctx(ctx)
|
||||
|
||||
serviceList, err := dockerClient.ServiceList(ctx, dockertypes.ServiceListOptions{})
|
||||
if err != nil {
|
||||
|
@ -450,7 +452,7 @@ func (p *Provider) listServices(ctx context.Context, dockerClient client.APIClie
|
|||
|
||||
networkList, err := dockerClient.NetworkList(ctx, dockertypes.NetworkListOptions{Filters: networkListArgs})
|
||||
if err != nil {
|
||||
logger.Debugf("Failed to network inspect on client for docker, error: %s", err)
|
||||
logger.Debug().Err(err).Msg("Failed to network inspect on client for docker")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@ -466,7 +468,7 @@ func (p *Provider) listServices(ctx context.Context, dockerClient client.APIClie
|
|||
for _, service := range serviceList {
|
||||
dData, err := p.parseService(ctx, service, networkMap)
|
||||
if err != nil {
|
||||
logger.Errorf("Skip container %s: %v", getServiceName(dData), err)
|
||||
logger.Error().Err(err).Msgf("Skip container %s", getServiceName(dData))
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -478,7 +480,7 @@ func (p *Provider) listServices(ctx context.Context, dockerClient client.APIClie
|
|||
isGlobalSvc := service.Spec.Mode.Global != nil
|
||||
dockerDataListTasks, err = listTasks(ctx, dockerClient, service.ID, dData, networkMap, isGlobalSvc)
|
||||
if err != nil {
|
||||
logger.Warn(err)
|
||||
logger.Warn().Err(err).Send()
|
||||
} else {
|
||||
dockerDataList = append(dockerDataList, dockerDataListTasks...)
|
||||
}
|
||||
|
@ -488,7 +490,7 @@ func (p *Provider) listServices(ctx context.Context, dockerClient client.APIClie
|
|||
}
|
||||
|
||||
func (p *Provider) parseService(ctx context.Context, service swarmtypes.Service, networkMap map[string]*dockertypes.NetworkResource) (dockerData, error) {
|
||||
logger := log.FromContext(ctx)
|
||||
logger := log.Ctx(ctx)
|
||||
|
||||
dData := dockerData{
|
||||
ID: service.ID,
|
||||
|
@ -507,7 +509,7 @@ func (p *Provider) parseService(ctx context.Context, service swarmtypes.Service,
|
|||
if service.Spec.EndpointSpec != nil {
|
||||
if service.Spec.EndpointSpec.Mode == swarmtypes.ResolutionModeDNSRR {
|
||||
if dData.ExtraConf.Docker.LBSwarm {
|
||||
logger.Warnf("Ignored %s endpoint-mode not supported, service name: %s. Fallback to Traefik load balancing", swarmtypes.ResolutionModeDNSRR, service.Spec.Annotations.Name)
|
||||
logger.Warn().Msgf("Ignored %s endpoint-mode not supported, service name: %s. Fallback to Traefik load balancing", swarmtypes.ResolutionModeDNSRR, service.Spec.Annotations.Name)
|
||||
}
|
||||
} else if service.Spec.EndpointSpec.Mode == swarmtypes.ResolutionModeVIP {
|
||||
dData.NetworkSettings.Networks = make(map[string]*networkData)
|
||||
|
@ -523,10 +525,10 @@ func (p *Provider) parseService(ctx context.Context, service swarmtypes.Service,
|
|||
}
|
||||
dData.NetworkSettings.Networks[network.Name] = network
|
||||
} else {
|
||||
logger.Debugf("No virtual IPs found in network %s", virtualIP.NetworkID)
|
||||
logger.Debug().Msgf("No virtual IPs found in network %s", virtualIP.NetworkID)
|
||||
}
|
||||
} else {
|
||||
logger.Debugf("Network not found, id: %s", virtualIP.NetworkID)
|
||||
logger.Debug().Msgf("Network not found, id: %s", virtualIP.NetworkID)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -591,7 +593,7 @@ func parseTasks(ctx context.Context, task swarmtypes.Task, serviceDockerData doc
|
|||
dData.NetworkSettings.Networks[network.Name] = network
|
||||
}
|
||||
} else {
|
||||
log.FromContext(ctx).Debugf("No IP addresses found for network %s", virtualIP.Network.ID)
|
||||
log.Ctx(ctx).Debug().Msgf("No IP addresses found for network %s", virtualIP.Network.ID)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue