implant traefik-accesslog

Configura o access log do Traefik no formato que o auto-ban le, com permissao restrita e rotacao do arquivo onde ele realmente mora no host.

Uso

implant traefik-accesslog [OPTIONS]

Flags

Flag Descricao
(nenhuma) Status: ligado/desligado, formato, addInternals, query string, arquivo no host, permissao e rotacao
--enable Liga o access log ou, se ja estiver ligado, acrescenta o que falta ao bloco existente
--force Com --enable: troca valores escritos explicitamente pelo operador (format: common, addInternals: false) (v2.61.0+)
--to file|stdout Com --enable, ao ligar: file (padrao, /var/log/traefik montado no host) ou stdout (sem mount: o Docker guarda o log e o auto-ban le de la) (v2.62.0+)
--status all|faixas Com --enable: o que registrar. all inclui 2xx; faixas como 200-299,400-599. Padrao ao ligar: 400-599; num bloco existente so muda quando passado (v2.62.0+)
--yes, -y Com --enable/--disable: aplica sem perguntar, para automacao sem terminal. Sem ela e sem TTY, a confirmacao e recusada e nada muda (v2.61.1+)
--disable Desabilitar access log
--fix-perms Apenas logrotate e permissao. Idempotente, sem prompt, sem tocar no traefik.yml e sem reiniciar o Traefik
--dry-run Mostra o plano sem aplicar

Exemplos

implant traefik-accesslog                         # status
sudo implant traefik-accesslog --enable --dry-run # plano
sudo implant traefik-accesslog --enable
sudo implant traefik-accesslog --fix-perms
sudo implant traefik-accesslog --fix-perms --dry-run -o json
sudo implant traefik-accesslog --disable

Requisitos

  • Traefik instalado e configurado no servidor
  • traefik.yml no caminho padrao (config por linha de comando ou TOML nao e editada: o implant mostra a flag/chave a acrescentar)

Quando nao da para montar o diretorio de log (v2.62.0+)

O volume /var/log/traefik so entra por docker-compose. Em Traefik criado por docker run ou por outra ferramenta, o --enable recusa sem alterar nada e sugere:

  • --to stdout: sem mount e sem recriar o container (so reinicia o Traefik). O Docker guarda o log no host e o auto-ban le de la. A rotacao passa a ser a do log do Docker: confira o max-size do container (--log-opt max-size=50m --log-opt max-file=5);
  • montar -v /var/log/traefik:/var/log/traefik onde o container e criado e rodar o --enable de novo;
  • passar o container para um orquestrador que gerencie o Traefik.

Quando o traefik.yml e gerado por um orquestrador a partir de um template, o implant nao o edita (o proximo deploy desfaria a mudanca). Desde a v2.64.0, com o orquestrador que tem a opcao de access log no template, o --enable pede a ele o redeploy (com --status 400-599 ou all), confere o resultado e cuida do logrotate; se o novo Traefik falha, o orquestrador devolve o anterior e o JSON diz se houve volta. Sem essa opcao, o --enable recusa e mostra o comando.

Com mais de um Traefik no host, o comando recusa sem indicacao (traefik_ambiguous, uma sugestao por instancia). Indique com --traefik <container>, --for-container <app> (o Traefik que roteia para o app) ou IMPLANT_TRAEFIK_CONTAINER=<nome> (v2.65.0+).

Access log desligado

Antes de gravar, o implant confere se consegue montar /var/log/traefik no container. O volume so entra por docker-compose; em container criado por outra ferramenta (docker run, orquestrador com manifesto proprio) o --enable recusa sem alterar nada, com o motivo e codigo de saida 1 (v2.61.2+). Se o volume ou o restart falharem depois de gravar, o traefik.yml volta ao original. No fim, ele confere que o Traefik ficou de pe e que o arquivo de log apareceu no host (traefik_up, log_written no JSON).

O --enable grava o bloco do implant: formato JSON, so 4xx/5xx, headers sensiveis fora, addInternals: true no Traefik 3 e a query string fora do log no Traefik que aceita. Monta o diretorio de log se faltar, instala o logrotate e reinicia o Traefik.

Access log ja ligado (v2.61.0+)

O --enable acrescenta so o que falta, sem reescrever o bloco do operador — comentarios, ordem e os demais campos ficam (edicao por linha, conferida pelo parser; forma que nao da para editar com seguranca, como accessLog: {…} inline, e relatada e nao tocada):

Falta Quando entra Por que
format: json bloco sem format (o padrao do Traefik e texto) o sinal traefik_http do auto-ban so le JSON
addInternals: true Traefik >= 3 sem ela o 403 da guarda do `traefik-edge` (noop@internal) nao e logado e o auto-ban nao ve o scanner
fields.queryParameters.defaultMode: drop Traefik >= 3.6.18 / 3.7.2 token ou credencial na query nao vai para o disco

