Traefik Logs
Overview
Traefik logging tracks network traffic, not the services themselves. Logs can show the following:
- Traefik info
- Startup
- Events
- Certificates
- Shutdowns
- Service connections
Log Storage
You can also set where logs are saved to keep them after restarts.
- Using the
filePath
configuration - Logs should persist even after container dies
Log Format
Log format decides how your logs are written and read.
- Log format can be common (default) or JSON.
- Choose based on how you want to use or read the logs.
- Different formats help with easier log processing or viewing.
Log Level
Log level controls how much detail is recorded in logs.
Panic
Fatal
Error
(default)Warn
Info
Debug
Use debug level only for troubleshooting because it creates large logs. Remember to turn it off when done.
Lab: Configure Logging
This lab shows how to enable Traefik logs and change log levels.
Clone the Repository
Github repo: joseeden/labs-traefik
Clone the project repository from GitHub.
git clone https://github.com/joseeden/labs-traefik.git
cd labs-traefik/05-middleware/06-observability/01-traefik-logs
Project structure:
06-observability
└── 01-traefik-logs
├── docker-compose.log.yml
└── traefik.yml
Create the Usersfile
This step is not required for the entire lab, but it helps ensure secure testing. Basic authentication is enabled, yet storing passwords in plain text within the Docker compose file is unsafe since the file is pushed to Git.
To address this, all labs in the Observability directory use a users_file
to store user credentials securely.
To create hashed passwords, install the tool htpasswd
:
sudo apt install -y apache2-utils
Generate a hash with this command:
htpasswd -nb your-username 'add-password-here'
For example:
htpasswd -nb michaelscarn 'thatswhatshesaid'
Expected output:
michaelscarn:$$apr1$$FAa3Qsw4$$uQ8qtFNTfLLmG6ohrK.qS.
Next, create the users_file
in the same folder as the Docker compose file. Put all hashed credentials here, one user per line:
echo "michaelscarn:$$apr1$$FAa3Qsw4$$uQ8qtFNTfLLmG6ohrK.qS." >> users_file
Add users_file
to your .gitignore
file to keep it out of Git:
echo "users_file" >> .gitignore
Your directory should now contain all these files:
06-observability
└ ── 01-traefik-logs
├── .gitignore
├── docker-compose.log.yml
├── traefik.yml
└── users_file
Review the Files
The traefik.yml
file sets up Traefik with debug logging enabled.
api:
dashboard: true
insecure: true
providers:
docker:
exposedByDefault: false
log: # DEBUG, PANIC, FATAL, ERROR, WARN, and INFO
# level: INFO
level: DEBUG
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
To view logs, we will also deploy a catapp
service using the docker-compose.log
file..
version: "3"
services:
traefik:
image: traefik:v2.3
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.yml:/etc/traefik/traefik.yml
- ./users_file:/users_file:ro # <-- mount your users file here
catapp:
image: mikesir87/cats:1.0
labels:
- "traefik.enable=true"
- "traefik.http.routers.catapp.rule=Host(`catapp.localhost`)"
- "traefik.http.routers.catapp.service=catapp"
- "traefik.http.routers.catapp.entrypoints=web"
- "traefik.http.routers.catapp.middlewares=test-auth,test-compress,test-errorpages"
# Services
- "traefik.http.services.catapp.loadbalancer.server.port=5000"
# Middleware BasicAuth using users_file
- "traefik.http.middlewares.test-auth.basicauth.usersfile=/users_file"
# Compress Middleware
- "traefik.http.middlewares.test-compress.compress=true"
- "traefik.http.middlewares.test-errorpages.errors.status=400-599"
- "traefik.http.middlewares.test-errorpages.errors.service=error"
- "traefik.http.middlewares.test-errorpages.errors.query=/{status}.html"
# Rate Limit Middleware
- "traefik.http.middlewares.test-ratelimit.ratelimit.average=2"
error:
image: guillaumebriday/traefik-custom-error-pages
labels:
- "traefik.enable=true"
- "traefik.http.routers.error.rule=Host(`error.localhost`)"
- "traefik.http.routers.error.service=error"
- "traefik.http.services.error.loadbalancer.server.port=80"
- "traefik.http.routers.error.entrypoints=web"
Deploy and Test
Deploy with this command:
docker stack deploy -c docker-compose.log.yml traefik
Expected output:
Creating network traefik_default
Creating service traefik_traefik
Creating service traefik_catapp
Creating service traefik_error
Check the running service:
docker service ls
Expected output:
ID NAME MODE REPLICAS IMAGE PORTS
rud7wu53wfsz traefik_catapp replicated 1/1 mikesir87/cats:1.0
hmgu7p6f7jye traefik_error replicated 1/1 guillaumebriday/traefik-custom-error-pages:latest
lsz3z7dpekjc traefik_traefik replicated 1/1 traefik:v2.3 *:80->80/tcp, *:443->443/tcp, *:8080->8080/tcp
Once running, view logs with:
docker service logs traefik_traefik
Debug logs give a lot of detail about Traefik setup, connections, and middlewares. This helps with troubleshooting but can quickly use up disk space if left on too long.
level=debug msg="Creating middleware" middlewareName=traefik-internal-recovery entryPointName=traefik middlewareType=Recovery
level=debug msg="Creating middleware" entryPointName=web routerName=error@docker serviceName=error middlewareName=pipelining middlewareType=Pipelining
level=debug msg="Creating load-balancer" entryPointName=web routerName=error@docker serviceName=error
level=debug msg="Creating server 0 http://10.0.1.8:80" entryPointName=web routerName=error@docker serviceName=error serverName=0
level=debug msg="Added outgoing tracing middleware error" routerName=error@docker entryPointName=web middlewareName=tracing middlewareType=TracingForwarder
level=debug msg="Creating middleware" middlewareName=pipelining middlewareType=Pipelining routerName=catapp@docker entryPointName=web serviceName=catapp
level=debug msg="Creating load-balancer" entryPointName=web serviceName=catapp routerName=catapp@docker
level=debug msg="Creating server 0 http://10.0.1.6:5000" routerName=catapp@docker entryPointName=web serviceName=catapp serverName=0
level=debug msg="Added outgoing tracing middleware catapp" middlewareType=TracingForwarder middlewareName=tracing
entryPointName=web routerName=catapp@docker
level=debug msg="Creating middleware" entryPointName=web routerName=catapp@docker middlewareName=test-errorpages@docker middlewareType=customError
level=debug msg="Creating middleware" routerName=catapp@docker serviceName=error middlewareName=pipelining middlewareType=Pipelining entryPointName=web
level=debug msg="Creating load-balancer" entryPointName=web routerName=catapp@docker serviceName=error
level=debug msg="Creating server 0 http://10.0.1.8:80" routerName=catapp@docker serviceName=error serverName=0 entryPointName=web
level=debug msg="Adding tracing to middleware" entryPointName=web routerName=catapp@docker middlewareName=test-errorpages@docker
level=debug msg="Creating middleware" routerName=catapp@docker middlewareName=test-compress@docker middlewareType=Compress entryPointName=web
level=debug msg="Adding tracing to middleware" entryPointName=web routerName=catapp@docker middlewareName=test-compress@docker
level=debug msg="Creating middleware" entryPointName=web routerName=catapp@docker middlewareName=test-auth@docker
middlewareType=BasicAuth
traefik_traefik.1.2qo77nb9y4mr@docker-desktop | time="2022-08-11T01:22:26Z" level=error msg="read /users_file: is a directory" entryPointName=web routerName=catapp@docker
level=debug msg="Creating middleware" entryPointName=web middlewareName=traefik-internal-recovery middlewareType=Recovery
level=debug msg="No default certificate, generating one"
After checking logs, edit the traefik.yml
again to change the log level to info
:
log:
level: INFO
Stop the stack:
docker stack rm traefik
Make sure the rm
command returns the output below.
You might need to wait a few minutes or try running it a few times.
Nothing found in stack: traefik
Then re-deploy:
docker stack deploy -c docker-compose-log.yaml traefik
We need to delete the stack and redeploy because the logging settings are applied only at startup.
Check logs again to see less output but still useful info.
docker service logs traefik_traefik
Output:
level=info msg="Configuration loaded from file: /etc/traefik/traefik.yml"
level=info msg="Traefik version 2.3.7 built on 2021-01-11T18:03:02Z"
level=info msg="\nStats collection is disabled.\nHelp us improve Traefik by turning this feature on :)\nMore details on: https://doc.traefik.io/traefik/contributing/data-collection/\n"
level=info msg="Starting provider aggregator.ProviderAggregator {}"
level=info msg="Starting provider *docker.Provider {\"watch\":true,\"endpoint\":\"unix:///var/run/docker.sock\",\"defaultRule\":\"Host(`{{ normalize .Name }}`)\",\"swarmModeRefreshSeconds\":15000000000}"
level=info msg="Starting provider *traefik.Provider {}"
To test if the application works, access the catapp
application on your browser.
http://catapp.localhost/
Cleanup
Delete the deployed stack:
docker stack rm traefik
You can also delete the users_file
:
rm -f users_file