Skip to content

Traefik 日志文档

日志与访问日志

日志

日志涉及 Traefik 本身发生的一切(启动、配置、事件、关闭等)。

配置示例

YAML

yaml
log:
  filePath: "/path/to/log-file.log"
  format: json
  level: INFO

TOML

toml
[log]
  filePath = "/path/to/log-file.log"
  format = "json"
  level = "INFO"

CLI

bash
--log.filePath=/path/to/log-file.log
--log.format=json
--log.level=INFO

配置选项

字段描述默认值必填
log.filePath日志文件路径。默认写入标准输出。-
log.format日志格式(common 或 json)。common 格式的字段不可自定义。"common"
log.level日志级别(TRACE、DEBUG、INFO、WARN、ERROR、FATAL、PANIC)。ERROR
log.noColor使用 common 格式时,禁用彩色输出。false
log.maxSize日志轮转前最大大小(MB)。100MB
log.maxAge保留旧日志文件的最大天数。0
log.maxBackups保留旧日志文件的最大数量。0
log.compress轮转后 gzip 压缩日志文件。false

OpenTelemetry

Traefik 支持 OpenTelemetry 日志记录。要启用 OpenTelemetry,需要在静态配置中设置:

yaml
experimental:
  otlpLogs: true
toml
[experimental]
  otlpLogs = true
bash
--experimental.otlpLogs=true

警告

这是一个实验性功能。

Stdio 日志仍然可用

启用 OTLP 日志记录后,标准输出(stdio)日志仍然可用,并将与 OTLP 导出一起继续写入。

配置示例

yaml
experimental:
  otlpLogs: true

log:
  otlp:
    http:
      endpoint: https://collector:4318/v1/logs
      headers:
        Authorization: Bearer auth_asKXRhIMplM7El1JENjrotGouS1LYRdL

配置选项

