Traefik 로그의 timezone 수정

Page content

문제점

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:

  1. 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
  2. Specify the field StartLocal by dropping the field named StartUTC (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