Traefik 로그의 timezone 수정
문제점
Traefik 로그에 time 정보가 제대로 나오게 하려면
helm chart에 환경 변수에 TZ
를 설정해도 로그 시간이 제대로 나오지 않음.
192.168.0.101 - - [06/Jan/2022:1:18:17 +0000] "GET /ping HTTP/1.1" 200 2 "-" "-" 100 "ping@internal" "-" 0ms
env:
- name: TZ
value: Asia/Seoul
kubectl describe
명령으로 확인하면 환경변수가 제대로 설정된 것으로 나옴
Environment:
TZ: Asia/Seoul
해결책
https://doc.traefik.io/traefik/observability/access-logs/#time-zones 위 페이지를 보니 다음과 같이 몇 가지 설정을 해야 한다고.
Traefik will timestamp each log line in UTC time by default.
It is possible to configure the Traefik to timestamp in a specific timezone by ensuring the following configuration has been made in your environment:
- Provide time zone data to
/etc/localtime
or/usr/share/zoneinfo
(based on your distribution) or set the environment variable TZ to the desired timezone- Specify the field
StartLocal
by dropping the field namedStartUTC
(available on the default Common Log Format (CLF) as well as JSON)
version: "3.7"
services:
traefik:
image: traefik:v2.5
environment:
- TZ=US/Alaska
command:
- --accesslog.fields.names.StartUTC=drop
- --providers.docker
ports:
- 80:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
위 내용을 참고해서 /usr/share/zoneinfo
mount 하기위해 yaml 파일 수정
deployment:
# Additional volumes available for use with initContainers and additionalContainers
additionalVolumes:
- name: zoneinfo
hostPath:
path: /usr/share/zoneinfo
# Additional volumeMounts to add to the Traefik container
additionalVolumeMounts:
# For instance when using a logshipper for access logs
# - name: traefik-logs
# mountPath: /var/log/traefik
- name: zoneinfo
mountPath: /usr/share/zoneinfo
추가로 acccelog에 옵션을 지정해야 하는데 이걸 어떻게 적용해야 하는 지는 traefik helm chart에 있는 _podtemplate.tpl
파일을 보고 values.yaml
파일에 지정한 내용이 어떻게 실행 옵션 accesslog
로전달되는 지 이해
_podtemplate.yaml
이 파일을 보면 아래와 같이 values 파일의 acess.fields.general.fields
항목에 기술된 키, 값을 --accesslog.fields.names
옵션으로 변환하고 있는 걸 알 수 있다.
{{- range $fieldname, $fieldaction := .access.fields.general.names }}
- "--accesslog.fields.names.{{ $fieldname }}={{ $fieldaction }}" {{- end }}
로그의 timezone을 변경할 때 필요한 옵션이 바로 위에 있는 accesslog.fields.names.StartUTC
항목이므로 아래와 같이 values 파일에 내용 추가
logs:
access:
fields:
general:
names:
StartUTC: drop
변경된 value파일을 적용한 후 다시 kubectl logs
명령어로 로그의 시각 정보를 확인하니 이제 정상적으로 +0900
timezone 정보가 반영되어 나오네
192.168.0.101 - - [06/Jan/2022:10:18:17 +0900] "GET /ping HTTP/1.1" 200 2 "-" "-" 44 "ping@internal" "-" 0ms
192.168.0.101 - - [06/Jan/2022:10:18:17 +0900] "GET /ping HTTP/1.1" 200 2 "-" "-" 45 "ping@internal" "-" 0ms
#homelab #traefik #helm #til