字段描述默认值必填
log.otlp.serviceName所选后端中使用的 service 名称。"traefik"
log.otlp.resourceAttributes发送到 collector 的其它 resource 属性。[]
log.otlp.http指示导出器使用 HTTP 发送日志。
log.otlp.http.endpointOpenTelemetry Collector 端点(格式 <scheme>://<host>:<port><path>)。https://localhost:4318/v1/logs
log.otlp.http.headers其它请求头。[]
log.otlp.http.tls客户端 TLS 配置。
log.otlp.grpc指示导出器使用 gRPC 发送日志。
log.otlp.grpc.endpointgRPC 端点(格式 <host>:<port>)。localhost:4317
log.otlp.grpc.headers其它请求头。[]
log.otlp.grpc.insecure指示使用不安全协议。false
log.otlp.grpc.tls客户端 TLS 配置。

resourceAttributes

resourceAttributes 选项允许设置与 traces 一起发送的 resource 属性。Traefik 也支持 OTEL_RESOURCE_ATTRIBUTES 环境变量来设置 resource 属性。

Kubernetes Resource Attributes Detection

此外,在 Kubernetes 集群中运行时,Traefik 会自动发现以下 Kubernetes resource attributes

  • k8s.namespace.name
  • k8s.pod.uid
  • k8s.pod.name

请注意,这种自动检测可能会失败,例如当 Traefik pod 以 host network 模式运行时。在这种情况下,你应使用该选项或环境变量提供属性。

访问日志

访问日志涉及 Traefik 处理的请求所发生的一切。

Stdio 日志在 OTLP 导出旁边默认未启用

如果你希望 Stdio 访问日志可用,请使用 accessLog.dualOutput 选项。

配置示例

yaml
accessLog:
  # JSON 格式
  format: json
  # 过滤状态码、重试次数和最小时长
  filters:
    statusCodes:
      - "200"
      - "300-302"
    retryAttempts: true
    minDuration: "10ms"
  fields:
    # 默认保留所有字段
    defaultMode: keep
    names:
      # 删除 ClientUserName 字段
      ClientUsername: drop
    headers:
      # 默认保留所有 headers
      defaultMode: keep
      names:
        # 隐藏 User-Agent header 值
        User-Agent: redact
        # 删除 Authorization header 值
        Authorization: drop
    queryParameters:
      # 删除所有查询参数
      defaultMode: drop
toml
[accessLog]
  format = "json"

  [accessLog.filters]
    statusCodes = [ "200", "300-302" ]
    retryAttempts = true
    minDuration = "10ms"

  [accessLog.fields]
    defaultMode = "keep"

    [accessLog.fields.names]
      ClientUsername = "drop"

    [accessLog.fields.headers]
      defaultMode = "keep"

      [accessLog.fields.headers.names]
        User-Agent = "redact"
        Authorization = "drop"

    [accessLog.fields.queryParameters]
      defaultMode = "drop"

配置选项

字段描述默认值必填
accesslog.filePath访问日志文件路径。
accesslog.dualOutput即使配置了 OTLP,也强制使用 Stdio 日志记录。false
accesslog.format日志格式:common(Traefik 扩展 CLF)、genericCLF(标准 CLF)或 json。"common"
accesslog.bufferingSize异步写入日志时在内存中保留的日志行数。0
accesslog.addInternals启用内部资源的访问日志。false
accesslog.filters.statusCodes限制为指定状态码范围的请求。[]
accesslog.filters.retryAttempts至少发生一次重试时保留访问日志。false
accesslog.filters.minDuration保留请求耗时超过指定时长的访问日志。0
accesslog.fields.defaultMode访问日志字段的默认模式(keep、redact 或 drop)。keep
accesslog.fields.names在访问日志中显示的字段列表(格式 name:mode)。[]
accesslog.fields.headers.defaultModeheaders 的默认模式。drop
accesslog.fields.headers.names在访问日志中显示的 headers 列表。[]
accesslog.fields.queryParameters.defaultMode查询参数的默认模式(keep 或 drop)。keep

OpenTelemetry

Traefik 支持 OpenTelemetry 访问日志记录。

yaml
experimental:
  otlpLogs: true

accesslog:
  # 在 OTEL 日志记录旁边保留 Stdio 日志
  dualOutput: true
  otlp:
    http:
      endpoint: https://collector:4318/v1/logs
      headers:
        Authorization: Bearer auth_asKXRhIMplM7El1JENjrotGouS1LYRdL

访问日志的 OTLP 配置选项与日志相同(service name、resource attributes、http/grpc endpoint、TLS 等)。

日志格式

Traefik CLF 格式字段

Traefik 提供的默认格式:

<remote_IP_address> - <client_user_name_if_available> [<timestamp>]
"<request_method> <request_path> <request_protocol>" <HTTP_status> <content-length>
"<request_referrer>" "<request_user_agent>" <number_of_requests_received_since_Traefik_started>
"<Traefik_router_name>" "<Traefik_server_URL>" <request_duration_in_ms>ms

通用 CLF 格式字段

<remote_IP_address> - <client_user_name_if_available> [<timestamp>]
"<request_method> <request_path> <request_protocol>" <HTTP_status> <content-length>
"<request_referrer>" "<request_user_agent>"

JSON 格式字段

JSON 格式下可用的字段包括:StartUTCStartLocalDurationRouterNameServiceNameServiceURLServiceAddrClientAddrClientHostClientPortClientUsernameRequestAddrRequestHostRequestPortRequestMethodRequestPathRequestProtocolRequestSchemeRequestLineRequestContentSizeOriginDurationOriginContentSizeOriginStatusOriginStatusLineDownstreamStatusDownstreamStatusLineDownstreamContentSizeRequestCountGzipRatioOverheadRetryAttemptsTLSVersionTLSCipherTLSClientSubjectKubernetesIngressNamespaceKubernetesIngressNameKubernetesServiceNameKubernetesServicePort

日志轮转

收到 USR1 信号时,Traefik 关闭并重新打开其日志文件(假设已配置)。这允许由外部程序(如 logrotate)轮转和处理日志。

警告

由于 Windows 缺少 USR 信号,这在 Windows 上不起作用。

时区

默认情况下,Traefik 以 UTC 时间记录每条日志行的时间戳。

可以通过在环境中进行以下配置来配置 Traefik 使用特定时区:

  1. /etc/localtime/usr/share/zoneinfo 提供时区数据(根据你的发行版),或设置 TZ 环境变量为所需的时区。

  2. 通过删除名为 StartUTC 的字段来指定 StartLocal 字段(在默认的通用日志格式 (CLF) 和 JSON 中都可用):accesslog.fields.names.StartUTC=drop

使用 Docker Compose 的示例:

yaml
services:
  traefik:
    image: traefik:v3.7
    environment:
      - TZ=US/Alaska
    command:
      - --accesslog.fields.names.StartUTC=drop
      - --providers.docker
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为其添加企业级 API 网关能力或获取 Traefik OSS 的商业支持。

基于 MIT 协议发布