Tudo numa gravacao so: plano na tela (e no --dry-run, que nao grava nem reinicia), confirmacao, backup em /var/lib/implant/backups/, um restart do Traefik e conferencia de que ele voltou — se nao voltar, o arquivo original e restaurado e o Traefik reiniciado de novo.

Nunca grava: addInternals no Traefik 2 (ele nao sobe com a chave) nem com versao nao identificada (avisa). Valor escrito explicitamente pelo operador (format: common, addInternals: false) so muda com --force. Em Traefik anterior a 3.6.18 / 3.7.2 a chave de query nao e escrita e o implant check pede a atualizacao do Traefik.

Onde o log mora no host (v2.61.0+)

O caminho vem dos mounts do container (docker inspect): bind ou volume nomeado (/var/lib/docker/volumes/<nome>/_data), o mount mais especifico que cobre o filePath. E esse diretorio que o logrotate cobre e onde a permissao 0640 e aplicada. Log sem mount no host (so dentro do container) ou no stdout aparece no status e no check; se o arquivo no host nao for o que o auto-ban le, o status avisa.

Rotacao

/etc/logrotate.d/traefik: diario, 7 dias, maximo 50 MB, create 0640 root adm, e postrotate mandando USR1 ao container detectado (v2.61.0+; antes o nome era fixo). USR1 para o container errado deixa o Traefik escrevendo no arquivo rotacionado: o access.log novo fica vazio e o auto-ban para de ver.

Um logrotate existente e corrigido pelo --enable, --fix-perms e fix --auto, com backup e sem restart do Traefik:

  • create aberto (bit de outros ou escrita de grupo) vira create 0640 root adm;
  • nome do container no USR1;
  • o padrao antigo /var/log/traefik/*.log passa a apontar para o diretorio real quando o log esta em outro lugar (padrao escrito pelo operador nao e tocado).

O --enable instala o logrotate que faltar, salvo se outro arquivo de /etc/logrotate.d ja cobrir o diretorio. Arquivos de log com modo aberto viram 0640 grupo adm; o diretorio perde o que excede 0755; nada que ja esteja mais restrito e afrouxado.

Em JSON (envelope traefik-accesslog.fix-perms): antes/depois do logrotate (patterns_before/patterns_after, signal_before/signal_after/signal_expected, covers_dir), location, dir.path e restarted_traefik: false. Sai com codigo 1 se alguma escrita falhar.

Saida JSON do `--enable` / `--disable` (v2.61.1+)

Com -o json o stdout e so o envelope (o texto humano vai para o stderr). Comandos traefik-accesslog.enable e traefik-accesslog.disable, com o mesmo formato no --dry-run e na aplicacao:

Campo Significado
result applied, unchanged, dry_run, cancelled, failed, manual (config por linha de comando: o implant so aponta), unsupported (labels), not_found
mode install (grava o bloco do implant), complete (completa o bloco do operador), remove (--disable) ou null
container, config_path Traefik detectado e o traefik.yml
added[] {key, value}: chaves acrescentadas (ou que seriam, em dry-run)
replaced[] {key, from, to}: valores do operador trocados pelo --force
block install: o YAML acrescentado
adds_log_volume install sem mount do log: acrescenta o volume e recria o container
restart_planned, restarted restart previsto / feito
backup backup do traefik.yml
restored_original, traefik_up o Traefik nao voltou com a config nova e o original foi restaurado; o Traefik ficou de pe no fim (null: nao se aplica)
logrotate action (created, would_create, exists, covered, unavailable, failed, none), path, pattern, signal_container
perms o mesmo objeto do --fix-perms
destination, status_filter, docker_log file ou stdout; filtro em vigor; com stdout, o log do Docker (driver, path, max_size, max_file) (v2.62.0+)
warnings[], errors[] o que nao sera feito e por que; falhas
failure code estavel, reason e suggestions[] (id, title, detail, command, available): o motivo e as saidas, para um console mostrar ao operador (v2.62.0+)

Em falha: success: false, error com os erros e codigo de saida 1. Fluxo tipico de automacao: --enable --dry-run -o json para mostrar o plano, confirmacao do operador, --enable --yes -o json para aplicar.

O estado do access log (formato, addInternals, query, rotacao, permissao) fica nos itens Access log do Traefik: … do implant check -o json.

Itens do `check`

Modulo traefik_accesslog: permissao, rotacao, query, formato e addInternals. Os de formato e addInternals saem como Fail com o comando implant traefik-accesslog --enable; o fix --auto corrige permissao e rotacao e nao reinicia o Traefik por formato nem addInternals.

Ao desabilitar

  • Remove a secao accessLog do traefik.yml
  • Reinicia o Traefik para aplicar a alteracao

Codigos de Saida

Codigo Significado
0 Configuracao aplicada com sucesso
1 Erro (Traefik nao encontrado ou configuracao invalida)